बूटस्ट्रैपिंग (संकलक)

कंप्यूटर विज्ञान में, बूटस्ट्रैपिंग एक स्व-होस्टिंग ([[संकलक)]]कंपाइलर) बनाने की तकनीक है। सेल्फ-कंपाइलिंग कंपाइलर - यानी, एक कंपाइलर (या असेंबली लैंग्वेज#असेंबलर) जिसे सोर्स प्रोग्रामिंग भाषा में लिखा जाता है जिसे वह कंपाइल करना चाहता है। कंपाइलर का प्रारंभिक कोर संस्करण ("बूटस्ट्रैप कंपाइलर") एक अलग भाषा में उत्पन्न होता है (जो असेंबली भाषा हो सकती है); भाषा के इस न्यूनतम उपसमुच्चय का उपयोग करके संकलक के क्रमिक विस्तारित संस्करण विकसित किए गए हैं। स्व-संकलन संकलक को संकलित करने की समस्या को संकलक डिजाइन में मुर्गी या अंडा|चिकन-या-अंडे की समस्या कहा गया है, और बूटस्ट्रैपिंग इस समस्या का समाधान है। बुनियादी, ALGOL, C (प्रोग्रामिंग लैंग्वेज), C Sharp (प्रोग्रामिंग लैंग्वेज) | C#, D (प्रोग्रामिंग लैंग्वेज), पास्कल (प्रोग्रामिंग भाषा), PL/I, हास्केल, मोडुला के लिए कंपाइलर सहित कई प्रोग्रामिंग लैंग्वेज के लिए कई कंपाइलर बूटस्ट्रैप्ड हैं। -2, ओबेरॉन (प्रोग्रामिंग भाषा), OCaml, सामान्य लिस्प, स्कीम (प्रोग्रामिंग लैंग्वेज), जाओ (प्रोग्रामिंग भाषा), जावा (प्रोग्रामिंग भाषा), अमृत ​​​​(प्रोग्रामिंग भाषा), जंग (प्रोग्रामिंग भाषा), पायथन (प्रोग्रामिंग लैंग्वेज), स्काला (प्रोग्रामिंग भाषा), निम (प्रोग्रामिंग भाषा), एफिल (प्रोग्रामिंग लैंग्वेज), टाइपप्रति, वाला (प्रोग्रामिंग लैंग्वेज), ज़िग (प्रोग्रामिंग भाषा) और बहुत कुछ।

प्रक्रिया
एक विशिष्ट बूटस्ट्रैप प्रक्रिया तीन या चार चरणों में काम करती है:
 * स्टेज 0: बूटस्ट्रैप कंपाइलर के साथ काम करने के लिए एक वातावरण तैयार करना। यहीं पर बूटस्ट्रैप कंपाइलर की सोर्स लैंग्वेज और आउटपुट लैंग्वेज को चुना जाता है। एक नंगे मशीन के मामले में (जहां किसी भी भाषा के लिए कोई संकलक मौजूद नहीं है) स्रोत और आउटपुट को बाइनरी मशीन कोड के रूप में लिखा जाता है, या लक्ष्य के अलावा किसी अन्य मशीन पर क्रॉस कंपाइलर द्वारा बनाया जा सकता है। अन्यथा, बूटस्ट्रैप कंपाइलर को प्रोग्रामिंग भाषाओं में से एक में लिखा जाना है जो लक्ष्य मशीन पर मौजूद है, और वह कंपाइलर कुछ ऐसा उत्पन्न करेगा जो लक्ष्य पर निष्पादित हो सकता है, जिसमें उच्च स्तरीय प्रोग्रामिंग भाषा, एक असेंबली भाषा, एक वस्तु शामिल है। फ़ाइल, या मशीन कोड भी।
 * स्टेज 1: बूटस्ट्रैप कंपाइलर तैयार किया जाता है। यह कंपाइलर अपने स्रोत को एक प्रोग्राम में अनुवाद करने के लिए पर्याप्त है जिसे लक्षित मशीन पर निष्पादित किया जा सकता है। इस बिंदु पर, बूटस्ट्रैप कंपाइलर द्वारा परिभाषित भाषा का उपयोग करके आगे का विकास किया जाता है, और चरण 2 शुरू होता है।
 * स्टेज 2: बूटस्ट्रैप कंपाइलर द्वारा एक पूर्ण कंपाइलर तैयार किया जाता है। यह आमतौर पर आवश्यकतानुसार चरणों में किया जाता है, उदा। भाषा के संस्करण X के लिए संकलक, संस्करण X+1 से सुविधाओं को संकलित करने में सक्षम होगा, लेकिन वह संकलक वास्तव में उन सुविधाओं का उपयोग नहीं करता है। एक बार इस कंपाइलर का परीक्षण हो जाने के बाद और खुद को संकलित कर सकता है, अब संस्करण X + 1 सुविधाओं का उपयोग कंपाइलर के बाद के रिलीज द्वारा किया जा सकता है।
 * स्टेज 3: एक फुल कंपाइलर स्टेज 2 फुल कंपाइलर द्वारा तैयार किया जाता है। यदि अधिक सुविधाओं को जोड़ा जाना है, तो बूटस्ट्रैप कंपाइलर की जगह वर्तमान चरण 3 पूर्ण संकलक के साथ, चरण 2 पर काम फिर से शुरू होता है।

दो चरणों के आउटपुट की तुलना करने के लिए पूर्ण संकलक दो बार बनाया गया है। यदि वे भिन्न हैं, तो या तो बूटस्ट्रैप या पूर्ण संकलक में एक बग है।

लाभ
कंपाइलर को बूटस्ट्रैप करने के निम्नलिखित फायदे हैं:
 * यह संकलित की जा रही भाषा का एक गैर-तुच्छ परीक्षण है, और यह अपने कुत्ते के भोजन को खाने का एक रूप है।
 * कंपाइलर डेवलपर्स और बग रिपोर्टर्स को केवल संकलित की जा रही भाषा जानने की जरूरत है।
 * संकलित की जा रही उच्च-स्तरीय भाषा में संकलक विकास किया जा सकता है।
 * कंपाइलर के बैक-एंड में सुधार न केवल सामान्य-उद्देश्य वाले कार्यक्रमों में बल्कि स्वयं कंपाइलर में भी सुधार करता है।
 * यह एक व्यापक स्थिरता जाँच है क्योंकि इसे अपने स्वयं के ऑब्जेक्ट कोड को पुन: पेश करने में सक्षम होना चाहिए।

ध्यान दें कि इनमें से कुछ बिंदु मानते हैं कि भाषा रनटाइम सिस्टम भी उसी भाषा में लिखा गया है।

तरीके
यदि किसी को भाषा X में लिखी गई भाषा X के लिए एक कंपाइलर को संकलित करने की आवश्यकता है, तो यह मुद्दा है कि पहले कंपाइलर को कैसे संकलित किया जा सकता है। अभ्यास में उपयोग की जाने वाली विभिन्न विधियों में शामिल हैं:


 * भाषा X के लिए भाषा Y में एक दुभाषिया (कंप्यूटिंग) या कंपाइलर को लागू करना। निकोलस विर्थ ने बताया कि उन्होंने फोरट्रान में पहला पास्कल प्रोग्रामिंग भाषा कंपाइलर लिखा था।
 * X के लिए एक अन्य दुभाषिया या संकलक पहले से ही दूसरी भाषा Y में लिखा जा चुका है; इस प्रकार योजना (प्रोग्रामिंग भाषा) को अक्सर बूटस्ट्रैप किया जाता है।
 * कंपाइलर के पहले के संस्करण X के एक सबसेट में लिखे गए थे जिसके लिए कुछ अन्य कंपाइलर मौजूद थे; इस प्रकार जावा (प्रोग्रामिंग भाषा), हास्केल (प्रोग्रामिंग भाषा) के कुछ सुपरसेट, और शुरुआती फ़्री पास्कल कंपाइलर बूटस्ट्रैप किए गए हैं।
 * गैर-मानक भाषा एक्सटेंशन या वैकल्पिक भाषा सुविधाओं का समर्थन करने वाला एक कंपाइलर उन एक्सटेंशन और सुविधाओं का उपयोग किए बिना लिखा जा सकता है, ताकि इसे उसी आधार भाषा का समर्थन करने वाले दूसरे कंपाइलर के साथ संकलित किया जा सके, लेकिन एक्सटेंशन और सुविधाओं का एक अलग सेट। C++ कंपाइलर बजना के मुख्य भाग C++ के एक सबसेट में लिखे गए थे जिन्हें g++ और Microsoft Visual C++ दोनों द्वारा संकलित किया जा सकता है। कुछ GCC एक्सटेंशन के साथ उन्नत सुविधाएँ लिखी गई हैं।
 * एक्स के लिए कंपाइलर किसी अन्य आर्किटेक्चर से क्रॉस-संकलन है जहां एक्स के लिए एक कंपाइलर मौजूद है; इस प्रकार सी (प्रोग्रामिंग भाषा) के लिए कंपाइलर आमतौर पर अन्य प्लेटफॉर्म पर पोर्ट किए जाते हैं। प्रारंभिक बूटस्ट्रैप के बाद फ्री पास्कल के लिए भी यही तरीका इस्तेमाल किया जाता है।
 * एक्स में कंपाइलर लिखना; फिर इसे स्रोत से हाथ से संकलित करना (संभवतः एक गैर-अनुकूलित तरीके से) और अनुकूलित कंपाइलर प्राप्त करने के लिए कोड पर चल रहा है। डोनाल्ड नुथ ने इसका इस्तेमाल अपने WEB साक्षर प्रोग्रामिंग सिस्टम के लिए किया।

स्रोत कोड में कंपाइलर्स को वितरित करने के तरीकों में कंपाइलर का एक पोर्टेबल बाईटकोड संस्करण प्रदान करना शामिल है, ताकि कंपाइलर को अपने साथ संकलित करने की प्रक्रिया को बूटस्ट्रैप किया जा सके। टी-आरेख इन संकलक बूटस्ट्रैप तकनीकों को समझाने के लिए उपयोग किया जाने वाला एक संकेतन है। कुछ मामलों में, एक सिस्टम पर चलने वाले एक जटिल कंपाइलर को प्राप्त करने का सबसे सुविधाजनक तरीका जिसमें बहुत कम या कोई सॉफ़्टवेयर नहीं है, इसमें कभी अधिक परिष्कृत असेंबलरों और कंपाइलर्स की एक श्रृंखला शामिल होती है।

इतिहास
असेंबलर खुद को बूटस्ट्रैप करने वाले पहले भाषा उपकरण थे।

ऐसा बूटस्ट्रैप प्रदान करने वाली पहली उच्च-स्तरीय भाषा 1958 में NELIAC थी। ऐसा करने वाली पहली व्यापक रूप से इस्तेमाल की जाने वाली भाषाएं 1961 में बरोज़ B5000 अल्गोल और 1962 में लिस्प प्रोग्रामिंग भाषा थीं।

हार्ट और लेविन ने 1962 में एमआईटी में एलआईएसपी में एक एलआईएसपी कंपाइलर लिखा, एक मौजूदा एलआईएसपी दुभाषिया के अंदर इसका परीक्षण किया। एक बार जब उन्होंने कंपाइलर को उस बिंदु तक सुधार लिया था जहां वह अपने स्वयं के स्रोत कोड को संकलित कर सकता था, तो यह स्व-होस्टिंग था।

"The compiler as it exists on the standard compiler tape is a machine language program that was obtained by having the S-expression definition of the compiler work on itself through the interpreter." यह तकनीक तभी संभव है जब एक दुभाषिया पहले से ही उसी भाषा के लिए मौजूद हो जिसे संकलित किया जाना है। यह इनपुट के रूप में अपने आप में एक प्रोग्राम चलाने की धारणा से सीधे उधार लेता है, जिसका उपयोग सैद्धांतिक कंप्यूटर विज्ञान में विभिन्न प्रमाणों में भी किया जाता है, जैसे कि सबूत की भिन्नता कि हॉल्टिंग समस्या अनिर्णीत है जो राइस के प्रमेय का उपयोग करती है।

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

यह भी देखें

 * सेल्फ-होस्टिंग (संकलक)|सेल्फ-होस्टिंग
 * आत्म दुभाषिया
 * अप्रत्यक्ष आत्म-संशोधन
 * समाधि आरेख
 * मेटाकंपलर