बूटस्ट्रैपिंग के लिए अभी भी बाहरी समर्थन की आवश्यकता होती है


96

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

  • एक अलग भाषा में एक प्रारंभिक संकलक लिखना।
  • विधानसभा में एक प्रारंभिक संकलक को हाथ से कोड करना, जो पहले के एक विशेष मामले जैसा लगता है

मेरे लिए, इनमें से कोई भी वास्तव में एक भाषा को इस अर्थ में बूटस्ट्रैपिंग नहीं लगता है कि उन्हें दोनों के बाहर समर्थन की आवश्यकता है। क्या वास्तव में अपनी भाषा में संकलक लिखने का कोई तरीका है?


मैं इस तरह की चीजों के साथ बहुत अनुभवी नहीं हूं, लेकिन मुझे लगता है कि प्रारंभिक संकलक को दूसरी भाषा में लिखना होगा। मैं काफी हद तक निश्चित है कि "बूटस्ट्रैपिंग", compilers के संदर्भ में, बस लिखने के लिए संदर्भित करता है कर रहा हूँ एक भाषा यह संकलित करने के लिए, नहीं लिख मतलब है में एक भाषा के लिए संकलक पहले भाषा यह संकलन करने के लिए होती है में भाषा के लिए संकलक।
jdd

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

जवाबों:


107

क्या वास्तव में अपनी भाषा में संकलक लिखने का कोई तरीका है?

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

यदि आप Yazzleof के लिए एक कंपाइलर बूटस्ट्रैप करने जा रहे थे , तो आप आमतौर पर शुरू में पूरी भाषा के लिए एक कंपाइलर नहीं लिखेंगे। इसके बजाय आप Yazzle-lite के लिए एक कंपाइलर लिखेंगे, Yazzleof का सबसे छोटा संभव उपसमुच्चय (ठीक है, कम से कम एक बहुत छोटा उपसमुच्चय)। फिर यज़ील-लाइट में, आप पूरी भाषा के लिए एक कंपाइलर लिखेंगे। (जाहिर है कि यह एक छलांग के बजाय पुनरावृत्त हो सकता है।) क्योंकि यज़ील-लाइट यज़ीलॉफ़ का एक उचित उपसमुच्चय है, अब आपके पास एक संकलक है जो खुद को संकलित कर सकता है।

बूटस्ट्रैपिंग के बारे में वास्तव में एक अच्छा राइटअप है जो संभव स्तर से सबसे कम स्तर (जो कि एक आधुनिक मशीन पर मूल रूप से एक हेक्स एडिटर है) से बूटस्ट्रैपिंग है , जिसका शीर्षक है बूटस्ट्रैपिंग कुछ भी नहीं । इसे https://web.archive.org/web/20061108010907/http://www.rano.org/bcompiler.html पर देखा जा सकता है ।


19

आपके द्वारा पढ़ा गया स्पष्टीकरण सही है। कम्पाइलर: सिद्धांत, तकनीक और उपकरण (ड्रैगन बुक) में इसकी चर्चा है :

  • भाषा Y में भाषा X के लिए एक कंपाइलर C1 लिखें
  • भाषा X में X के लिए संकलक C2 लिखने के लिए कंपाइलर C1 का उपयोग करें
  • अब C2 पूरी तरह से स्वयं की मेजबानी का माहौल है।

7

इस की एक सुपर दिलचस्प चर्चा यूनिक्स के सह-निर्माता केन थॉम्पसन के ट्यूरिंग अवार्ड व्याख्यान में है।

वह इसके साथ शुरू होता है:

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

और यह दिखाने के लिए आगे बढ़ता है कि उसने यूनिक्स सी कंपाइलर का एक संस्करण कैसे लिखा, जो उसे हमेशा पासवर्ड के बिना लॉग इन करने की अनुमति देगा, क्योंकि सी कंपाइलर लॉगिन प्रोग्राम को पहचान कर विशेष कोड में जोड़ देगा।

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


9
यह ऑफ-टॉपिक है .. दिलचस्प है, लेकिन भ्रमित करने वाला और सवाल का जवाब नहीं।
ब्लूशफ्ट

5

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

यह बूटस्ट्रैपिंग की परिभाषा है :

एक सरल प्रणाली की प्रक्रिया एक अधिक जटिल प्रणाली को सक्रिय करती है जो एक ही उद्देश्य को पूरा करती है।

EDIT: कंपाइलर बूटस्ट्रैपिंग पर विकिपीडिया लेख अवधारणा को मुझसे बेहतर बताता है।




3

जैसा कि मैं इसे समझता हूं, पहला लिस्प दुभाषिया निर्माण कार्यों और टोकन रीडर को हाथ से संकलन करके बूटस्ट्रैप किया गया था। बाकी दुभाषिया तब स्रोत से पढ़ा गया था।

आप मूल मैककार्थी पेपर, सिंबोलिक एक्सप्रेशंस के रिकर्सिव फंक्शंस और मशीन, भाग I द्वारा उनकी गणना को पढ़कर खुद के लिए जांच कर सकते हैं ।


जो कुछ भी 2 और 3 भागों में हुआ? ... मुझे कैसे ध्यान नहीं आया कि @inging ने मुझसे 3 साल पहले एक ही बात पोस्ट की थी? मैं दुआ हूँ। कम से कम मैंने पेपर (मदद से) जोड़ा।
लूसर ने

2

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


2

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

वास्तव में, मुझे लगता है कि लिस्प लगभग योग्य है। बाहर की जाँच करें अपने विकिपीडिया प्रविष्टि । लेख के अनुसार, Lisp eval फंक्शन को IBM कोड 704 पर मशीन कोड में लागू किया जा सकता है , जिसके साथ कम्पाइलर (लिस्प में ही लिखा गया) 1962 में MIT में आ रहा है ।


2

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

यह और कैसे काम करेगा? मुझे नहीं लगता कि यह वैचारिक रूप से भी संभव है अन्यथा नहीं।


4
पहले लिस्प कंपाइलर, कम से कम, एक मौजूदा लिस्प दुभाषिया का उपयोग करके बूटस्ट्रैप किया गया था । इसलिए दूसरी भाषा शब्दार्थ नहीं, बल्कि एक और भाषा कार्यान्वयन है।
केन

0

कुछ बूटस्ट्रैप किए गए कंपाइलर या सिस्टम दोनों स्रोत फॉर्म और ऑब्जेक्ट फॉर्म को उनके भंडार में रखते हैं:

  • ओसमल एक ऐसी भाषा है जिसमें एक बाईटेकोड दुभाषिया (यानी ओकेमेल बायटेकोड का एक कंपाइलर) और एक देशी कंपाइलर (x86-64 या एआरएम, आदि ... कोडांतरक) है। इसके svn रिपॉजिटरी में संकलक के स्रोत कोड (फाइलें */*.{ml,mli}) और बायटेकोड (फाइल boot/ocamlc) दोनों शामिल हैं । इसलिए जब आप इसका निर्माण करते हैं तो पहली बार इसके संकलित (संकलक के पिछले संस्करण) का उपयोग कर रहा होता है। बाद में ताजा संकलित बायटेकोड देशी संकलक को संकलित करने में सक्षम है। तो Ocaml svn रिपॉजिटरी में *.ml[i]सोर्स फाइल और boot/ocamlcबाईटेकोड फाइल दोनों हैं ।

  • जंग संकलक डाउनलोड (का उपयोग करते हुए wget, तो आप एक काम इंटरनेट कनेक्शन की आवश्यकता) ने अपने द्विआधारी के पिछले संस्करण में ही संकलित करने के लिए।

  • MELT GCC को अनुकूलित और विस्तारित करने के लिए एक लिस्प जैसी भाषा है । यह बूटस्ट्रैप किए गए अनुवादक द्वारा C ++ कोड में अनुवादित किया गया है। अनुवादक का उत्पन्न C ++ कोड वितरित किया जाता है, इसलिए svn रिपॉजिटरी में अनुवादक की *.meltस्रोत फाइलें और melt/generated/*.cc"ऑब्जेक्ट" दोनों फाइलें होती हैं।

  • J.Pitrat का CAIA कृत्रिम खुफिया तंत्र पूरी तरह से स्व-उत्पादक है। यह हजारों डेटा फ़ाइलों के संग्रह के साथ हजारों [A-Z]*.cउत्पन्न फ़ाइलों (एक उत्पन्न dx.hहेडर फ़ाइल के साथ) के संग्रह के रूप में उपलब्ध है _[0-9]*

  • कई स्कीम कंपाइलर भी बूटस्ट्रैप्ड हैं। स्कीम 48, चिकन योजना, ...

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