क्या अजगर की व्याख्या या संकलन किया गया है?


76

यह केवल एक आश्चर्य की बात है जो मैंने व्याख्या और संकलित भाषाओं के बारे में पढ़ते हुए की थी।

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

अब पायथन में आ रहा है :

  • आयात करने पर एक अजगर कोड ( somefile.py ) उसी निर्देशिका में एक फ़ाइल ( somefile.pyc ) बनाता है । हम कहते हैं कि आयात एक अजगर खोल या django मॉड्यूल में किया जाता है। आयात के बाद मैं कोड को थोड़ा बदल देता हूं और आयात किए गए कार्यों को फिर से निष्पादित करता हूं ताकि यह पता चले कि यह अभी भी पुराने कोड को चला रहा है। इससे पता चलता है कि * .pyc फाइलें एक सी फाइल के संकलन के बाद बनाई गई निष्पादन योग्य के समान अजगर फाइलें संकलित हैं, हालांकि मैं * .pyc फाइल को सीधे निष्पादित नहीं कर सकता।
  • जब python फ़ाइल (somefile.py) को सीधे निष्पादित किया जाता है (./omefile.py या python somefile.py) no .pyc फ़ाइल बनाई जाती है और कोड को निष्पादित किया जाता है जैसा कि व्याख्या किए गए व्यवहार को इंगित करता है।

ये सुझाव देते हैं कि एक अजगर कोड को हर बार संकलित किया जाता है जब इसे एक नई प्रक्रिया में आयात किया जाता है एक .pyc बनाने के लिए जब इसे सीधे निष्पादित किया जाता है।

तो मुझे किस प्रकार की भाषा पर विचार करना चाहिए? व्याख्या या संकलित? और इसकी दक्षता की व्याख्या और संकलित भाषाओं की तुलना कैसे होती है?

विकी के इंटरप्रिटेड लैंग्वेजेज पेज के अनुसार , इसे वर्चुअल मशीन कोड में संकलित भाषा के रूप में सूचीबद्ध किया गया है, इसका क्या मतलब है?


1
जब संदेह होता है कि क्या रूबी एक व्याख्या की गई भाषा है? जब यह संकलित है। :) macruby.org
mipadi

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

@ आइंस्टीन इवर्ट: ब्रावो! अप्लेसॉफ्ट बेसिक (1980 में) बाइट-कोड संकलित किया गया था। इस मामले में "आधुनिक" का अर्थ है, जीवित स्मृति में हर व्याख्या की गई भाषा एकमात्र संभव अपवाद के साथ कुछ अल्पविकसित डार्टमाउथ मूल कार्यान्वयन।
S.Lott

6
>> इसके विपरीत सी एक संकलित भाषा है << root.ern.ch/drupal/content/cint
igouy

3
@ एस.लॉट: Applesoft और '80 के दशक के दुभाषियों ने किया था "tokenization की प्रक्रिया को" बायटेकोड संकलन "कहा जाता है, जो थोड़ा विवादास्पद है। हां, उपयोगकर्ता द्वारा दर्ज किया गया प्रोग्राम कोड मेमोरी में एक संचित रूप में, एक बाइट प्रति आरक्षित शब्द में संग्रहीत किया गया था, लेकिन जब तक आप टाइप नहीं करते तब तक कुछ भी नहीं किया गया था RUN। यह ऐसा था जैसे कि आपके पास एक कंपाइलर था जो लेक्सिंग स्टेप करता था और फिर टोकन की एक स्ट्रीम को आउटपुट करता था जिसे हर बार प्रोग्राम चलाने के बाद रिप्रजेंट करना पड़ता था। आधुनिक बायोटेक संकलन की तरह बिल्कुल नहीं, जैसा कि कहा जाता है, javacजिसमें लेक्सिंग, पार्सिंग और अनुकूलन शामिल हैं।
डोडेटस्टेस्ट्रोलर

जवाबों:


80

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

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

(मैं कहता हूँ "बहुत ज्यादा हर" क्योंकि मैं अजगर के लिए किसी भी देशी मशीन संकलक के बारे में नहीं जानता, लेकिन मैं यह दावा नहीं करना चाहता कि कोई भी कहीं भी मौजूद नहीं है।)


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

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

5
साइथॉन पायथन कोड को C में संकलित करता है ताकि इसे एक साझा वस्तु के रूप में संकलित किया जा सके।
ग्रेफेड

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

@Jules संयोग से, Jython कोड वास्तव में .class फ़ाइलों में संकलित किया गया है, जो मुझे लगता है कि जब तक आप py स्रोत को संशोधित नहीं करते हैं, तब तक पुन: उपयोग किया जाता है।
जिम्मीजम्स

35

अजगर बाइट कोड की व्याख्या के तहत गिर जाएगा। .pyस्रोत कोड को पहले बाइट कोड के रूप में संकलित किया जाता है .pyc। इस बाइट कोड की व्याख्या की जा सकती है (आधिकारिक CPython), या JIT संकलित (PyPy)। Python source कोड ( .py) को अलग-अलग बाइट कोड जैसे IronPython (.Net) या Jython (JVM) से संकलित किया जा सकता है। पायथन भाषा के कई कार्यान्वयन हैं। आधिकारिक एक एक बाइट कोड है जिसकी व्याख्या की गई है। बाइट कोड जेआईटी संकलित कार्यान्वयन भी हैं।

भाषाओं के विभिन्न कार्यान्वयन की गति तुलना के लिए आप यहाँ कोशिश कर सकते हैं


जानकारी के लिए thanx। बेंचमार्क के अनुसार अजगर का प्रदर्शन नीचे है!
crodjer

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

1
@ jase21 - "2006 के लिए मेरी योजना Psyco में लागू तकनीकों को PyPy में पोर्ट करने की है। PyPy हमें एक अधिक लचीला JIT स्पेशलिस्ट बनाने, प्रयोग करने में आसान और बिना ओवरहेड के सिंक के साथ तालमेल बनाए रखने की अनुमति देगा। पायथन भाषा। " psyco.sourceforge.net/introduction.html
igouy

1
@ jase21 - "सी कोड भागों की तुलना में अजगर कोड तेजी से चलते हैं" - क्या हम सिर्फ उसके लिए अपना शब्द लेने वाले हैं?
.गोई

3
उत्तर में लिंक टूटा हुआ है।
बसिलेव्स

11

संकलित बनाम संकलित कुछ संदर्भों में सहायक हो सकता है, लेकिन जब एक तकनीकी अर्थ में लागू किया जाता है, तो यह एक गलत द्वंद्व है।

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

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


उदाहरण के लिए, ले लो re.compile। यह एक मध्यवर्ती रूप में एक रेगीक्स को "संकलित" करता है, और उस मध्यवर्ती रूप की व्याख्या / मूल्यांकन / निष्पादित किया जाता है।


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

CPython (पायथन भाषा का सबसे लोकप्रिय कार्यान्वयन) कोड निष्पादित करने के लिए ज्यादातर दिलचस्प है। इसलिए सीपीथॉन को आमतौर पर व्याख्या के रूप में वर्णित किया जाएगा। हालांकि यह एक ढीला लेबल है।


7

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

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

जहाँ तक मुझे पता है रूबी> = 1.9 पायथन जैसी आभासी मशीन का भी उपयोग करता है।


5

पायथन रनटाइम एक वर्चुअल मशीन पर कस्टम ऑब्जेक्ट कोड (बाइट कोड) चलाता है।

संकलन प्रक्रिया स्रोत कोड को ऑब्जेक्ट कोड में परिवर्तित करती है।

चीजों को गति देने के लिए, ऑब्जेक्ट कोड (या बाइट कोड, यदि आप पसंद करते हैं) को डिस्क पर संग्रहीत किया जाता है, तो इसे अगली बार प्रोग्राम चलाने पर पुन: उपयोग किया जा सकता है।

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