संक्षिप्त उत्तर है: आप अपने संदेह में सही हैं, आपको हमेशा या तो एक्स में लिखा गया एक और दुभाषिया या वाई से किसी अन्य भाषा में कंपाइलर की आवश्यकता होती है , जिसके लिए आपके पास पहले से ही एक दुभाषिया है। दुभाषिए निष्पादित करते हैं, संकलक केवल एक भाषा से दूसरी भाषा में अनुवाद करते हैं, आपके सिस्टम में कुछ बिंदु पर , एक दुभाषिया होना चाहिए ... यहां तक कि यह सिर्फ सीपीयू है।
कोई फर्क नहीं पड़ता कि आप कितने नए व्याख्याकारों को भाषा वाई में लिखते हैं , आपको हमेशा बाद के दुभाषियों की व्याख्या करने के लिए एक्स में लिखे गए पहले दुभाषिया का उपयोग करना होगा । यह केवल दुभाषियों की प्रकृति के कारण एक समस्या प्रतीत होती है।
सही बात। आप जो कर सकते हैं वह वाई से एक्स (या किसी अन्य भाषा जिसके लिए आपके पास दुभाषिया है) के लिए एक कंपाइलर लिखना है , और आप वाई में भी ऐसा कर सकते हैं । तो फिर आप अपने चला सकते हैं वाई संकलक में लिखा 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 अपने स्वयं के बूटअप चरण को संकलित करेगा, फिर बूटस्ट्रैप वीएम इमेज में संकलित मूल कोड को क्रमबद्ध करें और सामने एक बहुत ही सरल बूटलोडर चिपकाएं (सी में लिखा वीएम का एकमात्र घटक, हालांकि सुविधा के लिए है , यह जावा में भी हो सकता है)। अब आप खुद को निष्पादित करने के लिए मैक्सिन का उपयोग कर सकते हैं।