संकलित और व्याख्या की गई भाषा के बीच अंतर क्या है?


118

इस विषय पर कुछ सामग्री पढ़ने के बाद मुझे अभी भी यकीन नहीं है कि संकलित भाषा और व्याख्या की गई भाषा के बीच अंतर क्या है। मुझे बताया गया था कि यह जावा और जावास्क्रिप्ट के बीच अंतर है। क्या कोई इसे समझने में मेरी मदद करेगा?

जवाबों:


165

संकलित और व्याख्या की गई भाषा के बीच अंतर क्या है?

अंतर भाषा में नहीं है; यह कार्यान्वयन में है

मेरे सिस्टम से बाहर निकलने के बाद, यहाँ एक जवाब है:

  • एक संकलित कार्यान्वयन में, मूल कार्यक्रम को देशी मशीन निर्देशों में अनुवादित किया जाता है, जिन्हें सीधे हार्डवेयर द्वारा निष्पादित किया जाता है।

  • एक कार्यान्वित कार्यान्वयन में, मूल कार्यक्रम का अनुवाद कुछ और में किया जाता है। एक अन्य कार्यक्रम, जिसे "दुभाषिया" कहा जाता है, फिर "कुछ और" की जांच करता है और जो कुछ भी कार्यों के लिए कहा जाता है वह करता है। भाषा और इसके कार्यान्वयन के आधार पर, "कुछ और" के विभिन्न रूप हैं। अधिक लोकप्रिय से कम लोकप्रिय, "कुछ और" हो सकता है

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

    • मूल कार्यक्रम का एक पेड़-जैसा प्रतिनिधित्व, जैसे अमूर्त-वाक्यविन्यास पेड़, जैसा कि कई प्रोटोटाइप या शैक्षिक दुभाषियों के लिए किया जाता है।

    • Tcl के समान स्रोत कार्यक्रम का एक टोकन निरूपण

    • स्रोत कार्यक्रम के पात्र, जैसा कि MINT और TRAC में किया गया था

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


7
सर, मेरे निम्नलिखित प्रश्न हैं 1. किस भाषा में "कुछ और" लिखा गया है? 2. और जावास्क्रिप्ट के संदर्भ में, क्या यह "कुछ और" ब्राउज़र से ब्राउज़र में भिन्न है? 3. कहो, मेरी स्क्रिप्ट Google Chrome और Internet Explorer में चल रही है, क्या इसकी व्याख्या दोनों ब्राउज़रों में समान है?
JavaHopper

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

58

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

धारीदार-पाठ के माध्यम से क्यों? जैसा कि यह उत्तर सही ढंग से बताता है, व्याख्या / संकलित भाषा के ठोस कार्यान्वयन के बारे में है, न कि प्रति भाषा के बारे में । जबकि "सी एक संकलित भाषा है" जैसे कथन आम तौर पर सच हैं, किसी को सी भाषा दुभाषिया लिखने से रोकने के लिए कुछ भी नहीं है। वास्तव में, C के लिए दुभाषिए मौजूद हैं

मूल रूप से, संकलित कोड को कंप्यूटर के सीपीयू द्वारा सीधे निष्पादित किया जा सकता है। यही है, निष्पादन योग्य कोड सीपीयू की "मूल" भाषा ( विधानसभा भाषा ) में निर्दिष्ट है ।

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

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


8
जावा की व्याख्या की जाती है? विकिपीडिया से: "जावा अनुप्रयोगों को आमतौर पर बायटेकोड (क्लास फ़ाइल) के लिए संकलित किया जाता है, जो कंप्यूटर आर्किटेक्चर की परवाह किए बिना किसी भी जावा वर्चुअल मशीन (जेवीएम) पर चल सकता है।"
कार्मिक

6
@Permanman जो अभी भी तकनीकी रूप से "व्याख्यायित" है क्योंकि JVM कोड को निष्पादित कर रहा है, न कि OS को। इसका वास्तव में एक अर्थगत अंतर है, जैसा कि कोई कह सकता है कि आधुनिक OSes की जटिलता मूल रूप से अधिकांश स्थितियों के लिए अप्रासंगिक है। ऐप चलाने वाले OS और OS के बीच के अंतर के बारे में आपकी बात हो रही है और एक ऐप जो कोड चला रहा है।
ग्रेविज़ोरक्स

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

13
जावा एक संकलित या व्याख्या की गई भाषा का एक बहुत बुरा उदाहरण है क्योंकि यह दोनों अनिवार्य रूप से है। अगर मैं एक तुलना करने जा रहा था, मैं किसी भी भ्रम से बचने के लिए सी और लिस्प के साथ जाऊंगा।
छिपकली का बिल

7
@stakx - वास्तव में जावा बाइटकोड आमतौर पर एक जेआईटी संकलक द्वारा मूल कोड के लिए संकलित किया जाता है। शुद्ध दुभाषिया व्यवहार प्राप्त करने का एकमात्र तरीका JVM लॉन्च होने पर स्पष्ट रूप से JIT संकलक को बंद करना है।
स्टीफन सी

15

यहाँ कम्पाइलर बनाम इंटरप्रेटर भाषा के बीच बुनियादी अंतर है।

संकलक भाषा

  • पूरे कार्यक्रम को एकल इनपुट के रूप में लेता है और इसे ऑब्जेक्ट कोड में परिवर्तित करता है जो फ़ाइल में संग्रहीत होता है।
  • इंटरमीडिएट ऑब्जेक्ट कोड उत्पन्न होता है
  • जैसे: C, C ++
  • संकलित कार्यक्रम तेजी से चलते हैं क्योंकि निष्पादन से पहले संकलन किया जाता है।
  • ऑब्जेक्ट कोड के निर्माण के कारण मेमोरी की आवश्यकता अधिक होती है।
  • पूरे कार्यक्रम के संकलित होने के बाद त्रुटि प्रदर्शित की जाती है
  • सोर्स कोड --- कंपाइलर --- मशीन कोड --- आउटपुट

दुभाषिया भाषा:

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

5

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

यदि आपको अधिक जानकारी की आवश्यकता है, तो बस "कंपाइलर और दुभाषिया के बीच अंतर" के लिए Google।


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

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

2

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

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

स्रोत कोड को संकलित करने के लिए उस पर एक प्रोग्राम चलाना है जो एक बाइनरी, निष्पादन योग्य फ़ाइल उत्पन्न करता है, जो जब चलता है, तो स्रोत द्वारा परिभाषित व्यवहार होता है। उदाहरण के लिए, javac मानव-रीडबेल .java फ़ाइलों को मशीन-पठनीय .class फ़ाइलों में संकलित करता है।

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


जबकि जावा पहले बाइटकोड में अनुवाद करता है और केवल जेवीएम निष्पादित करते समय इसे मशीन कोड में परिवर्तित करता है; क्या यह कहना सही है कि इसे संकलित किया गया है और इसकी व्याख्या नहीं की गई है?
सिसिर

1
मुझे लगता है कि आप कह सकते हैं कि जावा बाइटकोड की व्याख्या की गई है, निश्चित रूप से, लेकिन कोई भी जावा बाइटकोड नहीं लिखता है। जावा स्वयं आमतौर पर बायटेकोड के लिए संकलित है।
कार्मिक

2

शेल स्क्रिप्टिंग और संकलित भाषा जैसे निर्देशों के अनुसार रन समय में व्याख्या की गई भाषा को निष्पादित किया जाता है, जिसे संकलित किया जाता है (असेंबली भाषा में परिवर्तित किया जाता है, जिसे CPU समझ सकता है) और फिर c ++ की तरह निष्पादित किया जाता है।


0

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

हालाँकि, हम (और व्यवहार में हम करते हैं) प्रोग्रामिंग भाषाओं को इसके सबसे सामान्य (कभी-कभी विहित) कार्यान्वयन के आधार पर वर्गीकृत कर सकते हैं। उदाहरण के लिए, हम कहते हैं कि सी संकलित है।

सबसे पहले, हमें अस्पष्ट दुभाषियों और संकलक के बिना परिभाषित करना चाहिए:

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

एक संकलक से एक्स के लिए वाई एक प्रोग्राम (या एक मशीन, या सिर्फ सामान्य रूप में तंत्र के कुछ प्रकार) है कि किसी भी कार्यक्रम के लिए अनुवाद है पी कुछ भाषा से एक्स एक शब्दार्थ बराबर कार्यक्रम में पी ' कुछ भाषा में वाई कि व्याख्या इस तरह से पी ' Y के लिए दुभाषिया के साथ समान परिणाम प्राप्त होंगे और X के लिए दुभाषिया के साथ p की व्याख्या करने के समान प्रभाव होंगे ।

ध्यान दें कि प्रोग्रामर के दृष्टिकोण से, सीपीयू अपनी संबंधित देशी मशीन भाषा के लिए मशीन दुभाषिए हैं।

अब, हम प्रोग्रामिंग भाषाओं का एक अस्थायी वर्गीकरण 3 श्रेणियों में कर सकते हैं जो इसके सबसे सामान्य कार्यान्वयन पर निर्भर करता है:

  • हार्ड संकलित भाषाएं: जब प्रोग्राम पूरी तरह से मशीन भाषा में संकलित किए जाते हैं। उपयोग किया जाने वाला एकमात्र दुभाषिया एक सीपीयू है। उदाहरण: आमतौर पर, C में एक प्रोग्राम को चलाने के लिए, स्रोत कोड को मशीन भाषा में संकलित किया जाता है, जिसे तब CPU द्वारा निष्पादित किया जाता है।
  • व्याख्या की गई भाषाएं: जब मशीन को मूल कार्यक्रम के किसी भी भाग का संकलन नहीं होता है। दूसरे शब्दों में, कोई नया मशीन कोड उत्पन्न नहीं होता है; केवल मौजूदा मशीन कोड निष्पादित किया गया है। सीपीयू के अलावा एक दुभाषिया भी इस्तेमाल किया जाना चाहिए (आमतौर पर एक कार्यक्रम)। उदाहरण के लिए: पायथन के विहित कार्यान्वयन में, स्रोत कोड को पहले पायथन बाइटकोड के लिए संकलित किया जाता है और फिर बाइटकोड को सीपीथॉन द्वारा निष्पादित किया जाता है, जो पायथन बाइटकोड के लिए एक दुभाषिया कार्यक्रम है
  • नरम संकलित भाषाएँ: जब सीपीयू के अलावा एक दुभाषिया का उपयोग किया जाता है, लेकिन मूल कार्यक्रम के कुछ हिस्सों को भी मशीन भाषा में संकलित किया जा सकता है। यह जावा का मामला है, जहां स्रोत कोड को पहले बाइटकोड के लिए संकलित किया जाता है और फिर, बाईटकोड की व्याख्या जावा इंटरप्रेटर द्वारा की जा सकती है और / या जेआईटी संकलक द्वारा संकलित की जाती है।

कभी-कभी, नरम और कठोर संकलित भाषाओं को केवल संकलित करने के लिए संदर्भित किया जाता है, इस प्रकार C #, Java, C, C ++ को संकलित किया जाता है।

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

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