दुभाषिया (कंप्यूटिंग)



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


 * 1) स्रोत कोड को पार्स करें और इसका व्यवहार सीधे करें;
 * 2) अनुवादक (कंप्यूटिंग) स्रोत कोड कुछ कुशल मध्यवर्ती प्रतिनिधित्व या वस्तु कोड में और तुरंत उस पर अमल करें;
 * 3) स्पष्ट रूप से संग्रहीत प्रीकंपील्ड बाईटकोड निष्पादित करें एक संकलक द्वारा बनाया गया और दुभाषिया आभासी मशीन के साथ मेल खाता है।

लिस्प प्रोग्रामिंग भाषा के प्रारंभिक संस्करण और बुनियादी दुभाषिया पहले प्रकार के उदाहरण होंगे। पर्ल, राकू (प्रोग्रामिंग भाषा), पायथन (प्रोग्रामिंग लैंग्वेज), MATLAB और रूबी (प्रोग्रामिंग भाषा) दूसरे के उदाहरण हैं, जबकि UCSD पास्कल तीसरे प्रकार का एक उदाहरण है। स्रोत कार्यक्रमों को समय से पहले संकलित किया जाता है और मशीन स्वतंत्र कोड के रूप में संग्रहीत किया जाता है, जो तब रन-टाइम पर लिंकर (कंप्यूटिंग) होता है और दुभाषिया और/या संकलक (समय-समय पर संकलन सिस्टम के लिए) द्वारा निष्पादित होता है। कुछ प्रणालियाँ, जैसे स्मॉलटाक और बेसिक और जावा (प्रोग्रामिंग भाषा) के समकालीन संस्करण भी दो और तीन को जोड़ सकते हैं। पारंपरिक रूप से संकलन से जुड़ी कई भाषाओं के लिए विभिन्न प्रकार के दुभाषियों का भी निर्माण किया गया है, जैसे कि ALGOL, फोरट्रान, COBOL, C (प्रोग्रामिंग भाषा) और C++।

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

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

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

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

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

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

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

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

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

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

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

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

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

दक्षता
दुभाषियों का मुख्य नुकसान यह है कि एक व्याख्यायित कार्यक्रम आमतौर पर संकलक होने की तुलना में धीमी गति से चलता है। गति में अंतर छोटा या बड़ा हो सकता है; अक्सर परिमाण का क्रम और कभी-कभी अधिक। संकलित कोड को चलाने की तुलना में आमतौर पर एक दुभाषिया के तहत एक कार्यक्रम चलाने में अधिक समय लगता है, लेकिन इसे संकलित करने और चलाने के लिए आवश्यक कुल समय की तुलना में इसकी व्याख्या करने में कम समय लग सकता है। यह विशेष रूप से महत्वपूर्ण है जब प्रोटोटाइप और परीक्षण कोड जब संपादन-व्याख्या-डीबग चक्र अक्सर संपादन-संकलन-रन-डीबग चक्र से बहुत छोटा हो सकता है। संकलित कोड को चलाने की तुलना में कोड की व्याख्या करना धीमा है क्योंकि दुभाषिया को प्रोग्राम में प्रत्येक कथन (कंप्यूटर साइंस) का हर बार निष्पादित होने पर उसका विश्लेषण करना चाहिए और फिर वांछित क्रिया करनी चाहिए, जबकि संकलित कोड केवल एक निश्चित संदर्भ के भीतर कार्रवाई करता है। संकलन। यह रन टाइम (प्रोग्राम जीवनचक्र चरण) | रन-टाइम विश्लेषण व्याख्यात्मक ओवरहेड के रूप में जाना जाता है। दुभाषिया में चरों तक पहुंच भी धीमी होती है क्योंकि भंडारण स्थानों के लिए पहचानकर्ताओं की मैपिंग संकलन समय के बजाय रन-टाइम पर बार-बार की जानी चाहिए। एक दुभाषिया का उपयोग करते समय विकास की गति और एक संकलक का उपयोग करते समय निष्पादन की गति के बीच कई समझौते होते हैं। कुछ प्रणालियाँ (जैसे कुछ लिस्प (प्रोग्रामिंग भाषा)) एक दूसरे को कॉल करने और चर साझा करने के लिए व्याख्या किए गए और संकलित कोड की अनुमति देती हैं। इसका मतलब यह है कि एक बार एक रूटीन का परीक्षण हो जाने के बाद दुभाषिया के तहत इसे संकलित किया जा सकता है और इस प्रकार तेजी से निष्पादन से लाभ होता है जबकि अन्य रूटीन विकसित किए जा रहे हैं। कई दुभाषिए स्रोत कोड को निष्पादित नहीं करते हैं, लेकिन इसे कुछ अधिक कॉम्पैक्ट आंतरिक रूप में परिवर्तित करते हैं। कई बेसिक दुभाषिए कीवर्ड (कंप्यूटर प्रोग्रामिंग) को सिंगल बाइट टोकन थ्रेडिंग से बदल देते हैं जिसका उपयोग कूदने की मेज में निर्देश खोजने के लिए किया जा सकता है। PBASIC दुभाषिया जैसे कुछ व्याख्याकार, बाइट-ओरिएंटेड प्रोग्राम मेमोरी स्ट्रक्चर के बजाय बिट-ओरिएंटेड का उपयोग करके प्रोग्राम कॉम्पैक्शन के उच्च स्तर को प्राप्त करते हैं, जहां कमांड टोकन शायद 5 बिट्स पर कब्जा कर लेते हैं, नाममात्र 16-बिट स्थिरांक एक में संग्रहीत होते हैं। चर-लंबाई वाले कोड में 3, 6, 10, या 18 बिट्स की आवश्यकता होती है, और एड्रेस ऑपरेंड में थोड़ा ऑफसेट शामिल होता है। कई बेसिक दुभाषिए अपने स्वयं के टोकनयुक्त आंतरिक प्रतिनिधित्व को संग्रहीत और पढ़ सकते हैं।

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

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

बाइटकोड दुभाषिया
कार्यक्रम के निष्पादन से पहले किए गए विश्लेषण की मात्रा के आधार पर व्याख्या और संकलन के बीच संभावनाओं का एक स्पेक्ट्रम है। उदाहरण के लिए, Emacs Lisp को bytecode में संकलित किया गया है, जो लिस्प स्रोत का अत्यधिक संकुचित और अनुकूलित प्रतिनिधित्व है, लेकिन मशीन कोड नहीं है (और इसलिए किसी विशेष हार्डवेयर से बंधा नहीं है)। यह संकलित कोड तब एक बाइटकोड दुभाषिया द्वारा व्याख्या किया जाता है (स्वयं सी (प्रोग्रामिंग भाषा) में लिखा गया है)। इस मामले में संकलित कोड एक आभासी मशीन के लिए मशीन कोड है, जिसे हार्डवेयर में नहीं, बल्कि बायटेकोड दुभाषिया में लागू किया गया है। ऐसे संकलन दुभाषियों को कभी-कभी कंप्रेटर्स भी कहा जाता है। एक बायटेकोड दुभाषिया में प्रत्येक निर्देश एक बाइट से शुरू होता है, और इसलिए बायटेकोड दुभाषियों के पास 256 निर्देश तक होते हैं, हालांकि सभी का उपयोग नहीं किया जा सकता है। कुछ बाइटकोड एकाधिक बाइट ले सकते हैं, और मनमाने ढंग से जटिल हो सकते हैं।

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

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

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

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

जस्ट-इन-टाइम संकलन
दुभाषियों, बायटेकोड दुभाषियों और संकलन के बीच अंतर को और अधिक धुंधला करना समय-समय पर (JIT) संकलन है, एक ऐसी तकनीक जिसमें मध्यवर्ती प्रतिनिधित्व को रनटाइम पर देशी मशीन कोड में संकलित किया जाता है। यह मूल कोड चलाने की दक्षता प्रदान करता है, स्टार्टअप समय की कीमत पर और बाइटकोड या एएसटी पहली बार संकलित होने पर स्मृति उपयोग में वृद्धि करता है। 1960 में जॉन मैक्कार्थी (कंप्यूटर वैज्ञानिक) द्वारा सबसे पहले प्रकाशित जेआईटी कंपाइलर को आमतौर पर लिस्प (प्रोग्रामिंग लैंग्वेज) पर काम करने के लिए जिम्मेदार ठहराया जाता है। अनुकूली अनुकूलन एक पूरक तकनीक है जिसमें दुभाषिया चल रहे प्रोग्राम को प्रोफाइल करता है और इसके सबसे अधिक बार निष्पादित भागों को देशी कोड में संकलित करता है। बाद की तकनीक कुछ दशक पुरानी है, जो 1980 के दशक में स्मॉलटाक जैसी भाषाओं में दिखाई दे रही है। जस्ट-इन-टाइम संकलन ने हाल के वर्षों में भाषा कार्यान्वयनकर्ताओं के बीच मुख्य धारा का ध्यान आकर्षित किया है, जावा मंच, .NET फ्रेमवर्क, सबसे आधुनिक जावास्क्रिप्ट कार्यान्वयन और मैटलैब में अब JIT कंपाइलर शामिल हैं।

टेम्पलेट दुभाषिया
संकलक और दुभाषियों के बीच अंतर को फिर से और भी अस्पष्ट बनाना एक विशेष दुभाषिया डिज़ाइन है जिसे टेम्पलेट दुभाषिया के रूप में जाना जाता है। एक सॉफ्टवेयर स्टैक या ट्री वॉक पर काम करते हुए, हर संभव बायटेकोड वाले एक बड़े स्विच स्टेटमेंट के आधार पर कोड के निष्पादन को लागू करने के बजाय, एक टेम्पलेट दुभाषिया बायटेकोड (या किसी भी कुशल मध्यवर्ती प्रतिनिधित्व) की एक बड़ी सरणी को सीधे संबंधित में मैप करता है। नेटिव मशीन निर्देश जिन्हें होस्ट हार्डवेयर पर कुंजी मूल्य जोड़े (या अधिक कुशल डिजाइनों में, नेटिव निर्देशों के सीधे पते) के रूप में निष्पादित किया जा सकता है। टेम्पलेट के रूप में जाना जाता है। जब विशेष कोड खंड निष्पादित किया जाता है तो दुभाषिया टेम्पलेट में ओपकोड मैपिंग पर बस लोड या कूदता है और इसे सीधे हार्डवेयर पर चलाता है। इसके डिजाइन के कारण, टेम्पलेट दुभाषिया एक पारंपरिक दुभाषिया के बजाय जस्ट-इन-टाइम कंपाइलर जैसा दिखता है, हालांकि यह तकनीकी रूप से एक JIT नहीं है, क्योंकि यह केवल भाषा से कोड को स्थानीय कॉल में एक ऑपकोड में अनुवाद करता है। समय पूरे कोड सेगमेंट से सीपीयू निष्पादन योग्य निर्देशों के अनुकूलित अनुक्रम बनाने के बजाय। दुभाषिया के सरल डिजाइन के कारण उन्हें सीधे लागू करने के बजाय सीधे हार्डवेयर में कॉल पास करने के कारण, यह हर दूसरे प्रकार की तुलना में बहुत तेज है, यहां तक ​​​​कि बायटेकोड दुभाषियों की तुलना में, और एक हद तक बग से कम प्रवण होता है, लेकिन ट्रेडऑफ़ के रूप में अधिक कठिन होता है दुभाषिया को प्लेटफॉर्म स्वतंत्र वर्चुअल मशीन/स्टैक के बजाय कई अलग-अलग आर्किटेक्चर में अनुवाद का समर्थन करने के कारण बनाए रखें। आज तक, व्यापक रूप से ज्ञात भाषाओं का एकमात्र टेम्प्लेट दुभाषिया कार्यान्वयन जावा के आधिकारिक संदर्भ कार्यान्वयन, सन हॉटस्पॉट जावा वर्चुअल मशीन के भीतर दुभाषिया है। और Google V8 जावास्क्रिप्ट निष्पादन इंजन में इग्निशन इंटरप्रेटर।

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

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

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

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

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

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

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

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

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

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

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

अनुप्रयोग

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

यह भी देखें

 * बुनियादी दुभाषिया
 * कमांड-लाइन दुभाषिया
 * संकलित भाषा
 * गतिशील संकलन
 * समजातीयता
 * मेटा-सर्कुलर मूल्यांकनकर्ता
 * आंशिक मूल्यांकन

बाहरी संबंध

 * IBM Card Interpreters page at Columbia University
 * Theoretical Foundations For Practical 'Totally Functional Programming' (Chapter 7 especially) Doctoral dissertation tackling the problem of formalising what is an interpreter
 * Short animation explaining the key conceptual difference between interpreters and compilers. Archived at ghostarchive.org on May 9, 2022.