GCC और g ++ बूटस्ट्रैप कैसे हैं?


185

यह थोड़ी देर के लिए मुझे गुस्सा दिला रहा है। जीसीसी और जी ++ कैसे खुद को संकलित करते हैं?

मैं अनुमान लगा रहा हूं कि हर संशोधन पहले से निर्मित संशोधन के साथ संकलित हो जाता है। क्या ये सच है? और अगर यह है, तो क्या इसका मतलब है कि सबसे पुराने जी ++ और जीसीसी संस्करण विधानसभा में लिखे गए थे?


13
प्रत्येक संशोधन अंततः स्वयं द्वारा संकलित किया जा सकता है। :)
मार्टिन हेनिंग्स

4
यह पढ़ना दिलचस्प है अगर आप यह देखना चाहते हैं कि पहला संकलक कैसे आया।
पार्कोव्स्की

1
@parkovski लिंक मृत है?
नुबेक

लिंक अंतिम बार जून 04, 2016 को देखा गया: web.archive.org/web/20160604035203/homepage.ntlworld.com/…
akraf

जवाबों:


175

जीसीसी का सबसे पुराना संस्करण एक और सी संकलक का उपयोग करके संकलित किया गया था, क्योंकि जब इसे लिखा गया था, तो अन्य थे। बहुत पहले C कंपाइलर कभी (ca. 1973, IIRC) को या तो PDP-11 असेंबली में लागू किया गया था , या B प्रोग्रामिंग लैंग्वेज में, जिसने इसे पूर्व दिया था, लेकिन किसी भी स्थिति में B कंपाइलर असेंबली में लिखा गया था।इसी तरह, पहले C ++ कंपाइलर (CPre / Cfront , 1979-1983) संभवतः C में पहले लागू किए गए थे, फिर C ++ में फिर से लिखे गए।

जब आप GCC या किसी अन्य सेल्फ-होस्टिंग कंपाइलर का निर्माण करते हैं, तो बिल्डिंग का पूरा क्रम होता है:

  1. मौजूदा C कंपाइलर के साथ GCC का नया संस्करण बनाएँ
  2. आपके द्वारा अभी बनाए गए जीसीसी के नए संस्करण को फिर से बनाएं
  3. (वैकल्पिक) सत्यापन उद्देश्यों के लिए चरण 2 को दोहराएं।

इस प्रक्रिया को बूटस्ट्रैपिंग कहा जाता है । यह संकलक की खुद की क्षमता का परीक्षण करता है और यह सुनिश्चित करता है कि परिणामस्वरूप संकलक उन सभी अनुकूलन के साथ बनाया गया है जिसे वह स्वयं लागू करता है।

EDIT : ड्रू डोरमैन, टिप्पणियों में, C ++ के शुरुआती कार्यान्वयन के बज़्ने स्ट्रॉस्ट्रुप के खाते की ओर इशारा करता है । इसे C ++ में लागू किया गया था लेकिन Stroustrup ने C ++ से C तक एक "प्रीप्रोसेसर" कहा है; अपनी परिभाषा के अनुसार पूर्ण संकलक नहीं, लेकिन फिर भी C ++ को C में बूटस्ट्रैप किया गया था।


19
बूटस्ट्रैप बिल्ड प्रक्रिया का 3-चरण संस्करण वास्तव में सत्यापन के लिए है: कंपाइलर का उपयोग स्वयं के परीक्षण मामले के रूप में किया जाता है। [अन्य] के साथ संकलित जीसीसी को समान परिणाम (समान बायनेरिज़, छूट वाले मैक्रोज़ जैसे __DATE__और __TIME__जो समान कंपाइलर के चालान के बीच भी भिन्न होते हैं ) का उत्पादन करना चाहिए क्योंकि जीसीसी [अन्य] के साथ संकलित जीसीसी के साथ संकलित किया जाता है - यदि नहीं, तो वह बग है, और 3-स्टेज बूटस्ट्रैप बिल्ड को पकड़ने के लिए डिज़ाइन किया गया है।
pmdj

19
@pmjordan: "यदि नहीं, तो यह एक बग है" या, कम संभावना है, पेश किए जाने की प्रक्रिया में एक कुटिल पिछले दरवाजे ("ट्रस्टिंग ट्रस्ट पर विचार")।
स्टीव जेसोप

12
@ स्लेसके: यह सच नहीं है। चरण 2 के बाइनरी आउटपुट को चरण 3 के बाइनरी आउटपुट के समान होना चाहिए, अन्यथा कहीं एक बग है। इसका कारण यह है जैसा कि pmjordan कहता है: NewCompiler1 और NewCompiler2 समान स्रोत वाले प्रोग्राम हैं (NewCompiler)। उन्हें समान इनपुट (न्यूकमपाइलर के लिए स्रोत) दिया जाता है। इसलिए वे समान आउटपुट का उत्पादन करेंगे, चाहे वह कोई भी संकलक हो, जिसे वे स्वयं संकलित करते थे (इस मामले में, NewCompiler1 को OldCompiler के साथ संकलित किया गया था, और NewCompiler2 को NewCompiler1 के साथ संकलित किया गया था)। अर्थात्, NewCompiler2 और NewCompiler3 द्विआधारी समान हैं।
स्टीव जेसोप

12
मैंने कभी सोचा है: क्या होगा अगर हम सभी सी संकलक बायनेरिज़ खो गए? और खरोंच से बूटस्ट्रैप करना पड़ा? यह है कि मैं इसके बारे में कैसे जाऊंगा: टिनी सी कंपाइलर है (जो वास्तव में लिनक्स कर्नेल को संकलित कर सकता है, इसलिए यह पूरी तरह से पूर्ण है)। यह सभी C स्रोत फाइलें हैं, जिसमें टिप्पणियों सहित कोड की मात्र 30k लाइनें हैं। हालांकि यह भी एक बहुत कुछ प्रयास था, कोई है जो समझता है कि सी स्रोतों से सीख सकता है, बाइनरी आउटपुट कैसे उत्पन्न करें और हाथ से टीसीसी स्रोतों को "संकलित करें" (मैं वास्तव में यहां पंच कार्ड के बारे में सोच रहा हूं)। फिर उस के साथ TCC को recompile करें और इसे GCC या समान बूटस्ट्रैप के लिए उपयोग करें।
डेटेनवॉल्फ

11
@datenwolf: ऐसा कुछ, हाँ। यदि हम मान सकते हैं कि हमने सभी सी संकलक बायनेरिज़ खो दिए हैं, लेकिन हमारे पास अभी भी एक असेंबलर है, तो हम एक असेंबलर प्रोग्राम TinyTinyC लिख सकते हैं। यह TinyC की तुलना में कम सुविधा पूर्ण C कंपाइलर होगा: हमें GCC या लिनक्स कर्नेल को संकलित करने में सक्षम होने की आवश्यकता नहीं है, हमें केवल TinyC संकलित करने में सक्षम होने की आवश्यकता है। फिर इसे TinyC के स्रोत पर चलाएं, जो हमें लिनक्स (और उम्मीद है कि glibc और GCC) को संकलित करने में सक्षम C संकलक देता है और हम व्यवसाय में हैं। यदि हमारे पास एक कोडांतरक भी नहीं है, तो हम पहले उनमें से एक को बूटस्ट्रैप करेंगे, यह एक सी संकलक की तुलना में आसान है।
स्टीव जेसप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.