दुभाषिया (कंप्यूटिंग)
कार्यक्रम निष्पादन |
---|
सामान्य अवधारणाएँ |
कोड के प्रकार |
संकलन रणनीतियाँ |
उल्लेखनीय रनटाइम्स |
|
उल्लेखनीय संकलक और टूलचेन |
|
कंप्यूटर विज्ञान में, एक इंटरप्रेटर एक कंप्यूटर प्रोग्राम है जो किसी प्रोग्रामिंग भाषा या स्क्रिप्टिंग भाषा में में लिखे गए निर्देशों को बिना किसी यंत्र भाषा प्रोग्राम में संकलित किए सीधे निष्पादित (कंप्यूटर) करता है। एक इंटरप्रेटर सामान्यतः प्रोग्राम निष्पादन के लिए निम्नलिखित रणनीतियों में से एक का उपयोग करता है:
- स्रोत कोड को पार्स करें और इसका व्यवहार सीधे करें;
- अनुवादक (कंप्यूटिंग) स्रोत कोड कुछ कुशल मध्यवर्ती प्रतिनिधित्व या वस्तु कोड में और तुरंत उस का पालन करना चाहिये;
- स्पष्ट रूप से संग्रहीत प्रीकंपील्ड बाईटकोड निष्पादित करें[1] कंपाइलर द्वारा बनाया गया और इंटरप्रेटर आभासी यंत्र के साथ मेल खाता है।
लिस्प प्रोग्रामिंग भाषा और मिनी कंप्यूटर और माइक्रो कंप्यूटर आधारभूत बोलियों के प्रारंभी संस्करण पहले प्रकार के उदाहरण होंगे। पर्ल, राकू (प्रोग्रामिंग भाषा), पायथन (प्रोग्रामिंग भाषा), अर्थ और रूबी (प्रोग्रामिंग भाषा) दूसरे प्रकार के उदाहरण हैं, चूंकि यूसीएसडी पास्कल तीसरे प्रकार का एक उदाहरण है। स्रोत प्रोग्रामों को समय से पहले संकलित किया जाता है और यंत्र स्वतंत्र कोड के रूप में संग्रहीत किया जाता है, जो तब रन-टाइम पर लिंकर (कंप्यूटिंग) होता है और इंटरप्रेटर और/या कंपाइलर (समय-समय पर संकलन प्रणाली के लिए) द्वारा निष्पादित होता है। कुछ प्रणालियाँ, जैसे स्मॉलटाक और बेसिक और जावा (प्रोग्रामिंग भाषा) के समकालीन संस्करण भी दो और तीन को जोड़ सकते हैं।[2] पारंपरिक रूप से संकलन से जुड़ी कई भाषाओं, जैसे कि अल्गोल, फोरट्रान, कोबोल, सी (प्रोग्रामिंग भाषा) और सी++ के लिए विभिन्न प्रकार के दुभाषियों का भी निर्माण किया गया है।
चूंकि व्याख्या और संकलन दो मुख्य साधन हैं जिनके द्वारा प्रोग्रामिंग भाषाओं को प्रायुक्त किया जाता है, वे परस्पर अनन्य नहीं हैं, क्योंकि अधिकांश व्याख्या करने वाली प्रणालियाँ भी कंपाइलर की तरह कुछ अनुवाद कार्य करती हैं। व्याख्या की गई भाषा या संकलित भाषा शब्द यह दर्शाता है कि उस भाषा का विहित कार्यान्वयन क्रमशः एक इंटरप्रेटर या एक कंपाइलर है। एक उच्च-स्तरीय भाषा आदर्श रूप से विशेष कार्यान्वयन से स्वतंत्र एक अमूर्त है।
इतिहास
उस समय कंप्यूटर की सीमाओं के अन्दर प्रोग्रामिंग को आसान बनाने के लिए 1952 की प्रारंभ में दुभाषियों (उदाहरण के लिए प्रोग्राम स्टोरेज स्पेस की कमी, या फ़्लोटिंग पॉइंट नंबरों के लिए कोई मूल समर्थन नहीं) का उपयोग किया गया था। दुभाषियों का उपयोग निम्न-स्तरीय यंत्र भाषाओं के बीच अनुवाद करने के लिए भी किया जाता था, जिससे उन यंत्रों के लिए कोड लिखे जा सकते थे जो अभी भी निर्माणाधीन थे और पहले से मौजूद कंप्यूटरों पर परीक्षण किए गए थे।[3] पहली व्याख्या की गई उच्च स्तरीय भाषा लिस्प (प्रोग्रामिंग भाषा) थी। लिस्प को पहली बार 1958 में आईबीएम 704 कंप्यूटर पर स्टीव रसेल (कंप्यूटर वैज्ञानिक) द्वारा प्रायुक्त किया गया था। रसेल ने जॉन मैककार्थी (कंप्यूटर वैज्ञानिक) के पेपर को पढ़ा था, और अनुभव (मैककार्थी के आश्चर्य के लिए) किया कि लिस्प इवल फ़ंक्शन को यंत्र कोड में प्रायुक्त किया जा सकता है।[4] परिणाम कामकाजी लिस्प इंटरप्रेटर था जिसका उपयोग लिस्प प्रोग्राम चलाने के लिए किया जा सकता था, या अधिक ठीक से, लिस्प अभिव्यक्तियों का मूल्यांकन किया जा सकता था।
सामान्य ऑपरेशन
इंटरप्रेटर में सामान्यतः ज्ञात कमांड (कंप्यूटिंग) का सेट होता है जिसे वह निष्पादित (कंप्यूटिंग) कर सकता है, और इन कमांड्स की सूची जिस क्रम में प्रोग्रामर उन्हें निष्पादित करना चाहता है। प्रत्येक कमांड (जिसे एक निर्देश के रूप में भी जाना जाता है) में वह डेटा होता है जिसे प्रोग्रामर म्यूट करना चाहता है, और डेटा को म्यूटेट करने के विधि के बारे में जानकारी देता है। उदाहरण के लिए, इंटरप्रेटर ADD Wikipedia_Users, 5
पढ़ सकता है और इसे Wikipedia_Users
चर (कंप्यूटर विज्ञान) में पाँच जोड़ने के अनुरोध के रूप में व्याख्या कर सकता है।
दुभाषियों के पास विभिन्न प्रकार के निर्देश होते हैं जो विभिन्न कार्यों को करने के लिए विशिष्ट होते हैं, किन्तु आप सामान्यतः आधारभूत संचालन (गणित), शाखा (कंप्यूटर विज्ञान) और स्मृति प्रबंधन के लिए इंटरप्रेटर निर्देश पाएंगे, जिससे अधिकांश दुभाषिए ट्यूरिंग पूर्णता प्राप्त करते हैं। कई दुभाषियों को कचरा संग्रह (कंप्यूटर विज्ञान) और डिबगर के साथ घनिष्ठ रूप से एकीकृत किया जाता है।
कंपाइलर बनाम इंटरप्रेटर

उच्च-स्तरीय भाषा में लिखे गए प्रोग्राम या तो सीधे किसी प्रकार के इंटरप्रेटर द्वारा निष्पादित किए जाते हैं या सीपीयू के निष्पादन के लिए कंपाइलर (और असेंबलर (कंप्यूटिंग) और लिंकर (कंप्यूटिंग)) द्वारा यंत्र कोड में परिवर्तित किए जाते हैं।
चूंकि कंपाइलर (और असेंबलर) सामान्यतः कंप्यूटर हार्डवेयर द्वारा सीधे निष्पादन योग्य यंत्र कोड का उत्पादन करते हैं, वे अधिकांश (वैकल्पिक रूप से) ऑब्जेक्ट कोड नामक मध्यवर्ती रूप का उत्पादन कर सकते हैं। यह मूल रूप से ही यंत्र विशिष्ट कोड है किन्तु निष्पादन योग्य ब्लॉक (या मॉड्यूल) को पहचानने योग्य और स्थानांतरित करने योग्य बनाने के लिए नाम और टैग के साथ प्रतीक तालिका के साथ संवर्धित किया गया है। संकलित प्रोग्राम सामान्यतः ऐसे ऑब्जेक्ट कोड मॉड्यूल के पुस्तकालय में रखे बिल्डिंग ब्लॉक्स (फ़ंक्शंस) का उपयोग करेंगे। लिंकर (कंप्यूटिंग) का उपयोग निष्पादन योग्य फ़ाइल बनाने के लिए एप्लिकेशन की ऑब्जेक्ट फ़ाइल (ओं) के साथ (पूर्व-निर्मित) लाइब्रेरी फ़ाइलों को संयोजित करने के लिए किया जाता है। निष्पादन योग्य फ़ाइल उत्पन्न करने के लिए उपयोग की जाने वाली ऑब्जेक्ट फ़ाइलें इस प्रकार अधिकांश अलग-अलग समय पर और कभी-कभी अलग-अलग भाषाओं (समान ऑब्जेक्ट प्रारूप उत्पन्न करने में सक्षम) द्वारा भी बनाई जाती हैं।
निम्न-स्तरीय भाषा (जैसे असेंबली भाषा) में लिखे गए साधारण इंटरप्रेटर में उच्च-स्तरीय भाषा के कार्यों को प्रायुक्त करने वाले समान यंत्र कोड ब्लॉक हो सकते हैं, और जब लुकअप तालिका में फ़ंक्शन की प्रविष्टि उस कोड को निरुपित करती है, तो उसे निष्पादित किया जाता है। चूँकि एक उच्च-स्तरीय भाषा में लिखा गया एक इंटरप्रेटर सामान्यतः एक अन्य दृष्टिकोण का उपयोग करता है जैसे कि एक पार्स ट्री बनाना और फिर चलना या मध्यवर्ती सॉफ़्टवेयर-परिभाषित निर्देश या दोनों को उत्पन्न करना और निष्पादित करता हैं।
इस प्रकार, दोनों कंपाइलर और इंटरप्रेटर सामान्यतः स्रोत कोड (पाठ फ़ाइलों) को टोकन में बदल देते हैं, दोनों पार्स ट्री उत्पन्न कर सकते हैं (या नहीं भी कर सकते हैं), और दोनों तत्काल निर्देश उत्पन्न कर सकते हैं (स्टैक यंत्र के लिए, तीन-पता कोड, या अन्य माध्यमों से) उत्पन्न कर सकते हैं। मूल अंतर यह है कि कंपाइलर प्रणाली, जिसमें (निर्मित या अलग) लिंकर शामिल है, स्टैंड-अलोन यंत्र कोड प्रोग्राम उत्पन्न करता है, चूंकि इंटरप्रेटर प्रणाली इसके अतिरिक्त उच्च-स्तरीय प्रोग्राम द्वारा वर्णित क्रियाएं करता है।
कंपाइलर इस प्रकार स्रोत कोड शब्दार्थ से लगभग सभी रूपांतरण यंत्र स्तर पर बार और सभी के लिए कर सकता है (अर्थात जब तक प्रोग्राम को बदलना नहीं है) चूंकि इंटरप्रेटर को इस रूपांतरण कार्य में से कुछ को प्रत्येक बयान या फ़ंक्शन निष्पादित करना पड़ता है। चूंकि, कुशल इंटरप्रेटर में, अधिकांश अनुवाद कार्य (प्रकारों के विश्लेषण सहित, और समान) को फैक्टर आउट किया जाता है और केवल पहली बार प्रोग्राम मॉड्यूल फ़ंक्शन किया जाता है, या यहाँ तक कि स्टेटमेंट भी चलाया जाता है, इस प्रकार एक कंपाइलर कैसे काम करता है। चूँकि एक संकलित प्रोग्राम अभी भी ज्यादातर परिस्थितियों में बहुत तेजी से चलता है क्योंकि कंपाइलर को कोड को अनुकूलित करने के लिए डिज़ाइन किया गया है और इसके लिए पर्याप्त समय दिया जा सकता है। यह (कई) गतिशील डेटा संरचनाओं चेक या प्रकार की जाँच के बिना सरल उच्च स्तरीय भाषाओं के लिए विशेष रूप से सच है।
पारंपरिक संकलन में, लिंकर (कंप्यूटिंग) (.exe फ़ाइलें या .dll फ़ाइलें या लाइब्रेरी, चित्र देखें) का निष्पादन योग्य आउटपुट सामान्यतः सामान्य ऑपरेटिंग प्रणाली के तहत चलाए जाने पर स्थानांतरित करने योग्य होता है, ऑब्जेक्ट कोड मॉड्यूल की तरह किन्तु अंतर के साथ यह स्थानांतरण गतिशील रूप से रन टाइम पर किया जाता है, अर्थात् जब प्रोग्राम को निष्पादन के लिए लोड किया जाता है। दूसरी ओर, छोटे अंतः स्थापित प्रणालियाँ के लिए संकलित और लिंक किए गए प्रोग्राम सामान्यतः स्थिर रूप से आवंटित किए जाते हैं, अधिकांश एनओआर फ्लैश मेमोरी में हार्ड कोडित होते हैं, क्योंकि इस अर्थ में अधिकांश कोई सेकेंडरी स्टोरेज और कोई ऑपरेटिंग प्रणाली नहीं होता है।
ऐतिहासिक रूप से, अधिकांश इंटरप्रेटर प्रणालियों में स्व-निहित संपादक निर्मित होता है। यह कंपाइलर (तब अधिकांश एकीकृत विकास वातावरण कहा जाता है) के लिए भी अधिक सामान्य होता जा रहा है, चूंकि कुछ प्रोग्रामर अपनी पसंद के संपादक का उपयोग करना पसंद करते हैं और कंपाइलर, लिंकर और अन्य उपकरणों मैन्युअल रूप से चलाते हैं। ऐतिहासिक रूप से, कंपाइलर दुभाषियों से पहले के हैं क्योंकि उस समय हार्डवेयर इंटरप्रेटर और व्याख्या किए गए कोड दोनों का समर्थन नहीं कर सकता था और उस समय के विशिष्ट बैच वातावरण ने व्याख्या के लाभों को सीमित कर दिया था।[5]
विकास चक्र
सॉफ़्टवेयर विकास चक्र के दौरान, प्रोग्रामर स्रोत कोड में बार-बार परिवर्तन करते हैं। कंपाइलर का उपयोग करते समय, हर बार स्रोत कोड में परिवर्तन किया जाता है, उन्हें प्रोग्राम को निष्पादित करने से पहले सभी बाइनरी कोड फ़ाइलों को साथ परिवर्तित स्रोत फ़ाइलों और लिंकर (कंप्यूटिंग) का अनुवाद करने के लिए कंपाइलर की प्रतीक्षा करनी चाहिए। जितना बड़ा प्रोग्राम होता हैं, उतना लंबा इंतजार करना पड़ता हैं। इसके विपरीत एक इंटरप्रेटर का उपयोग करने वाला एक प्रोग्रामर बहुत कम प्रतीक्षा करता है क्योंकि इंटरप्रेटर को सामान्यतः मध्यवर्ती प्रतिनिधित्व (या बिल्कुल अनुवाद नहीं) पर काम करने वाले कोड का अनुवाद करने की आवश्यकता होती है, इस प्रकार परिवर्तनों का परीक्षण करने से पहले बहुत कम समय की आवश्यकता होती है। स्रोत कोड को सहेजने और प्रोग्राम को पुनः लोड करने पर प्रभाव स्पष्ट होते हैं। संकलित कोड सामान्यतः संपादन, संकलन और लिंकिंग के रूप में कम आसानी से डिबग किया जाता है जो अनुक्रमिक प्रक्रियाएं होती हैं जिन्हें उचित क्रम में कमांड के उचित सेट के साथ आयोजित किया जाना है। इस कारण से, कई कंपाइलर के पास कार्यकारी सहायता भी होती है, जिसे मेकफाइल (सॉफ्टवेयर) और प्रोग्राम के रूप में जाना जाता है। मेकफाइल कंपाइलर और लिंकर कमांड लाइन और प्रोग्राम स्रोत कोड फाइलों को सूचीबद्ध करता है, किन्तु साधारण कमांड लाइन मेनू इनपुट ले सकता है (जैसे मेक 3 ) जो निर्देशों के तीसरे समूह (सेट) निर्दिष्ट स्रोत कोड फ़ाइलों का चयन करता है और फिर कंपाइलर और लिंकर को कमांड जारी करता है।
वितरण
कंपाइलर स्रोत कोड को विशिष्ट प्रोसेसर के आर्किटेक्चर के लिए बाइनरी निर्देश में परिवर्तित करता है, इस प्रकार यह कम सॉफ्टवेयर पोर्टेबिलिटी बनाता है। यह रूपांतरण सिर्फ बार, डेवलपर के वातावरण पर किया जाता है, और उसके बाद उसी बाइनरी को उपयोगकर्ता की यंत्रों में वितरित किया जा सकता है, जहां इसे आगे के अनुवाद के बिना निष्पादित किया जा सकता है। क्रॉस कंपाइलर उपयोगकर्ता यंत्र के लिए बाइनरी कोड उत्पन्न कर सकता है, चाहे उसके पास यंत्र से भिन्न प्रोसेसर हो जहां कोड संकलित किया गया हो।
व्याख्या किए गए प्रोग्राम को स्रोत कोड के रूप में वितरित किया जा सकता है। इसे प्रत्येक अंतिम यंत्र में अनुवादित करने की आवश्यकता होती है, जिसमें अधिक समय लगता है किन्तु प्रोग्राम वितरण को यंत्र की वास्तुकला से स्वतंत्र बनाता है। चूंकि, व्याख्या किए गए स्रोत कोड की सुवाह्यता लक्ष्य यंत्र पर वास्तव में उपयुक्त इंटरप्रेटर होने पर निर्भर है। यदि इंटरप्रेटर को स्रोत के साथ आपूर्ति करने की आवश्यकता है, तो समग्र स्थापना प्रक्रिया अखंड निष्पादन योग्य की डिलीवरी की तुलना में अधिक जटिल है क्योंकि इंटरप्रेटर स्वयं ही स्थापित करने की आवश्यकता का भाग है।
तथ्य यह है कि व्याख्या किए गए कोड को मनुष्यों द्वारा आसानी से पढ़ा और कॉपी किया जा सकता है, कॉपीराइट के दृष्टिकोण से चिंता का विषय हो सकता है। चूँकि, कूटलेखन और अस्पष्टता की विभिन्न प्रणालियाँ मौजूद हैं। इंटरमीडिएट कोड की डिलीवरी, जैसे कि बायटेकोड, का अस्पष्टता के समान प्रभाव होता है, किन्तु बायटेकोड को डीकंपलर या डिस्सेबलर के साथ डीकोड किया जा सकता है।[citation needed]
दक्षता
दुभाषियों का मुख्य नुकसान यह है कि एक व्याख्यायित कार्यक्रम सामान्यतः संकलित होने की तुलना में धीमी गति से चलता है। गति में अंतर छोटा या बड़ा; अधिकांश परिमाण का क्रम और कभी-कभी अधिक हो सकता है। संकलित कोड को चलाने की तुलना में सामान्यतः इंटरप्रेटर के तहत प्रोग्राम चलाने में अधिक समय लगता है, किन्तु इसे संकलित करने और चलाने के लिए आवश्यक कुल समय की तुलना में इसकी व्याख्या करने में कम समय लग सकता है। यह विशेष रूप से महत्वपूर्ण है जब प्रोटोटाइप और परीक्षण कोड जब संपादन-व्याख्या-डीबग चक्र अधिकांश संपादन-संकलन-रन-डीबग चक्र से बहुत छोटा हो सकता है।[6]
संकलित कोड को चलाने की तुलना में कोड की व्याख्या करना धीमा है क्योंकि इंटरप्रेटर को प्रोग्राम में प्रत्येक कथन (कंप्यूटर साइंस) का हर बार निष्पादित होने पर उसका विश्लेषण करना चाहिए और फिर वांछित क्रिया करनी चाहिए, चूंकि संकलित कोड केवल संकलन द्वारा निर्धारित एक निश्चित संदर्भ के अन्दर कार्रवाई करता है। यह रन टाइम (प्रोग्राम जीवनचक्र चरण) विश्लेषण व्याख्यात्मक ओवरहेड के रूप में जाना जाता है। इंटरप्रेटर में चरों तक पहुंच भी धीमी होती है क्योंकि भंडारण स्थानों के लिए पहचानकर्ताओं की मैपिंग संकलन समय के अतिरिक्त रन-टाइम पर बार-बार की जानी चाहिए।[citation needed]
इंटरप्रेटर का उपयोग करते समय विकास की गति और कंपाइलर का उपयोग करते समय निष्पादन की गति के बीच कई समझौते होते हैं। कुछ प्रणालियाँ (जैसे कुछ लिस्प (प्रोग्रामिंग भाषा)) दूसरे को कॉल करने और चर साझा करने के लिए व्याख्या किए गए और संकलित कोड की अनुमति देती हैं। इसका अर्थ यह है कि बार रूटीन का परीक्षण हो जाने के बाद इंटरप्रेटर के तहत इसे संकलित किया जा सकता है और इस प्रकार तेजी से निष्पादन से लाभ होता है चूंकि अन्य रूटीन विकसित किए जा रहे हैं।[citation needed] कई दुभाषिए स्रोत कोड को निष्पादित नहीं करते हैं, किन्तु इसे कुछ अधिक कॉम्पैक्ट आंतरिक रूप में परिवर्तित करते हैं। कई बेसिक दुभाषिए कीवर्ड (कंप्यूटर प्रोग्रामिंग) को सिंगल बाइट टोकन थ्रेडिंग से बदल देते हैं जिसका उपयोग कूदने की मेज में निर्देश खोजने के लिए किया जा सकता है। कुछ व्याख्याकार, जैसे कि पीबेसिक इंटरप्रेटर, बाइट-ओरिएंटेड प्रोग्राम मेमोरी संरचना के अतिरिक्त बिट-ओरिएंटेड का उपयोग करके प्रोग्राम कॉम्पैक्शन के उच्च स्तर को प्राप्त करते हैं, जहां कमांड टोकन शायद 5 नाममात्र 16-बिट स्थिरांक में संग्रहीत होते हैं। चर-लंबाई वाले कोड में 3, 6, 10, या 18 बिट्स की आवश्यकता होती है,और एड्रेस ऑपरेंड में "बिट ऑफ़सेट" शामिल होता है। कई बेसिक दुभाषिए अपने स्वयं के टोकनयुक्त आंतरिक प्रतिनिधित्व को संग्रहीत और पढ़ सकते हैं।
इंटरप्रेटर समान व्याख्यात्मक विश्लेषण और पार्सर को कंपाइलर के रूप में अच्छी तरह से उपयोग कर सकता है और फिर परिणामी अमूर्त वाक्यविन्यास पेड़ की व्याख्या कर सकता है। उत्तरार्द्ध के लिए उदाहरण डेटा प्रकार की परिभाषाएं, और सी (प्रोग्रामिंग भाषा) अभिव्यक्तियों से प्राप्त सिंटैक्स ट्री के लिए खिलौना इंटरप्रेटर बॉक्स में दिखाया गया है।
प्रतिगमन
निष्पादन की एकमात्र विधि के रूप में व्याख्या का उपयोग नहीं किया जा सकता है: चाहे इंटरप्रेटर स्वयं व्याख्या की जा सकती है और इसी तरह, स्टैक के नीचे कहीं सीधे निष्पादित प्रोग्राम की आवश्यकता होती है क्योंकि जिस कोड की व्याख्या की जा रही है, वह परिभाषा के अनुसार नहीं है यंत्र कोड जिसे सीपीयू निष्पादित कर सकता है।[7][8]
विविधताएं
बाइटकोड इंटरप्रेटर
प्रोग्राम के निष्पादन से पहले किए गए विश्लेषण की मात्रा के आधार पर व्याख्या और संकलन के बीच संभावनाओं का स्पेक्ट्रम है। उदाहरण के लिए, ईमैक्स लिस्प को बाईटकोड में संकलित किया गया है, जो लिस्प स्रोत का अत्यधिक संकुचित और अनुकूलित प्रतिनिधित्व है, किन्तु यंत्र कोड नहीं है (और इसलिए किसी विशेष हार्डवेयर से बंधा नहीं है)। यह संकलित कोड तब बाइटकोड इंटरप्रेटर द्वारा व्याख्या किया जाता है (स्वयं सी (प्रोग्रामिंग भाषा) में लिखा गया है)। इस मामले में संकलित कोड आभासी यंत्र के लिए यंत्र कोड है, जिसे हार्डवेयर में नहीं, बल्कि बायटेकोड इंटरप्रेटर में प्रायुक्त किया गया है। ऐसे संकलन दुभाषियों को कभी-कभी कंप्रेटर्स भी कहा जाता है।[9][10] बायटेकोड इंटरप्रेटर में प्रत्येक निर्देश बाइट से प्रारंभ होता है, और इसलिए बायटेकोड दुभाषियों के पास 256 निर्देश तक होते हैं, चूंकि सभी का उपयोग नहीं किया जा सकता है। कुछ बाइटकोड एकाधिक बाइट ले सकते हैं, और मनमाने ढंग से जटिल हो सकते हैं।
नियंत्रण तालिकाएँ - जिन्हें आवश्यक रूप से संकलन चरण से गुजरने की आवश्यकता नहीं है - बायटेकोड दुभाषियों के समान अनुकूलित दुभाषियों के माध्यम से उपयुक्त एल्गोरिथम नियंत्रण प्रवाह को निर्देशित करें।
थ्रेडेड कोड दुभाषिए
थ्रेडेड कोड इंटरप्रेटर बाइटकोड दुभाषियों के समान हैं किन्तु बाइट्स के अतिरिक्त वे पॉइंटर्स का उपयोग करते हैं। प्रत्येक निर्देश शब्द है जो फ़ंक्शन या निर्देश अनुक्रम को निरुपित करता है, संभवतः पैरामीटर द्वारा पीछा किया जाता है। थ्रेडेड कोड इंटरप्रेटर या तो निर्देशों को लाने और उनके द्वारा निरुपित किए गए कार्यों को कॉल करने के लिए लूप करता है, या पहला निर्देश प्राप्त करता है और उस पर कूदता है, और प्रत्येक निर्देश अनुक्रम लाने के साथ समाप्त होता है और अगले निर्देश पर जाता है। बाइटकोड के विपरीत उपलब्ध स्मृति और पता स्थान के अतिरिक्त विभिन्न निर्देशों की संख्या पर कोई प्रभावी सीमा नहीं है। थ्रेडेड कोड का क्लासिक उदाहरण फर्मवेयर खोलें प्रणाली में उपयोग किया जाने वाला फोर्थ (प्रोग्रामिंग भाषा) कोड है: स्रोत भाषा को F कोड (बायटेकोड) में संकलित किया जाता है, जिसे बाद में वर्चुअल यंत्र द्वारा व्याख्या किया जाता है।[citation needed]
सार सिंटैक्स ट्री इंटरप्रेटर
व्याख्या और संकलन के बीच के स्पेक्ट्रम में, अन्य दृष्टिकोण स्रोत कोड को अनुकूलित सार सिंटैक्स ट्री (एएसटी) में बदलना है, फिर इस ट्री संरचना के बाद प्रोग्राम को निष्पादित करना है, या इसका उपयोग मूल कोड को समय-समय पर उत्पन्न करने के लिए करना है।[11] इस दृष्टिकोण में, प्रत्येक वाक्य को केवल बार पार्स करने की आवश्यकता होती है। बायटेकोड पर लाभ के रूप में, एएसटी वैश्विक प्रोग्राम संरचना और बयानों के बीच संबंध रखता है (जो बायटेकोड प्रतिनिधित्व में खो गया है), और जब संकुचित होता है तो अधिक कॉम्पैक्ट प्रतिनिधित्व प्रदान करता है।[12] इस प्रकार, एएसटी का उपयोग बायटेकोड की तुलना में जस्ट-इन-टाइम कंपाइलर्स के लिए बेहतर मध्यवर्ती प्रारूप के रूप में प्रस्तावित किया गया है। साथ ही, यह प्रणाली को रनटाइम के दौरान बेहतर विश्लेषण करने की अनुमति देता है।
चूंकि, दुभाषियों के लिए, एएसटी बायटेकोड इंटरप्रेटर की तुलना में अधिक ओवरहेड का कारण बनता है, क्योंकि सिंटैक्स से संबंधित नोड्स, कम अनुक्रमिक प्रतिनिधित्व (अधिक पॉइंटर्स के ट्रैवर्सल की आवश्यकता होती है) और पेड़ पर जाने वाले ओवरहेड का कोई उपयोगी काम नहीं करते हैं।[13]
जस्ट-इन-टाइम संकलन
दुभाषियों, बायटेकोड दुभाषियों और संकलन के बीच अंतर को और अधिक धुंधला करना समय-समय पर (जेआईटी) संकलन है, ऐसी तकनीक जिसमें मध्यवर्ती प्रतिनिधित्व को रनटाइम पर देशी यंत्र कोड में संकलित किया जाता है। यह मूल कोड चलाने की दक्षता प्रदान करता है, स्टार्टअप समय की कीमत पर और बाइटकोड या एएसटी पहली बार संकलित होने पर स्मृति उपयोग में वृद्धि करता है। 1960 में जॉन मैक्कार्थी (कंप्यूटर वैज्ञानिक) द्वारा सबसे पहले प्रकाशित जेआईटी कंपाइलर को सामान्यतः लिस्प (प्रोग्रामिंग भाषा) पर काम करने के लिए जिम्मेदार ठहराया जाता है।[14] अनुकूली अनुकूलन पूरक तकनीक है जिसमें इंटरप्रेटर चल रहे प्रोग्राम को प्रोफाइल करता है और इसके सबसे अधिक बार निष्पादित भागों को देशी कोड में संकलित करता है। बाद की तकनीक कुछ दशक पुरानी है, जो 1980 के दशक में स्मॉलटाक जैसी भाषाओं में दिखाई दे रही है।[15]
जस्ट-इन-टाइम संकलन ने नवीन वर्षों में भाषा कार्यान्वयनकर्ताओं के बीच मुख्य धारा का ध्यान आकर्षित किया है, जावा मंच, .NET फ्रेमवर्क, सबसे आधुनिक जावास्क्रिप्ट कार्यान्वयन और मैटलैब में अब जेआईटी कंपाइलर शामिल हैं।[citation needed]
टेम्पलेट इंटरप्रेटर
कंपाइलर और दुभाषियों के बीच अंतर को फिर से और भी अस्पष्ट बनाना विशेष इंटरप्रेटर डिज़ाइन है जिसे टेम्पलेट इंटरप्रेटर के रूप में जाना जाता है। सॉफ्टवेयर स्टैक या ट्री वॉक पर काम करते हुए, हर संभव बायटेकोड वाले बड़े स्विच स्टेटमेंट के आधार पर कोड के निष्पादन को प्रायुक्त करने के अतिरिक्त, टेम्पलेट इंटरप्रेटर बायटेकोड (या किसी भी कुशल मध्यवर्ती प्रतिनिधित्व) की बड़ी सरणी को सीधे संबंधित में मैप करता है। नेटिव यंत्र निर्देश जिन्हें होस्ट हार्डवेयर पर कुंजी मूल्य जोड़े (या अधिक कुशल डिजाइनों में, नेटिव निर्देशों के सीधे पते) के रूप में निष्पादित किया जा सकता है।[16][17] टेम्पलेट के रूप में जाना जाता है। जब विशेष कोड खंड निष्पादित किया जाता है तो इंटरप्रेटर टेम्पलेट में ओपकोड मैपिंग पर बस लोड या कूदता है और इसे सीधे हार्डवेयर पर चलाता है।[18][19] इसके डिजाइन के कारण, टेम्पलेट इंटरप्रेटर पारंपरिक इंटरप्रेटर के अतिरिक्त जस्ट-इन-टाइम कंपाइलर जैसा दिखता है, चूंकि यह तकनीकी रूप से एक जेआईटी नहीं है क्योंकि यह पूरे कोड सेगमेंट से सीपीयू निष्पादन योग्य निर्देशों के अनुकूलित अनुक्रम बनाने के अतिरिक्त एक समय में केवल भाषा से मूल कॉल में एक ऑपकोड का अनुवाद करता है। इंटरप्रेटर के सरल डिजाइन के कारण उन्हें सीधे प्रायुक्त करने के अतिरिक्त सीधे हार्डवेयर में कॉल पास करने के कारण, यह हर दूसरे प्रकार की तुलना में बहुत तेज है, यहां तक कि बायटेकोड दुभाषियों की तुलना में, और सीमा तक बग से कम प्रवण होता है, किन्तु ट्रेडऑफ़ के रूप में अधिक कठिन होता है इंटरप्रेटर को प्लेटफॉर्म स्वतंत्र वर्चुअल यंत्र/स्टैक के अतिरिक्त कई अलग-अलग आर्किटेक्चर में अनुवाद का समर्थन करने के कारण बनाए रखें। आज तक व्यापक रूप से ज्ञात भाषाओं के एकमात्र टेम्पलेट इंटरप्रेटर कार्यान्वयन जावा के आधिकारिक संदर्भ कार्यान्वयन सन हॉटस्पॉट जावा वर्चुअल मशीन[16] और गूगल वी8 जावास्क्रिप्ट निष्पादन इंजन में इग्निशन इंटरप्रेटर के अन्दर इंटरप्रेटर हैं।
स्वयं इंटरप्रेटर
स्व-इंटरप्रेटर प्रोग्रामिंग भाषा इंटरप्रेटर है जो प्रोग्रामिंग भाषा में लिखा गया है जो स्वयं व्याख्या कर सकता है; उदाहरण बेसिक में लिखा गया एक आधारभूत प्रोग्रामिंग भाषा इंटरप्रेटर है। स्व-इंटरप्रेटर स्व-होस्टिंग (कंपाइलर) से संबंधित हैं।
यदि व्याख्या की जाने वाली भाषा के लिए कोई कंपाइलर मौजूद नहीं है, तो स्व-इंटरप्रेटर बनाने के लिए मेजबान भाषा में भाषा के कार्यान्वयन की आवश्यकता होती है (जो अन्य प्रोग्रामिंग भाषा या असेंबलर (कंप्यूटिंग) हो सकती है)। इस तरह का पहला इंटरप्रेटर होने से, प्रणाली बूटस्ट्रैपिंग (कंपाइलर) है और भाषा में ही इंटरप्रेटर के नए संस्करण विकसित किए जा सकते हैं। यह इस तरह से था कि डोनाल्ड नुथ ने औद्योगिक मानक टेक्स टाइप बैठना की भाषा वेब के लिए टांगले इंटरप्रेटर विकसित किया था।
कंप्यूटर भाषा को परिभाषित करना सामान्यतः अमूर्त यंत्र (तथाकथित परिचालन सिमेंटिक्स) या गणितीय फ़ंक्शन (सांकेतिक शब्दार्थ) के संबंध में किया जाता है। भाषा को इंटरप्रेटर द्वारा भी परिभाषित किया जा सकता है जिसमें मेजबान भाषा के शब्दार्थ दिए गए हैं। स्व-इंटरप्रेटर द्वारा भाषा की परिभाषा (यह भाषा को परिभाषित नहीं कर सकता) अच्छी तरह से स्थापित नहीं है, किन्तु स्व-इंटरप्रेटर पाठक को भाषा की अभिव्यक्ति और लालित्य के बारे में बताता है। यह इंटरप्रेटर को अपने स्रोत कोड की व्याख्या करने में भी सक्षम बनाता है जो चिंतनशील व्याख्या की दिशा में पहला कदम है।
स्व-इंटरप्रेटर के कार्यान्वयन में महत्वपूर्ण डिजाइन आयाम यह है कि क्या व्याख्या की गई भाषा की विशेषता इंटरप्रेटर की मेजबान भाषा में समान सुविधा के साथ प्रायुक्त की जाती है। उदाहरण यह है कि लिस्प प्रोग्रामिंग भाषा जैसी भाषा में क्लोजर (कंप्यूटर साइंस) इंटरप्रेटर भाषा में क्लोजर का उपयोग करके प्रायुक्त किया गया है या मैन्युअल रूप से पर्यावरण को स्टोर करने वाली डेटा संरचना के साथ प्रायुक्त किया गया है। मेजबान भाषा में ही सुविधा द्वारा जितनी अधिक सुविधाएँ प्रायुक्त की जाती हैं, इंटरप्रेटर के प्रोग्रामर का नियंत्रण उतना ही कम होता है; संख्या अतिप्रवाह से निपटने के लिए अलग व्यवहार महसूस नहीं किया जा सकता है यदि अंकगणितीय संचालन को मेजबान भाषा में संबंधित संचालन के लिए प्रत्यायोजित किया जाता है।
लिस्प प्रोग्रामिंग भाषा और प्रोलॉग जैसी कुछ भाषाओं में सुरुचिपूर्ण स्व-इंटरप्रेटर हैं।[20] लिस्प की बोली, स्कीम (प्रोग्रामिंग भाषा) में स्व-दुभाषियों (विशेष रूप से चिंतनशील दुभाषियों) पर बहुत शोध किया गया है। सामान्य तौर पर, चूंकि, कोई भी ट्यूरिंग पूर्णता | ट्यूरिंग-पूर्ण भाषा अपने स्वयं के इंटरप्रेटर के लेखन की अनुमति देती है। लिस्प ऐसी भाषा है, क्योंकि लिस्प प्रोग्राम प्रतीकों और अन्य सूचियों की सूचियाँ हैं। एक्सएसएलटी ऐसी भाषा है, क्योंकि एक्सएसएलटी प्रोग्राम एक्सएमटी में लिखे जाते हैं। योजना (प्रोग्रामिंग भाषा) उप-डोमेन डोमेन-विशिष्ट भाषाओं (डीएसएल) का लेखन है।
क्लाइव गिफोर्ड ने पेश किया[21] स्व-इंटरप्रेटर की माप गुणवत्ता (आइजन अनुपात), N स्व-दुभाषियों के ढेर को चलाने में लगने वाले कंप्यूटर समय और ढेर को चलाने में लगने वाले समय के बीच अनुपात की सीमा N − 1 एन के रूप में आत्म-इंटरप्रेटर अनंत तक जाता है। यह मान चल रहे प्रोग्राम पर निर्भर नहीं करता है।
कंप्यूटर प्रोग्राम की संरचना और व्याख्या पुस्तक योजना और इसकी बोलियों के लिए मेटा-सर्कुलर मूल्यांकनकर्ता व्याख्या के उदाहरण प्रस्तुत करती है। स्व-इंटरप्रेटर वाली भाषाओं के अन्य उदाहरण फोर्थ (प्रोग्रामिंग भाषा) और पास्कल (प्रोग्रामिंग भाषा) हैं।
माइक्रोकोड
माइक्रोकोड बहुत ही सामान्य रूप से इस्तेमाल की जाने वाली तकनीक है जो कंप्यूटर के हार्डवेयर और वास्तु स्तर के बीच इंटरप्रेटर लगाती है।[22] जैसे, माइक्रोकोड हार्डवेयर-स्तर के निर्देशों की परत है जो उच्च-स्तरीय यंत्र कोड निर्देशों या कई डिजिटल प्रसंस्करण तत्वों में आंतरिक राज्य यंत्र अनुक्रमण को प्रायुक्त करता है। माइक्रोकोड का उपयोग सामान्य-उद्देश्य केंद्रीय प्रसंस्करण इकाइयों के साथ-साथ अधिक विशिष्ट प्रोसेसर जैसे कि माइक्रो नियंत्रक, डिजिटल सिग्नल प्रोसेसर, चैनल I/O, डिस्क नियंत्रक, नेटवर्क इंटरफ़ेस नियंत्रक, नेटवर्क प्रोसेसर, ग्राफ़िक्स प्रोसेसिंग युनिट और अन्य हार्डवेयर में किया जाता है।
माइक्रोकोड सामान्यतः विशेष हाई-स्पीड मेमोरी में रहता है और विस्तृत सर्किट-स्तरीय संचालन के अनुक्रम में यंत्र निर्देश, राज्य यंत्र डेटा या अन्य इनपुट का अनुवाद करता है। यह यंत्र के निर्देशों को अंतर्निहित इलेक्ट्रानिक्स से अलग करता है जिससे निर्देशों को अधिक स्वतंत्र रूप से डिज़ाइन और बदला जा सके। यह कंप्यूटर सर्किट की जटिलता को कम करते हुए जटिल मल्टी-स्टेप निर्देशों के निर्माण की सुविधा भी देता है। माइक्रोकोड लिखने को अधिकांश माइक्रोप्रोग्रामिंग कहा जाता है और विशेष प्रोसेसर कार्यान्वयन में माइक्रोकोड को कभी-कभी माइक्रोप्रोग्राम कहा जाता है।
अधिक व्यापक माइक्रोकोडिंग प्रतिद्वंद्वी को छोटे और सरल माइक्रोआर्किटेक्चर को व्यापक शब्द लंबाई, अधिक निष्पादन इकाइयों और इतने पर अधिक शक्तिशाली आर्किटेक्चर की अनुमति देता है, जो प्रोसेसर परिवार में विभिन्न उत्पादों के बीच सॉफ्टवेयर संगतता प्राप्त करने का अपेक्षाकृत सरल विधि है।
कंप्यूटर प्रोसेसर
यहां तक कि गैर-माइक्रोकोडिंग कंप्यूटर प्रोसेसर को भी पार्सिंग तत्काल निष्पादन इंटरप्रेटर माना जा सकता है जो सामान्य उद्देश्य हार्डवेयर विवरण भाषा जैसे वीएचडीएल में प्रणाली बनाने के लिए लिखा जाता है जो यंत्र कोड निर्देशों को पार्स करता है और तुरंत उन्हें निष्पादित करता है।
अनुप्रयोग
- दुभाषियों का उपयोग अधिकांश कमांड भाषाओं और ग्लू भाषाओं को निष्पादित करने के लिए किया जाता है क्योंकि कमांड भाषा में निष्पादित प्रत्येक ऑपरेटर सामान्यतः संपादक या कंपाइलर जैसे जटिल दिनचर्या का आह्वान होता है।[citation needed]
- स्व-संशोधित कोड आसानी से व्याख्या की गई भाषा में प्रायुक्त किया जा सकता है। यह लिस्प और कृत्रिम होशियारी रिसर्च में व्याख्या की उत्पत्ति से संबंधित है।[citation needed]
- वर्चुअलाइजेशन। हार्डवेयर आर्किटेक्चर के लिए अभिप्रेत यंत्र कोड को वर्चुअल यंत्र का उपयोग करके चलाया जा सकता है। इसका उपयोग अधिकांश तब किया जाता है जब कई प्रतियाँ चलाने के लिए इच्छित आर्किटेक्चर अनुपलब्ध होता है, या अन्य उपयोगों के बीच।
- सैंडबॉक्स (कंप्यूटर सुरक्षा): चूंकि कुछ प्रकार के सैंडबॉक्स ऑपरेटिंग प्रणाली की सुरक्षा पर निर्भर करते हैं, इंटरप्रेटर या वर्चुअल यंत्र का अधिकांश उपयोग किया जाता है। वास्तविक हार्डवेयर आर्किटेक्चर और मूल रूप से इच्छित हार्डवेयर आर्किटेक्चर समान हो भी सकते हैं और नहीं भी हो सकते हैं। यह व्यर्थ लग सकता है, सिवाय इसके कि सैंडबॉक्स वास्तव में उन सभी निर्देशों को निष्पादित करने के लिए बाध्य नहीं हैं जो स्रोत कोड संसाधित कर रहे हैं। विशेष रूप से, यह उस कोड को निष्पादित करने से इंकार कर सकता है जो किसी भी कंप्यूटर सुरक्षा बाधाओं का उल्लंघन करता है जिसके तहत यह काम कर रहा है।[citation needed]
- अधिक आधुनिक उपकरणों पर अप्रचलित और अनुपलब्ध हार्डवेयर के लिए लिखे गए कंप्यूटर सॉफ़्टवेयर चलाने के लिए प्रतिद्वंद्वी बनाया गया हैं।
यह भी देखें
- आधारभूत इंटरप्रेटर
- कमांड-लाइन इंटरप्रेटर
- संकलित भाषा
- गतिशील संकलन
- समजातीयता
- मेटा-सर्कुलर मूल्यांकनकर्ता
- आंशिक मूल्यांकन
संदर्भ
- ↑ In this sense, the CPU is also an interpreter, of machine instructions.
- ↑ Although this scheme (combining strategy 2 and 3) was used to implement certain BASIC interpreters already in the 1970s, such as the efficient BASIC interpreter of the ABC 80, for instance.
- ↑ Bennett, J. M.; Prinz, D. G.; Woods, M. L. (1952). "Interpretative sub-routines". Proceedings of the ACM National Conference, Toronto.
- ↑ According to what reported by Paul Graham in Hackers & Painters, p. 185, McCarthy said: "Steve Russell said, look, why don't I program this eval..., and I said to him, ho, ho, you're confusing theory with practice, this eval is intended for reading, not for computing. But he went ahead and did it. That is, he compiled the eval in my paper into IBM 704 machine code, fixing bug, and then advertised this as a Lisp interpreter, which it certainly was. So at that point Lisp had essentially the form that it has today..."
- ↑ "Why was the first compiler written before the first interpreter?". Ars Technica. 8 November 2014. Retrieved 9 November 2014.
- ↑ "Compilers vs. interpreters: explanation and differences". IONOS Digital Guide (in English). Retrieved 2022-09-16.
- ↑ Theodore H. Romer, Dennis Lee, Geoffrey M. Voelker, Alec Wolman, Wayne A. Wong, Jean-Loup Baer, Brian N. Bershad, and Henry M. Levy, The Structure and Performance of Interpreters
- ↑ Terence Parr, Johannes Luber, The Difference Between Compilers and Interpreters Archived 2014-01-06 at the Wayback Machine
- ↑ Kühnel, Claus (1987) [1986]. "4. Kleincomputer - Eigenschaften und Möglichkeiten" [4. Microcomputer - Properties and possibilities]. In Erlekampf, Rainer; Mönk, Hans-Joachim (eds.). शौकिया अभ्यास में माइक्रोइलेक्ट्रॉनिक [Micro-electronics for the practical amateur] (in Deutsch) (3 ed.). Berlin: Militärverlag der Deutschen Demokratischen Republik , Leipzig. p. 222. ISBN 3-327-00357-2. 7469332.
- ↑ Heyne, R. (1984). "U880 के लिए बेसिक कॉम्पिटर" [BASIC compreter for U880 (Z80)]. radio-fernsehn-elektronik (in Deutsch). 1984 (3): 150–152.
- ↑ AST intermediate representations, Lambda the Ultimate forum
- ↑ Kistler, Thomas; Franz, Michael (February 1999). "A Tree-Based Alternative to Java Byte-Codes" (PDF). International Journal of Parallel Programming. 27 (1): 21–33. CiteSeerX 10.1.1.87.2257. doi:10.1023/A:1018740018601. ISSN 0885-7458. S2CID 14330985. Retrieved 2020-12-20.
- ↑ Surfin' Safari - Blog Archive » Announcing SquirrelFish. Webkit.org (2008-06-02). Retrieved on 2013-08-10.
- ↑ Aycock 2003, 2. JIT Compilation Techniques, 2.1 Genesis, p. 98.
- ↑ L. Deutsch, A. Schiffman, Efficient implementation of the Smalltalk-80 system, Proceedings of 11th POPL symposium, 1984.
- ↑ Jump up to: 16.0 16.1 "openjdk/jdk". GitHub. 18 November 2021.
- ↑ "HotSpot Runtime Overview". Openjdk.java.net. Retrieved 2022-08-06.
- ↑ "Demystifying the JVM: JVM Variants, Cppinterpreter and TemplateInterpreter". metebalci.com.
- ↑ "JVM template interpreter". ProgrammerSought.
- ↑ Bondorf, Anders. "Logimix: A self-applicable partial evaluator for Prolog." Logic Program Synthesis and Transformation. Springer, London, 1993. 214-227.
- ↑ Gifford, Clive. "Eigenratios of Self-Interpreters". Blogger. Retrieved 10 November 2019.
- ↑ Kent, Allen; Williams, James G. (April 5, 1993). Encyclopedia of Computer Science and Technology: Volume 28 - Supplement 13. New York: Marcel Dekker, Inc. ISBN 0-8247-2281-7. Retrieved Jan 17, 2016.
बाहरी संबंध
- 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.