क्या एक दुभाषिया मशीन कोड का उत्पादन करता है?


42

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

मेरे पास "फोबिश" नामक भाषा है और इसके कीवर्ड हैं

<OUTPUT> 'TEXT', <Number_of_Repeats>;

इसलिए यदि मैं 10 बार कंसोल पर प्रिंट करना चाहता हूं, तो मैं लिखूंगा

OUTPUT 'Hello World', 10;

हैलो वर्ल्ड.ऑफोबिश-फाइल।

अब मैं अपनी पसंद की भाषा में एक दुभाषिया लिखता हूँ - इस मामले में C #:

using System;

namespace FoobishInterpreter
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            analyseAndTokenize(Hello World.foobish-file)//Pseudocode
            int repeats = Token[1];
            string outputString = Token[0];
            for (var i = 0; i < repeats; i++)
            {
                Console.WriteLine(outputString);
            }
        }
    }
}

एक बहुत आसान दुभाषिया स्तर पर, दुभाषिया स्क्रिप्ट-फ़ाइल आदि का विश्लेषण करेगा और दुभाषिया के कार्यान्वयन के तरीके में फोबिश-भाषा का निष्पादन करेगा।

क्या कंपाइलर मशीन की भाषा बनाएगा जो सीधे भौतिक हार्डवेयर पर चलता है?

तो एक दुभाषिया मशीन भाषा का उत्पादन नहीं करता है, लेकिन एक संकलक इसे अपने इनपुट के लिए करता है?

क्या मुझे मूल तरीके से कोई गलतफहमी है कि कंपाइलर और दुभाषिए कैसे काम करते हैं?


21
आपको क्या लगता है कि C # "कंपाइलर" क्या करता है? एक संकेत के रूप में, यह मशीन कोड का उत्पादन नहीं करता है
फिलिप केंडल

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

@ जिओर्जियो: आपका मतलब है, जेआईटी की तरह?
रॉबर्ट हार्वे

2
@ रोबर्टहवे: मेरा मतलब जावा कम्पाइलर (जेवैक) से है: जहाँ तक मुझे पता है कि यह जेवीएम के लिए बाइटकोड का उत्पादन करता है। और, फिर से AFAIK, JIT बाद में (रनटाइम पर) कुछ बाइटकोड को संकलित करता है जो देशी मशीन भाषा में बहुत बार उपयोग किया जाता है।
जियोर्जियो

4
संकलक का अर्थ है अनुवाद करना। यह सभी प्रकार की भाषा का उत्सर्जन कर सकता है: सी, असेंबली, जावास्क्रिप्ट, मशीन कोड।
एसेन स्कोव पेडरसन

जवाबों:


77

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

लेकिन आज "संकलक" और "दुभाषिया" के उपयोग पर कई विविधताएं हैं। उदाहरण के लिए, VB6 बाइट कोड ( इंटरमीडिएट भाषा का एक रूप ) के लिए "संकलित" करता है , जो तब VB रनटाइम द्वारा "व्याख्या" किया जाता है। इसी तरह की प्रक्रिया C # में होती है, जो CIL का उत्पादन करती है जिसे तब जस्ट-इन-टाइम कंपाइलर (JIT) द्वारा निष्पादित किया जाता है , जो पुराने दिनों में, एक दुभाषिया के रूप में सोचा जाता था। आप NGIT.exe का उपयोग करके JIT के आउटपुट को वास्तविक बाइनरी निष्पादन योग्य "फ्रीज-ड्राई" कर सकते हैं , जिसके उत्पाद पुराने दिनों में एक संकलक का परिणाम होता ।

तो आपके प्रश्न का उत्तर लगभग उतना सीधा नहीं है जितना कि एक बार था।

इसके अलावा रीडिंग
कंपाइलर बनाम विकिपीडिया पर व्याख्याकार


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

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

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

4
जैसा कि मेरी बहुत सीमित समझ है, इन दिनों x86 CPUs हार्डवेयर आधारित JIT इंजन होने के लिए आधे रास्ते हैं, विधानसभा के साथ कभी-कभी लुप्त होती संबंध के साथ जो वास्तव में निष्पादित होता है।
लेउशेंको

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

34

नीचे दिया गया सारांश "कंपाइलर्स, प्रिंसिपल्स, टेक्निक्स, एंड टूल्स", अहो, लाम, सेठी, उल्मान, (पियर्सन इंटरनेशनल एडिशन, 2007), पेज 1, 2 पर आधारित है, जिसमें मेरे अपने कुछ विचार हैं।

एक कार्यक्रम के प्रसंस्करण के लिए दो बुनियादी तंत्र संकलन और व्याख्या हैं

संकलन एक दिए गए भाषा में एक स्रोत कार्यक्रम के रूप में लेता है और लक्ष्य भाषा में एक लक्ष्य कार्यक्रम को आउटपुट करता है।

source program --> | compiler | --> target program

यदि लक्ष्य भाषा मशीन कोड है, तो इसे कुछ प्रोसेसर पर सीधे निष्पादित किया जा सकता है:

input --> | target program | --> output

संकलन में संपूर्ण इनपुट प्रोग्राम (या मॉड्यूल) को स्कैन और अनुवाद करना शामिल है और इसे निष्पादित करना शामिल नहीं है।

व्याख्या स्रोत प्रोग्राम और उसके इनपुट को इनपुट के रूप में लेती है, और स्रोत प्रोग्राम के आउटपुट का उत्पादन करती है

source program, input --> | interpreter | --> output

व्याख्या में आमतौर पर एक बार में एक कथन के प्रसंस्करण (विश्लेषण और निष्पादन) को शामिल किया जाता है।

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

source program --> | translator | --> intermediate program

इस चरण के आउटपुट को तब वर्चुअल मशीन द्वारा निष्पादित (व्याख्यायित) किया जाता है:

intermediate program + input --> | virtual machine | --> output

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

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

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

फिर भी, संकलन और व्याख्या दो अलग-अलग प्रकार के प्रसंस्करण हैं, जैसा कि ऊपर दिए गए चित्र में वर्णित है,

प्रारंभिक सवालों के जवाब देने के लिए।

एक कंपाइलर मशीन भाषा बनाएगा जो सीधे भौतिक हार्डवेयर पर चलता है?

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

तो एक दुभाषिया मशीन भाषा का उत्पादन नहीं करता है, लेकिन एक संकलक इसे अपने इनपुट के लिए करता है?

यदि आप उत्पादन करके उत्पादन की बात कर रहे हैं, तो एक संकलक एक लक्ष्य कार्यक्रम का उत्पादन करता है जो मशीन भाषा में हो सकता है, एक दुभाषिया नहीं करता है।


7
दूसरे शब्दों में: एक दुभाषिया एक प्रोग्राम P लेता है और अपना आउटपुट O पैदा करता है, एक कंपाइलर P लेता है और एक प्रोग्राम P outputs आउटपुट करता है O; दुभाषियों में अक्सर ऐसे घटक शामिल होते हैं जो संकलक होते हैं (जैसे, बायटेकोड, एक मध्यवर्ती प्रतिनिधित्व या JIT मशीन निर्देश) और इसी तरह एक संकलक में एक दुभाषिया शामिल हो सकता है (जैसे, संकलन-समय की गणना का मूल्यांकन करने के लिए)।
जॉन पुरडी

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

और भी सरल, C प्रीप्रोसेसर, C स्रोत कोड को CP C के निर्देश के साथ सादे C में संकलित करता है, और जैसे बूलियन अभिव्यक्तियों के लिए दुभाषिया शामिल करता है defined A && !defined B
जॉन पुरडी

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

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

22

एक कंपाइलर मशीन की भाषा बनाएगा

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

एक कंपाइलर एक उच्च-स्तरीय भाषा से दूसरी उच्च-स्तरीय भाषा (जैसे GWT, जो जावा को ECMAScript के लिए संकलित करता है), एक उच्च-स्तरीय भाषा से निम्न-स्तरीय भाषा (जैसे Gambit, जो C को स्कीम संकलित करता है) से संकलित कर सकता है। एक उच्च-स्तरीय भाषा से मशीन कोड तक (जैसे GCJ, जो जावा को मूल कोड के लिए संकलित करता है), निम्न-स्तरीय भाषा से उच्च-स्तरीय भाषा (उदाहरण के लिए, जो C से जावा, Lua, पर्ल, ECMAScript और आम को संकलित करता है) लिस्प), एक निम्न-स्तरीय भाषा से दूसरी निम्न-स्तरीय भाषा (उदाहरण के लिए एंड्रॉइड एसडीके, जो जेवीएमएल बायटेकोड को डाल्विक बाइटेकोड के लिए संकलित करता है), एक निम्न-स्तरीय भाषा से मशीन कोड तक (जैसे C1X कंपार्टमेंट) जो हॉटस्पॉट का हिस्सा है, जो मशीन कोड के लिए JVML बायोटेक को संकलित करता है), मशीन कोड को एक उच्च-स्तरीय भाषा (किसी भी तथाकथित "डिकंपाइलर" भी, ईस्मिप्टेन, जो ECMAScript के लिए LLVM मशीन कोड को संकलित करता है),निम्न-स्तरीय भाषा के लिए मशीन कोड (जैसे जेपीसी में जेआईटी कंपाइलर, जो जे 86 एमटेक को जेवीएमएल बायोटेक कोड के लिए संकलित करता है) और मूल कोड के लिए देशी कोड (जैसे पीआईपीसी में जेआईटी कंपाइलर, जो पावर कोड को एक्स 86 मूल कोड को संकलित करता है)।

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

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

  • यदि भाषा A को भाषा B के समान रूप से अमूर्त के समान स्तर पर माना जाता है , तो संकलक को ट्रांसपिलर कहा जा सकता है (उदाहरण के लिए रूबी-से-ECMAScript-transpiler या ECMAScript2015-से-ECMAScript5-transpiler)
  • यदि भाषा A को भाषा B की तुलना में निम्न स्तर के स्तर पर माना जाता है , तो संकलक को एक डिकंपाइलर कहा जा सकता है (जैसे एक x86- मशीन-कोड-से-डिकम्पाइलर)
  • यदि भाषा एक == भाषा बी , संकलक एक कहा जाता है हो सकता है अनुकूलक , अस्पष्टकर्ता , या minifier (संकलक के विशेष कार्य के आधार पर)

जो सीधे भौतिक हार्डवेयर पर चलता है?

जरुरी नहीं। इसे दुभाषिया में या वीएम में चलाया जा सकता है। इसे आगे एक अलग भाषा में संकलित किया जा सकता है।

तो एक दुभाषिया मशीन भाषा का उत्पादन नहीं करता है, लेकिन एक संकलक इसे अपने इनपुट के लिए करता है?

एक दुभाषिया कुछ भी पैदा नहीं करता है। यह सिर्फ कार्यक्रम चलाता है।

एक कंपाइलर कुछ पैदा करता है, लेकिन जरूरी नहीं कि वह मशीन की भाषा हो, यह किसी भी भाषा का हो सकता है। यह इनपुट भाषा के समान भाषा भी हो सकती है! उदाहरण के लिए, Supercompilers, LLC में एक कंपाइलर है जो जावा को अपने इनपुट के रूप में लेता है और अपने आउटपुट के रूप में अनुकूलित जावा का उत्पादन करता है। कई ECMAScript कंपाइलर हैं जो ECMAScript को अपने इनपुट के रूप में लेते हैं और अपने आउटपुट के रूप में अनुकूलित, minified और obfuscated ECMAScript का उत्पादन करते हैं।


इसमें आपकी भी रुचि हो सकती है:


16

मुझे लगता है कि आपको "संकलक बनाम दुभाषिया" की धारणा को पूरी तरह से छोड़ देना चाहिए , क्योंकि यह एक गलत द्वैध है।

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

अमूर्त प्रोग्रामिंग भाषा को वास्तविक दुनिया में उपयोगी बनाने के लिए सामूहिक शब्द कार्यान्वयन है

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

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

कार्यान्वयन योजनाओं के उदाहरणों में शामिल हैं:

  • एसी कंपाइलर जो C को x86 मशीन कोड में बदल देता है, और एक x86 CPU जो उस कोड को निष्पादित करता है।
  • AC कंपाइलर जो C को LLVM IR में बदलता है, एक LLVM बैकएंड कंपाइलर जो LLVM IR को x86 मशीन कोड में बदलता है, और एक x86 CPU जो उस कोड को निष्पादित करता है।
  • एसी कंपाइलर जो C को LLVM IR में बदलता है, और LLVM दुभाषिया जो LLVM IR को निष्पादित करता है।
  • एक जावा कंपाइलर जो जावा को JVM बायटेकोड में बदल देता है, और एक JRE को उस कोड को निष्पादित करने वाले दुभाषिया के साथ।
  • एक जावा कंपाइलर जो जावा को जेवीएम बायटेकोड में बदलता है, और एक जेआरई दोनों इंटरप्रेटर के साथ जो उस कोड के कुछ हिस्सों को निष्पादित करता है और एक कंपाइलर जो उस कोड के अन्य भागों को x86 मशीन कोड में बदल देता है, और एक x86 कोड जो उस कोड को निष्पादित करता है।
  • एक जावा कंपाइलर जो जावा को JVM बायटेकोड में बदल देता है, और एक ARM CPU जो उस कोड को निष्पादित करता है।
  • एसी # संकलक जो C # को CIL में बदल देता है, एक CLR एक संकलक के साथ जो CIL को x86 मशीन कोड में बदल देता है, और एक x86 CPU जो उस कोड को निष्पादित करता है।
  • एक रूबी दुभाषिया जो रूबी को निष्पादित करता है।
  • रूबी और रूबी को निष्पादित करने वाले एक दुभाषिया दोनों के साथ एक रूबी वातावरण जो रूबी को x86 मशीन कोड में बदल देता है, और एक x86 सीपीयू जो उस कोड को निष्पादित करता है।

...और इसी तरह।


+1 यह इंगित करने के लिए कि मध्यवर्ती प्रतिनिधित्व के लिए डिज़ाइन किए गए एन्कोडिंग (जैसे जावा बायटेकोड) में हार्डवेयर कार्यान्वयन हो सकते हैं।
जूल्स

7

जबकि समय के साथ कंपाइलरों और दुभाषियों के बीच की रेखाओं में फ़ज़ीहत हो गई है, फिर भी कोई भी उनके बीच की लाइन को देख सकता है कि प्रोग्राम को क्या करना चाहिए और कंपाइलर / दुभाषिया को क्या करना चाहिए।

एक कंपाइलर एक अन्य प्रोग्राम (आमतौर पर मशीन कोड की तरह निचले स्तर की भाषा में) उत्पन्न करेगा, जो कि अगर उस प्रोग्राम को चलाया जाता है, तो वह वही करेगा जो आपके प्रोग्राम को करना चाहिए।

एक दुभाषिया वही करेगा जो आपके कार्यक्रम को करना चाहिए।

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


5

यहां कंपाइलरों और दुभाषियों के बीच एक सरल वैचारिक मतभेद है।

3 भाषाओं पर विचार करें: प्रोग्रामिंग भाषा, पी (कार्यक्रम क्या लिखा है); डोमेन भाषा, डी (चल रहे कार्यक्रम के साथ क्या होता है); और लक्ष्य भाषा, टी (कुछ तीसरी भाषा)।

वैचारिक रूप से,

  • एक कंपाइलर P से T का अनुवाद करता है ताकि आप T (D) का मूल्यांकन कर सकें; जहाँ तक

  • एक दुभाषिया सीधे P (D) का मूल्यांकन करता है।


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

4
@RobertHarvey यह शर्तों के बीच वैचारिक भेद को नहीं बदलता है।
लॉरेंस

1
तो क्या आप वास्तव में दुभाषिया के रूप में संदर्भित कर रहे हैं वह हिस्सा है जो मध्यवर्ती प्रतिनिधित्व का मूल्यांकन करता है। बात यह है कि बनाता है मध्यवर्ती प्रतिनिधित्व एक है संकलक अपने परिभाषा के द्वारा,।
रॉबर्ट हार्वे

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

1
बहुत बढ़िया जवाब। वर्थ नोटिंग: आजकल आप "ट्रांसपिलर" सुन सकते हैं। यह एक कंपाइलर है जहां पी और टी समान स्तर की कुछ परिभाषा के लिए अमूर्त के समान स्तर हैं। (उदा। ES5 से ES6 ट्रांसपिलर।)
पॉल ड्रेपर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.