बूटस्ट्रैपिंग (संकलक)
कंप्यूटर विज्ञान में बूटस्ट्रैपिंग, स्व-होस्टिंग संकलक बनाने की तकनीक है। स्व-संकलकिंग संकलक - अर्थात, संकलक विधानसभा भाषा संहिताांतरक जिसे स्रोत प्रोग्रामिंग भाषा में लिखा जाता है, जिसे वह संकलक करना चाहता है। संकलक का प्रारंभिक कोर संस्करण "बूटस्ट्रैप संकलक" अलग भाषा में उत्पन्न होता है, जो विधानसभा भाषा हो सकती है। भाषा के इस न्यूनतम उपसमुच्चय का उपयोग करके संकलक के क्रमिक विस्तारित संस्करण विकसित किए गए हैं। स्व-संकलन संकलक को संकलित करने की समस्या को संकलक रचना में मुर्गी या अंडा की समस्या कहा गया है और बूटस्ट्रैपिंग इस समस्या का समाधान है।[1][2]आधारभूत, ऐल्गॉल, सी प्रोग्रामिंग भाषा, सी शार्प प्रोग्रामिंग भाषा सी, डी प्रोग्रामिंग भाषा, पास्कल (प्रोग्रामिंग भाषा), आईपीएल/आई, हास्केल, मोडुला के लिए संकलक सहित कई प्रोग्रामिंग भाषा के लिए कई संकलक बूटस्ट्रैप्ड हैं। -2, ओबेरॉन (प्रोग्रामिंग भाषा), ओकम्ल , सामान्य लिस्प, स्कीम (प्रोग्रामिंग भाषा), जाओ (प्रोग्रामिंग भाषा), जावा (प्रोग्रामिंग भाषा), अमृत (प्रोग्रामिंग भाषा), जंग (प्रोग्रामिंग भाषा), पायथन (प्रोग्रामिंग भाषा), स्काला (प्रोग्रामिंग भाषा), निम (प्रोग्रामिंग भाषा), एफिल (प्रोग्रामिंग भाषा), टाइपप्रति, वाला (प्रोग्रामिंग भाषा), ज़िग (प्रोग्रामिंग भाषा) और बहुत कुछ है।
प्रक्रिया
विशिष्ट बूटस्ट्रैप प्रक्रिया तीन या चार चरणों में कार्य करती है।[3][4][5]
- चरण 0: बूटस्ट्रैप संकलक के साथ कार्य करने के लिए वातावरण तैयार करना। यहीं पर बूटस्ट्रैप संकलक की स्रोत भाषा और आउटपुट भाषा को चुना जाता है। नंगे मशीन के स्थितियों में जहां किसी भी भाषा के लिए कोई संकलक उपस्तिथ नहीं है स्रोत और आउटपुट को द्विआधारी मशीन संहिता के रूप में लिखा जाता है। लक्ष्य के अतिरिक्त किसी अन्य मशीन पर क्रॉस संकलक द्वारा बनाया जा सकता है। अन्यथा, बूटस्ट्रैप संकलक को प्रोग्रामिंग भाषाओं में से में लिखा जाना है जो लक्ष्य मशीन पर उपस्तिथ है। वह संकलक कुछ ऐसा उत्पन्न करेगा जो लक्ष्य पर निष्पादित हो सकता है, जिसमें उच्च स्तरीय प्रोग्रामिंग भाषा, विधानसभा भाषा, वस्तु सम्मलित है। फ़ाइल या मशीन संहिता भी।
- चरण 1: बूटस्ट्रैप संकलक तैयार किया जाता है। यह संकलक अपने स्रोत को प्रोग्राम में अनुवाद करने के लिए पर्याप्त है जिसे लक्षित मशीन पर निष्पादित किया जा सकता है। इस बिंदु पर बूटस्ट्रैप संकलक द्वारा परिभाषित भाषा का उपयोग करके आगे का विकास किया जाता है और चरण 2 प्रारंभ होता है।
- चरण 2: बूटस्ट्रैप संकलक द्वारा पूर्ण संकलक तैयार किया जाता है। यह सामान्यतः आवश्यकतानुसार चरणों में किया जाता है। उदाहरण, भाषा के संस्करण X के लिए संकलक, संस्करण X+1 से सुविधाओं को संकलित करने में सक्षम होगा, किन्तु वह संकलक वास्तव में उन सुविधाओं का उपयोग नहीं करता है। बार इस संकलक का परीक्षण हो जाने के बाद और स्वयं को संकलित कर सकता है, अब संस्करण X + 1 सुविधाओं का उपयोग संकलक के बाद के रिलीज द्वारा किया जा सकता है।
- चरण 3: पूर्ण संकलक चरण 2 पूर्ण संकलक द्वारा तैयार किया जाता है। यदि अधिक सुविधाओं को जोड़ा जाना है, तो बूटस्ट्रैप संकलक की जगह वर्तमान चरण 3 पूर्ण संकलक के साथ, चरण 2 पर कार्य फिर से प्रारंभ होता है।
दो चरणों के आउटपुट की तुलना करने के लिए पूर्ण संकलक दो बार बनाया गया है। यदि वे भिन्न हैं, तो बूटस्ट्रैप पूर्ण संकलक में दोष है।[3]
लाभ
संकलक को बूटस्ट्रैप करने के निम्नलिखित लाभ हैं।[6][7]
- यह संकलित की जा रही भाषा का अ-तुच्छ परीक्षण है और यह अपने कुत्ते के भोजन को खाने का रूप है।
- संकलक डेवलपर्स और दोष संवाददाताओं को केवल संकलित की जा रही भाषा जानने की आवश्यकता है।
- संकलित की जा रही उच्च-स्तरीय भाषा में संकलक विकास किया जा सकता है।
- संकलक के बैक-एंड में सुधार न केवल सामान्य-उद्देश्य वाले कार्यक्रमों में जबकि स्वयं संकलक में भी सुधार करता है।
- यह व्यापक स्थिरता जाँच है, क्योंकि इसे अपने स्वयं के वस्तु संहिता को पुन: प्रस्तुत करने में सक्षम होना चाहिए।
ध्यान दें कि इनमें से कुछ बिंदु मानते हैं कि भाषा क्रम प्रणाली भी उसी भाषा में लिखा गया है।
विधियाँ
यदि किसी को भाषा X में लिखी गई भाषा X के लिए संकलक को संकलित करने की आवश्यकता है, तो यह विवाद है कि पहले संकलक को कैसे संकलित किया जा सकता है। अभ्यास में उपयोग की जाने वाली विभिन्न विधियों में सम्मलित हैं।
- भाषा X के लिए भाषा Y में दुभाषिया (कंप्यूटिंग) संकलक को लागू करना। निकोलस विर्थ ने बताया कि उन्होंने फोरट्रान में पहला पास्कल प्रोग्रामिंग भाषा संकलक लिखा था।[8]
- X के लिए अन्य दुभाषिया या संकलक पहले से ही दूसरी भाषा Y में लिखा जा चुका है, इस प्रकार योजना प्रोग्रामिंग भाषा को अधिकांशतः बूटस्ट्रैप किया जाता है।
- संकलक के पहले के संस्करण X के -उप-समूचय में लिखे गए थे जिसके लिए कुछ अन्य संकलक उपस्तिथ थे, इस प्रकार जावा प्रोग्रामिंग भाषा, हास्केल (प्रोग्रामिंग भाषा) के कुछ सुपरसेट और प्रारंभिक मुक्त पास्कल संकलक बूटस्ट्रैप किए गए हैं।
- अ-मानक भाषा विस्तार वैकल्पिक भाषा सुविधाओं का समर्थन करने वाला संकलक उन विस्तार और सुविधाओं का उपयोग किए बिना लिखा जा सकता है, जिससे इसे उसी आधार भाषा का समर्थन करने वाले दूसरे संकलक के साथ संकलित किया जा सके, किन्तु विस्तार और सुविधाओं का अलग सेट। सी++ संकलक बजना के मुख्य भाग सी++ के -उप-समूचय में लिखे गए थे जिन्हें जी++ और माइक्रोसॉफ्ट विजुअल सी++ दोनों द्वारा संकलित किया जा सकता है। कुछ जीसीसी विस्तार के साथ उन्नत सुविधाएँ लिखी गई हैं।
- एक्स के लिए संकलक किसी अन्य आर्किटेक्चर से क्रॉस-संकलन है, जहां एक्स के लिए संकलक उपस्तिथ है। इस प्रकार सी प्रोग्रामिंग भाषा के लिए संकलक सामान्यतः अन्य प्लेटफॉर्म पर पोर्ट किए जाते हैं। प्रारंभिक बूटस्ट्रैप के बाद मुक्त पास्कल के लिए भी यही विधि उपयोग किया जाता है।
- एक्स में संकलक लिखना, फिर इसे स्रोत से हाथ से संकलित करना। संभवतः अ-अनुकूलित विधियाँ और अनुकूलित संकलक प्राप्त करने के लिए संहिता पर चल रहा है। डोनाल्ड नुथ ने इसका उपयोग अपने वेब साक्षर प्रोग्रामिंग प्रणाली के लिए किया।
स्रोत संहिता में संकलनकर्ता को वितरित करने के विधियाँ में संकलक का पोर्टेबल बाईटसंहिता संस्करण प्रदान करना सम्मलित है, जिससे संकलक को अपने साथ संकलित करने की प्रक्रिया को बूटस्ट्रैप किया जा सके। टी-आरेख इन संकलक बूटस्ट्रैप तकनीकों को समझाने के लिए उपयोग किया जाने वाला संकेतन है।[7]कुछ स्थितियों में, प्रणाली पर चलने वाले जटिल संकलक को प्राप्त करने का सबसे सुविधाजनक विधि जिसमें बहुत कम कोई सॉफ़्टवेयर नहीं है। इसमें कभी अधिक परिष्कृत संहिताांतरकों और संकलनकर्ता की श्रृंखला सम्मलित होती है।[9]
इतिहास
संहिताांतरक स्वयं को बूटस्ट्रैप करने वाले पहले भाषा उपकरण थे।
ऐसा बूटस्ट्रैप प्रदान करने वाली पहली उच्च-स्तरीय भाषा 1958 में नेलियाक थी। ऐसा करने वाली पहली व्यापक रूप से उपयोग की जाने वाली भाषाएं 1961 में बरोज़ बी5000 अल्गोल और 1962 में लिस्प प्रोग्रामिंग भाषा थीं।
हार्ट और लेविन ने 1962 में एमआईटी में एलआईएसपी में एलआईएसपी संकलक लिखा, उपस्तिथा एलआईएसपी दुभाषिया के अंदर इसका परीक्षण किया। बार जब उन्होंने संकलक को उस बिंदु तक सुधार लिया था जहां वह अपने स्वयं के स्रोत संहिता को संकलित कर सकता था, तो यह स्व-होस्टिंग था।[10]
संकलक जैसा कि यह मानक संकलक टेप पर उपस्तिथ है, एक मशीनी भाषा का प्रोग्राम है, जिसे इंटरप्रेटर के माध्यम से कंपाइलर की S-अभिव्यक्ति परिभाषा द्वारा प्राप्त किया गया था।
— एआई मेमो 39[10]
यह तकनीक तभी संभव है जब दुभाषिया पहले से ही उसी भाषा के लिए उपस्तिथ हो जिसे संकलित किया जाना है। यह इनपुट के रूप में अपने आप में प्रोग्राम चलाने की धारणा से सीधे उधार लेता है, जिसका उपयोग सैद्धांतिक कंप्यूटर विज्ञान में विभिन्न प्रमाणों में भी किया जाता है, जैसे कि प्रमाण की भिन्नता कि हॉल्टिंग समस्या अनिर्णीत है जो राइस के प्रमेय का उपयोग करती है।
वर्तमान प्रयास
भरोसेमंद का आक्रमण और द्विआधारी विश्वसनीयता के खिलाफ विभिन्न आक्रमण के संबंध में सुरक्षा चिंताओं के कारण, कई परियोजनाएं न केवल स्रोत से बूटस्ट्रैपिंग के प्रयास को कम करने के लिए कार्य कर रही हैं। जबकि, सभी को उस स्रोत और निष्पादन योग्य अनुरूप को सत्यापित करने की अनुमति भी दे रही हैं। इनमें बूटस्ट्रैपेबल निर्माण प्रोजेक्ट सम्मलित है[11] और प्रतिलिपि प्रस्तुत करने योग्य परियोजना बनाता है।[12]
यह भी देखें
- स्व-होस्टिंग संकलक
- आत्म दुभाषिया
- अप्रत्यक्ष आत्म-संशोधन
- समाधि आरेख
- मेटाकंपलर
संदर्भ
- ↑ Reynolds, John H. (December 2003). "Bootstrapping a self-compiling compiler from machine X to machine Y". CCSC: Eastern Conference. Journal of Computing Sciences in Colleges. 19 (2): 175–181.
The idea of a compiler written in the language it compiles stirs up the old 'chicken-or-the-egg' conundrum: Where does the first one come from?
- ↑ Glück, Robert (2012). "Bootstrapping compiler generators from partial evaluators". In Clarke, Edmund; Virbitskaite, Irina; Voronkov, Andrei (eds.). Perspectives of Systems Informatics: 8th International Andrei Ershov Memorial Conference, PSI 2011, Novosibirsk, Russia, June 27 – July 1, 2011, Revised Selected Papers. Lecture Notes in Computer Science. Vol. 7162. Springer. pp. 125–141. doi:10.1007/978-3-642-29709-0_13.
Getting started presents the chicken-and-egg problem familiar from compiler construction: one needs a compiler to bootstrap a compiler, and bootstrapping compiler generators is no exception.
- ↑ 3.0 3.1 "Installing GCC: Building". GNU Project - Free Software Foundation (FSF).
- ↑ "rust-lang/rust: bootstrap". GitHub (in English).
- ↑ "Advanced Build Configurations — LLVM 10 documentation". llvm.org.
- ↑ Compilers and Compiler Generators: An Introduction With C++. Patrick D. Terry 1997. International Thomson Computer Press. ISBN 1-85032-298-8
- ↑ 7.0 7.1 "Compiler Construction and Bootstrapping" by P.D.Terry 2000. HTML Archived 2009-11-23 at the Wayback Machine. PDF Archived December 14, 2010, at the Wayback Machine.
- ↑ Niklaus Wirth. 2021. 50 years of Pascal. Commun. ACM 64, 3 (March 2021), 39–41. DOI:https://doi.org/10.1145/3447525
- ↑ "Bootstrapping a simple compiler from nothing" Archived March 3, 2010, at the Wayback Machine by Edmund GRIMLEY EVANS 2001
- ↑ 10.0 10.1 Template:साइट वेब
- ↑ "Bootstrappable builds". bootstrappable.org.
- ↑ "Reproducible Builds — a set of software development practices that create an independently-verifiable path from source to binary code". reproducible-builds.org.