क्या मूल दुभाषिया से स्वतंत्र "बूटस्ट्रैप्ड" दुभाषिया बनाना संभव है?


21

विकिपीडिया के अनुसार , लेखन संकलक के संदर्भ में "बूटस्ट्रैपिंग" शब्द का अर्थ है :

कंप्यूटर विज्ञान में, बूटस्ट्रैपिंग स्रोत प्रोग्रामिंग भाषा में एक कंपाइलर (या असेंबलर) लिखने की प्रक्रिया है जिसे वह संकलन करने का इरादा रखता है। इस तकनीक को लागू करने से एक स्व-होस्टिंग संकलक होता है।

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

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

अब, जहां तक ​​मैं समझता हूं, भाषा एक्स में लिखे गए दुभाषिया को "बूटस्ट्रैप" करने में सक्षम होने के लिए , आपको दुभाषिया वाई में फिर से लिखना होगा । लेकिन यहाँ कमी है: भले ही आप भाषा में पूरे दुभाषिया पुनर्लेखन करना Y , आप अभी भी मूल जरूरत के लिए दुभाषिया आप भाषा में लिखा जा रहे हैं एक्स । क्योंकि भाषा वाई में दुभाषिया को चलाने के लिए , आपको स्रोत फ़ाइलों की व्याख्या करनी होगी। लेकिन क्या वास्तव में स्रोत फ़ाइलों की व्याख्या करने जा रहा है? खैर, यह कुछ भी नहीं हो सकता है, इसलिए, आप अभी भी पहले दुभाषिया का उपयोग करने के लिए मजबूर हैं।

कोई फर्क नहीं पड़ता कि आप कितने नए व्याख्याकारों को भाषा वाई में लिखते हैं , आपको हमेशा बाद के दुभाषियों की व्याख्या करने के लिए एक्स में लिखे गए पहले दुभाषिया का उपयोग करना होगा । यह केवल दुभाषियों की प्रकृति के कारण एक समस्या प्रतीत होती है।

हालाँकि , फ्लिप पक्ष पर, व्याख्याकारों पर यह विकिपीडिया लेख वास्तव में स्व-होस्टिंग दुभाषियों के बारे में बात करता है । यहाँ एक छोटा सा अंश है जो प्रासंगिक है:

एक स्व-व्याख्याकार एक प्रोग्रामिंग भाषा में लिखा गया एक प्रोग्रामिंग भाषा दुभाषिया है जो खुद की व्याख्या कर सकता है; एक उदाहरण BASIC में लिखा गया एक BASIC दुभाषिया है। स्व-व्याख्याकार स्वयं-होस्टिंग संकलक से संबंधित हैं।

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

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

अब ऊपर दिए गए लेख में एक अन्य लेख के लिंक का उल्लेख किया गया है जिसमें विकिपीडिया कथित स्व-होस्टिंग व्याख्याकारों के कुछ उदाहरण देता है । हालांकि करीब से निरीक्षण करने पर, ऐसा लगता है कि उन स्व-होस्टिंग दुभाषियों में से कई का मुख्य "दुभाषिया" भाग (विशेषकर कुछ अधिक सामान्य जैसे कि PyPy या रुबिनियस) वास्तव में अन्य भाषाओं जैसे C ++ या C में लिखे गए हैं।

तो क्या मैं ऊपर वर्णित है? क्या एक स्व-होस्ट किए गए दुभाषिया अपने मूल मेजबान से स्वतंत्र हो सकता है? यदि हां, तो यह वास्तव में कैसे किया जाएगा?

जवाबों:


24

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

कोई फर्क नहीं पड़ता कि आप कितने नए व्याख्याकारों को भाषा वाई में लिखते हैं , आपको हमेशा बाद के दुभाषियों की व्याख्या करने के लिए एक्स में लिखे गए पहले दुभाषिया का उपयोग करना होगा । यह केवल दुभाषियों की प्रकृति के कारण एक समस्या प्रतीत होती है।

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

हालाँकि , फ्लिप पक्ष पर, व्याख्याकारों पर विकिपीडिया लेख वास्तव में स्व-होस्टिंग दुभाषियों के बारे में बात करता है। यहाँ एक छोटा सा अंश है जो प्रासंगिक है:

एक स्व-व्याख्याकार एक प्रोग्रामिंग भाषा में लिखा गया एक प्रोग्रामिंग भाषा दुभाषिया है जो खुद की व्याख्या कर सकता है; एक उदाहरण BASIC में लिखा गया एक BASIC दुभाषिया है। स्व-व्याख्याकार स्वयं-होस्टिंग संकलक से संबंधित हैं।

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

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

सही बात। ध्यान दें कि विकिपीडिया लेख स्पष्ट रूप से कहता है कि आपको अपनी भाषा के दूसरे कार्यान्वयन की आवश्यकता है , और यह नहीं कहता है कि आप पहले से छुटकारा पा सकते हैं।

अब ऊपर दिए गए लेख में दूसरे लेख के लिंक का उल्लेख किया गया है जिसमें विकिपीडिया कथित स्व-होस्टिंग व्याख्याकारों के कुछ उदाहरण देता है। हालांकि करीब से निरीक्षण करने पर, ऐसा लगता है कि उन स्व-होस्टिंग दुभाषियों में से कई का मुख्य "दुभाषिया" भाग (विशेषकर कुछ अधिक सामान्य जैसे कि PyPy या रुबिनियस) वास्तव में अन्य भाषाओं जैसे C ++ या C में लिखे गए हैं।

फिर से, सही। वे वास्तव में बुरे उदाहरण हैं। उदाहरण के लिए रुबिनियस को लीजिए। हां, यह सच है कि रुबिनस का रूबी हिस्सा स्वयं-होस्ट है, लेकिन यह एक संकलक है, न कि एक दुभाषिया: यह रूबी स्रोत कोड को रुबिनियस बायटेकोड के लिए संकलित करता है। दुभाषिया भाग OTOH स्वयं-होस्ट नहीं है: यह रुबिनियस बाइटकोड की व्याख्या करता है, लेकिन यह C ++ में लिखा गया है। तो, रुबिनियस को "सेल्फ-होस्टेड इंटरप्रेटर" कहना गलत है: स्व-होस्ट किया गया भाग इंटरप्रिटर नहीं है , और इंटरप्रिटर का हिस्सा स्वयं-होस्ट नहीं है

PyPy समान है, लेकिन इससे भी अधिक गलत: यह पहली जगह में भी पायथन में नहीं लिखा गया है, यह RPython में लिखा गया है, जो एक अलग भाषा है। यह शब्दबद्ध रूप से पाइथन के समान है, शब्दार्थ "विस्तारित उपसमूह", लेकिन यह वास्तव में जावा के समान ही अमूर्त स्तर पर एक सांख्यिकीय रूप से टाइप की गई भाषा है, और इसका कार्यान्वयन कई बैकएंड के साथ एक संकलक है जो RPython को C स्रोत कोड, ECMAScript के लिए जोड़ता है स्रोत कोड, CIL बाइट कोड, JVM बाइटकोड, या पायथन सोर्सकोड।

तो क्या मैं ऊपर वर्णित है? क्या एक स्व-मेजबान दुभाषिया अपने मूल मेजबान से स्वतंत्र हो सकता है? यदि हां, तो यह वास्तव में कैसे किया जाएगा?

नहीं, अपने दम पर नहीं। आपको या तो मूल दुभाषिया रखने की ज़रूरत होगी या एक कंपाइलर लिखने और अपने आत्म-दुभाषिये को संकलित करने की होगी।

वहाँ रहे हैं जैसे कुछ मेटा परिपत्र VM, क्लेन (में लिखा स्व ) और मैक्सिन (जावा में लिखा)। ध्यान दें, हालांकि, यहां "मेटा-परिपत्र" की परिभाषा अभी तक अलग है: ये वीएम उस भाषा में नहीं लिखे जाते हैं जिस पर वे अमल करते हैं: क्लेन सेल्फ बायटेकोड को निष्पादित करता है लेकिन स्व में लिखा गया है, मैक्सिन जेवीएम बायटेकोड को निष्पादित करता है लेकिन जावा में लिखा गया है। हालाँकि, VM का Self / Java सोर्स कोड वास्तव में Self / JVM bytecode से संकलित किया जाता है और फिर VM द्वारा निष्पादित किया जाता है, इसलिए जब तक VM निष्पादित हो जाता है, यह उस भाषा में होता है जिसे वह निष्पादित करता है। ओह।

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

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

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


येश । मुझे कभी नहीं पता था कि स्व-होस्टिंग व्याख्याकारों की दुनिया इतनी चिपचिपी थी! हालांकि एक अच्छा अवलोकन देने के लिए धन्यवाद।
क्रिश्चियन डीन

1
हाहा, ठीक है, दुनिया को अवधारणा की तुलना में कम दिमाग वाला क्यों होना चाहिए? ;-)
Jörg W Mittag

3
मुझे लगता है कि समस्याओं में से एक यह है कि लोग अक्सर शामिल भाषाओं के साथ तेज और ढीले खेलते हैं। उदाहरण के लिए, रुबिनियस को आमतौर पर "रूबी इन रूबी" कहा जाता है, लेकिन यह केवल आधी कहानी है। हां, कड़ाई से बोलते हुए , रूबिनस में रूबी कंपाइलर रूबी में लिखा गया है, लेकिन जो वीएम बाईटकोड निष्पादित करता है वह नहीं है। और इससे भी बदतर: PyPy को अक्सर "Python in Python" कहा जाता है, सिवाय इसके कि वास्तव में वहाँ Python की एक भी पंक्ति नहीं है। पूरी बात RPython में लिखी गई है, जिसे Python प्रोग्रामर से परिचित होने के लिए डिज़ाइन किया गया है, लेकिन Python नहीं है । इसी तरह स्क्वीवीवीएम: यह स्मालटाक में नहीं लिखा है, ...
जोर्ग डब्ल्यू मित्तग 20

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

2
बस एक और जटिलता जोड़ने के लिए: कुछ व्याख्या की गई भाषाओं (जैसे कि FORTH, और संभवतः TeX) एक निष्पादन योग्य फ़ाइल के रूप में, रनिंग सिस्टम की लोड करने योग्य मेमोरी छवि लिखने में सक्षम हैं। इस संदर्भ में, ऐसी व्यवस्था कर सकते हैं तो मूल दुभाषिया के बिना चला। उदाहरण के लिए, मैंने एक बार FORTH के एक 16-बिट संस्करण का उपयोग करके FORTH दुभाषिया को एक अलग-अलग CPU के लिए 32-बिट संस्करण "क्रॉस-इंटरप्रिट" और एक अलग OS पर चलाने के लिए लिखा था। (ध्यान दें, FORTH भाषा में अपना स्वयं का कोडांतरक शामिल है, इसलिए "FORTH VM" (जो आम तौर पर केवल 10 या 20 मशीन कोड निर्देश हैं) FORTH में ही लिखे जा सकते हैं।)
alephzero

7

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

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

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

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

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

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

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