C ++ में पहला C ++ कंपाइलर कैसे लिखा जा सकता है?


48

स्ट्रॉस्ट्रुप का दावा है कि Cfront, पहला C ++ कंपाइलर, C ++ ( Stroustrup FAQ ) में लिखा गया था ।

हालाँकि, यह कैसे संभव है कि पहला C ++ कंपाइलर C ++ में लिखा जाए?

संकलक बनाने वाले कोड को भी संकलित करने की आवश्यकता है, और इस प्रकार C ++ में पहला C ++ कंपाइलर नहीं लिखा जा सकता था, क्या ऐसा हो सकता है?


6
en.wikipedia.org/wiki/Cfront मुद्दे को थोड़ा कवर करता है।
15

जवाबों:


57

कुंजी यहीं है:

पहला C ++ कंपाइलर (Cfront) C ++ में लिखा गया था। इसे बनाने के लिए, मैंने पहली बार C को "C with Classes" -to-C प्रीप्रोसेसर के रूप में लिखा। "सी विद क्लासेस" एक सी बोली थी जो C ++ का तत्काल पूर्वज बन गया। उस प्रीप्रोसेसर ने "सी विद क्लासेस" कंस्ट्रक्शन (जैसे क्लासेस और कंस्ट्रक्टर्स) का सी। में अनुवाद किया। यह एक पारंपरिक प्रीप्रोसेसर था, जो भाषा के सभी को नहीं समझता था, सी कंपाइलर को करने के लिए अधिकांश प्रकार की जाँच को छोड़ दिया, और व्यक्तिगत अनुवाद किया। पूर्ण ज्ञान के बिना निर्माण करता है। मैंने तब "C with Classes" में Cfront का पहला संस्करण लिखा।

इसलिए Cfront का पहला संस्करण मध्यवर्ती भाषा में नहीं, बल्कि C ++ में लिखा गया था। सी में सीधे सी कंपाइलर और प्रीप्रोसेसर बनाने की क्षमता ने सी में कई नवाचारों (और बड़े पैमाने पर सुरक्षा छेद ) का नेतृत्व किया, इसलिए आप अपने नए प्रीप्रोसिटर को लिखते हैं जो आपके "सी के साथ सी" कोड को सीधे सी में बदल देता है (क्योंकि सीधे सी कर सकते हैं) कुछ भी) और फिर आप C ++ कंपाइलर लिखने के लिए "C with Classes" का उपयोग करें (ऐसा नहीं है कि आप इसे C में नहीं कर सकते हैं, बस थोड़ी देर लगेगी) और फिर आप उस C ++ कंपाइलर का उपयोग एक और अधिक कुशल / कम्पाइलर लिखने के लिए करते हैं सी ++। समझ गया?


5
चीजों के लिए मेरी पसंदीदा कहानियों में से एक का लिंक शामिल करने के लिए +1 जो किया जा सकता है (और नहीं करना चाहिए)।
१६:

3
संकलक वैध सी ++ कोड में लिखा गया था, लेकिन केवल कुछ पूर्ण सी ++ विशेषताओं का उपयोग किया गया था, जिन्हें "सी विद क्लासेस" प्रीप्रोसेसर द्वारा समर्थित किया गया था। इसने पूरी भाषा के सबसेट का उपयोग किया, इसलिए इसने परिणाम (Cfront का पहला कार्यशील संस्करण) भी संकलित किया। इस "बूटस्ट्रैप" कदम के प्रदर्शन के बाद, उन्हें शायद फिर से प्रीप्रोसेसर का उपयोग करने की आवश्यकता नहीं थी।
joeytwiddle

2
@jwernerny - मैंने हमेशा उस लेख को असंतोषजनक पाया है। वह सबसे कठिन और गैर-तुच्छ भाग पर चमकता है : "बग UNIX 'लॉगिन' कमांड में कोड से मेल खाएगा। प्रतिस्थापन कोड लॉगिन कमांड को गलत करेगा ताकि यह या तो एन्क्रिप्टेड पासवर्ड या किसी विशेष ज्ञात पासवर्ड को स्वीकार करे। " लेकिन यह कैसे किया जाएगा? क्या वास्तव में कभी इसका प्रदर्शन किया गया है?
5

3
"सी में कई नवाचारों (और बड़े पैमाने पर सुरक्षा छेद) का नेतृत्व किया": जहां तक ​​मुझे पता है कि इन चालों का उपयोग किसी भी भाषा में किया जा सकता है, न केवल सी में। इसलिए किसी भी अन्य भाषा में समान सुरक्षा छेद हो सकते हैं।
जियोर्जियो

2
@detly: यह अब तुच्छ लगता है, लेकिन 1983 में यह एक उपन्यास हमला था जिसे कार्यान्वयन विविधता की कमी के कारण व्यवहार्य बनाया गया था। हम तब से ही बायनेरिज़ पर अधिक भरोसा कर रहे थे, आंशिक रूप से क्योंकि स्रोत से सब कुछ संकलित करना अब की तुलना में बहुत बड़ा नियम था।
Blrfl

17

इसे बूटस्ट्रैप किया गया था। जैसे ही C ++ फीचर को cfront में जोड़ा गया, तब cfront उस बिंदु से उस सुविधा का उपयोग भी कर सकता है (लेकिन उस बहुत सुविधा को कार्यान्वित करने के लिए नहीं)। यह काम किया क्योंकि cfront में C ++ कोड को C कोड में बदलने की क्षमता थी। इसलिए यदि कुछ नया प्लेटफ़ॉर्म सामने आया, तो आप C ++ को C से C कनवर्ट करने के लिए किसी अन्य प्लेटफ़ॉर्म पर cfront का उपयोग कर सकते हैं, और फिर C से ऑब्जेक्ट कोड में संकलन समाप्त करने के लिए नए प्लेटफ़ॉर्म के C कंपाइलर का उपयोग कर सकते हैं।


9

मुझे लगता है कि बीएस इस सवाल का जवाब देता है:

पहला C ++ कंपाइलर (Cfront) C ++ में लिखा गया था। इसे बनाने के लिए, मैंने पहली बार C को "C with Classes" -to-C प्रीप्रोसेसर के रूप में लिखा। "सी विद क्लासेस" एक सी बोली थी जो C ++ का तत्काल पूर्वज बन गया। उस प्रीप्रोसेसर ने "सी विद क्लासेस" कंस्ट्रक्शन (जैसे क्लासेस और कंस्ट्रक्टर्स) का सी। में अनुवाद किया। यह एक पारंपरिक प्रीप्रोसेसर था, जो भाषा के सभी को नहीं समझता था, सी कंपाइलर को करने के लिए अधिकांश प्रकार की जाँच को छोड़ दिया, और व्यक्तिगत अनुवाद किया। पूर्ण ज्ञान के बिना निर्माण करता है।

मैंने तब "C with Classes" में Cfront का पहला संस्करण लिखा। Cfront एक पारंपरिक संकलक था जिसने C ++ स्रोत का सिंटैक्स और सिमेंटिक जाँच पूरी की। उसके लिए, इसमें एक पूर्ण पार्सर था, प्रतीक टेबल बनाए गए थे, और प्रत्येक वर्ग, फ़ंक्शन आदि का एक पूर्ण आंतरिक ट्री प्रतिनिधित्व बनाया था। इसने सी + + के आंतरिक ट्री प्रतिनिधित्व पर कुछ स्रोत स्तर का अनुकूलन भी किया था। सी का उत्पादन करने से पहले संस्करण। उत्पन्न C, किसी भी प्रकार की जाँच के लिए C पर निर्भर नहीं था। यह बस एक कोडांतरक के रूप में C का उपयोग करता है। परिणामस्वरूप कोड तेजी से अनियंत्रित था।

पहले उन्होंने सी में एक साधारण प्रीप्रोसेसर द्वारा कार्यान्वित "सी विद क्लासेस" नामक कुछ बनाया, यह मूल रूप से सी ++ था, लेकिन प्रीप्रोसेसर ने बहुत कम या कोई जाँच नहीं की। उन्होंने तब Cfront लिखने के लिए C ++ में अनुवादक के अधिक शक्तिशाली संस्करण को टाइप चेकिंग, प्रतीक तालिकाओं आदि के साथ पूरा करने के लिए उपयोग किया।


1
इसलिए मूल रूप से जब हम C ++ प्रोग्राम को संकलित करते हैं, तो यह C में परिवर्तित हो जाता है, फिर C में परिवर्तित होने के बाद, यह फिर से मशीन कोड में संकलित हो जाता है?
पेसियर

@Pacerier: मूल रूप से, हाँ, लेकिन अब मुझे नहीं लगता।
माइक डनलवे

मैं आपकी टिप्पणी को काफी नहीं समझता। क्या आपका मतलब है कि अब ऐसे कंपाइलर हैं जो दूसरे चरण को छोड़ देते हैं और बस C ++ स्रोत को ले जाते हैं और मशीन कोड को संकलित करते हैं?
पैसिफायर

7
@ स्पेसर: ठीक है, वे सीधे विधानसभा भाषा या मशीन कोड पर नहीं जाते हैं। आमतौर पर वे पहली बार एक मशीन-स्वतंत्र मध्यवर्ती प्रतिनिधित्व (ट्राइएबल्स या क्वाड्स) में जाते हैं और अनुकूलन के लिए विश्लेषण करते हैं। उसी से वे असेंबली या मशीन कोड जनरेट करते हैं। यदि आप संकलक डिजाइन (अहो और उलमान) पर एक किताब उठाते हैं, तो मुझे यकीन है कि आप इसे दिलचस्प पाएंगे।
माइक डनलैवी

1
यह ध्यान रखना महत्वपूर्ण है कि वह जिस C ++ का निर्माण कर रहा था, वह भी उस भाषा का एक अंश था जो अब मौजूद है। इसका कोई टेम्प्लेट नहीं था, कोई नई लाइब्रेरी नहीं थी, केवल C कास्टिंग का इस्तेमाल किया था और अगर मैं सही ढंग से याद करूं तो इसका कोई अपवाद नहीं था।
रोबोट

2

मैं इस जवाब को जोड़ दूंगा क्योंकि कोई जवाब इस पहलू को कवर नहीं करता है।

कोड को संकलित करने के लिए आपको तकनीकी रूप से सॉफ्टवेयर की आवश्यकता नहीं है। जब तक आपके पास आवश्यक संकलक विनिर्देश हैं तब तक आप वास्तविक संकलन मैन्युअल रूप से कर सकते हैं। यह नहीं है कि पहले C ++ कंपाइलर को कैसे संकलित किया गया था। मैं सिर्फ यह कह रहा हूं कि यह संभव है।

विधानसभा भाषा के साथ तुलना करें। जब वे शुरुआती दिनों में उपयोग किए गए थे, तो असेंबली कोड को मशीन कोड में बदलने के लिए कोई कोडांतरक सॉफ़्टवेयर नहीं थे। यह हाथ से किया गया था, लेकिन असेंबली भाषा ने प्रोग्रामर्स को बेहतर अवलोकन दिया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.