क्या पायथन की व्याख्या, या संकलित, या दोनों है?


190

मेरी समझ से:

एक व्याख्या की गई भाषा एक उच्च-स्तरीय भाषा है और एक दुभाषिया (एक प्रोग्राम जो उच्च-स्तरीय भाषा को मशीन कोड और फिर निष्पादित करने के लिए परिवर्तित करता है) के द्वारा चलती है; यह एक समय में प्रोग्राम को थोड़ा प्रोसेस करता है।

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

अगर मेरी परिभाषा गलत है तो मुझे सुधारो।

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



2
जब भी कोई पुस्तकालय आयात किया जाता है तो पायथन .pyc फाइलें (तथाकथित बाइबॉस) बनाता है। AFAIK बाइटकोड केवल लोड समय को गति दे सकता है, निष्पादन समय नहीं।
जेस्विन जोस

2
@aitchnyu: .pyc फाइल को कैटेककोड में कैशिंग करने से वास्तव में लोडिंग में तेजी आती है, लेकिन केवल पायस कोड ही बिकता है, वैसे भी निष्पादन से पहले बाइटकोड को संकलित किया जाता है। हालांकि मुझे नहीं लगता कि यह विशेष रूप से पायथन के साथ करने की कोशिश की गई है, अन्य भाषा कार्यान्वयन यह दिखाते हैं कि बाईटेकोड वास्तव में एक सादे एएसटी की तुलना में कुशलता से व्याख्या करना आसान है, या इससे भी बदतर, बिना स्रोत वाला कोड। उदाहरण के लिए, एएसटी से पुराने रूबी संस्करणों की व्याख्या की गई थी, और नए संस्करणों द्वारा एएफएआईके ने काफी बेहतर प्रदर्शन किया था, जो कि बाइटकोड को संकलित करता है।

असभ्य ध्वनि करना चाहते हैं, लेकिन यह नहीं है कि मेरा क्या मतलब था (लेकिन जैसा कि आपको सूचित नहीं किया गया है)?
जेसविन जोस

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

जवाबों:


231

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

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

लेकिन नाइटपैकिंग को रोकने और आपके द्वारा पूछे जाने वाले प्रश्न का उत्तर देने के लिए: व्यावहारिक रूप से (पढ़ें: कुछ लोकप्रिय और परिपक्व कार्यान्वयन का उपयोग करके), पायथन संकलित है । मशीन कोड को समय से पहले संकलित नहीं किया गया (यानी प्रतिबंधित और गलत द्वारा "संकलित", लेकिन आम परिभाषा), "केवल" बायटेकोड पर संकलित किया गया है , लेकिन यह अभी भी कम से कम कुछ लाभों के साथ संकलन है। उदाहरण के लिए, बयान a = b.c()को एक बाइट स्ट्रीम के लिए संकलित किया जाता है, जब "असंतुष्ट", कुछ हद तक दिखता है load 0 (b); load_str 'c'; get_attr; call_function 0; store 1 (a)। यह एक सरलीकरण है, यह वास्तव में कम पठनीय और थोड़ा अधिक निम्न-स्तर है - आप मानक पुस्तकालय disमॉड्यूल के साथ प्रयोग कर सकते हैं और देख सकते हैं कि वास्तविक सौदा कैसा दिखता है।

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


2
ठीक है, इसका मतलब है कि एक पायथन लिपि को पहले बाइटकोड में संकलित किया जाता है और फिर इसे दुभाषिया जैसे कि सीपीथॉन, ज्यथॉन या आयरनपिथॉन आदि द्वारा कार्यान्वित किया जाता है
पंकज उपाध्याय

19
नहीं, यह बाइटकोड के लिए संकलित है और फिर संबंधित वीएम द्वारा बायटेकोड निष्पादित किया जाता है। CPython संकलक और VM दोनों हैं, लेकिन Jython और IronPython केवल संकलक हैं।
इग्नासियो वाज़केज़-अब्राम्स

1
@ इगासियो: मेरे पास आयरनपीथॉन / ज्येथन के साथ ज्यादा अनुभव नहीं है, लेकिन कम से कम जाइथन इंटरप्रेटर जैसी परत प्रदान नहीं करता है? मुझे विश्वास नहीं होता कि पायथन को वैधानिक रूप से टाइप किए गए जेवीएम बायटेकोड में बदलना संभव है। फिर भी, कंपाइलर और दुभाषिए के एक ही पैकेज का हिस्सा होने के बारे में अच्छी बात है।

2
+1 "... कार्यान्वयन की एक संपत्ति"। मैंने खुद कहा होगा "यह एक इंटरैक्टिव शेल के लिए अनुमति देता है"
जेसविन जोस

2
@ डायलेन: वैसे, ज्यथॉन पायथन भाषा और जावा वीएम के बीच मध्यस्थ की तरह काम करता है, लेकिन यह जावा बाइटकोड को संकलित करता है।
इग्नासियो वाज़क्वेज़-अब्राम्स

34

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

पायथन दुभाषिया पहले मानव कोड को पढ़ता है और इसे मशीन कोड में व्याख्या करने से पहले कुछ मध्यवर्ती कोड के लिए अनुकूलित करता है। इसीलिए आपको हमेशा C ++ के विपरीत, जहां आप अपने कोड के संकलित निष्पादन योग्य को सीधे चला सकते हैं, पायथन स्क्रिप्ट को चलाने के लिए एक और प्रोग्राम की आवश्यकता होती है। उदाहरण के लिए, c:\Python27\python.exeया /usr/bin/python


11
मुझे "इसे चलाने के लिए एक और कार्यक्रम की आवश्यकता है" के बारे में बात पसंद है। इससे मेरे कुछ विचारों को स्पष्ट करने में मदद मिली।
मैट

इसलिए python.exe पहले कोड का अनुकूलन करता है और फिर उसकी व्याख्या करता है?
कोरे तुगय

@KorayTugay, जब python.exe को मानव पठनीय पाठ स्रोत कोड दिया जाता है, यह पहले अनुकूलित बाइट कोड का उत्पादन करता है, फिर व्याख्या करता है कि (जैसा कि आप कहते हैं); हालाँकि, जब पहले से ही एक बाइट कोड फ़ाइल (पूर्व-संकलित) है, तो उसे पहला चरण नहीं करना है, जो कुछ समय बचाता है।
गॉर्डनबूड

31

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

लेकिन आपको बताता है कि आप PyPy का उपयोग कर रहे हैं जो कि एक और मानक CPython कार्यान्वयन है। यह एक जस्ट-इन-टाइम कंपाइलर का उपयोग करेगा ।


बाइटकोड के अनुवाद के दौरान इसे एक संकलक की आवश्यकता होती है जो एक है?
RICKY

पेपी एक पायथन कार्यान्वयन है, न कि "सीपीथॉन" कार्यान्वयन। वास्तव में, Pypy CPython ( pypy.org/features.html ) का एक विकल्प है ।
जियोर्जियो

13

पायथन की आधिकारिक वेबसाइट के अनुसार यह एक व्याख्या की गई भाषा है।

https://www.python.org/doc/essays/blurb/

पायथन एक व्याख्या, वस्तु-उन्मुख, उच्च-स्तरीय प्रोग्रामिंग भाषा है ...

...

चूंकि कोई संकलन कदम नहीं है ...

...

अजगर दुभाषिया और व्यापक मानक पुस्तकालय उपलब्ध हैं ...

...

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


7

हाँ, यह भाषा का संकलन और व्याख्या दोनों है। फिर हम आम तौर पर इसे व्याख्या भाषा क्यों कहते हैं?

देखें कि यह दोनों कैसे संकलित और व्याख्या किए गए हैं?

सबसे पहले मैं यह बताना चाहता हूं कि यदि आप जावा दुनिया से हैं तो आपको मेरा जवाब ज्यादा पसंद आएगा।

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

javac Hello.java -------> हैलो.क्लास का उत्पादन करता है फ़ाइल का

जावा नमस्ते --------> JVM को निर्देशन बायटेकोड निष्पादन उद्देश्य के

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

अजगर हेलो -------> सीधे कोड को उत्तेजित करता है और हम आउटपुट को साबित करते हुए देख सकते हैं कि कोड वाक्यविन्यास रूप से सही है

@ अजगर हेलो ऐसा लगता है कि यह सीधे निष्पादित होता है, लेकिन वास्तव में यह पहली बार उत्पन्न करता है जिसे व्याख्याकार द्वारा निष्पादन उद्देश्य के लिए मूल कोड का उत्पादन करने के लिए व्याख्या की जाती है।

CPython - संकलन और व्याख्या दोनों की जिम्मेदारी लेता है।

यदि आपको अधिक विवरण की आवश्यकता हो तो नीचे की पंक्तियों में देखें :

मैंने कहा था कि CPython स्रोत कोड को संकलित करता है, लेकिन वास्तविक संकलन की मदद से होता है cython तो व्याख्या की मदद से होता है CPython

अब जावा और पायथन में जस्ट-इन-टाइम कंपाइलर की भूमिका के बारे में थोड़ा बात करते हैं

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

अजगर में प्राप्त करने के लिए तेजी से निष्पादन एक और अजगर कार्यान्वयन (का उपयोग दुभाषिया के आसपास पाने के लिए PyPy के बजाय) CPythonयहाँ क्लिक सहित अजगर के अन्य कार्यान्वयन के लिए PyPy


6

अगर (आप जावा को जानते हैं) {

पायथन कोड को बायटेकोड में बदल दिया जाता है जैसे जावा करता है।
हर बार जब आप इसे एक्सेस करने का प्रयास करते हैं तो उस बायोटेक को फिर से निष्पादित किया जाता है।

} और {

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

}


2

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


1

न्यूबीज के लिए

पायथन स्वचालित रूप से संकलित कोड के लिए आपकी स्क्रिप्ट को संकलित करता है, इसलिए इसे चलाने से पहले बाइट कोड कहा जाता है।

स्क्रिप्ट चलाना आयात नहीं माना जाता है और न ही .pyc बनाया जाएगा।

उदाहरण के लिए, यदि आपके पास एक स्क्रिप्ट फ़ाइल abc.py है जो किसी अन्य मॉड्यूल xyz.py को आयात करती है, जब आप abc.py चलाते हैं, xyz.pyc xyz आयात होने के बाद बनाई जाएगी, लेकिन abc के बाद से कोई abc.pyc फ़ाइल नहीं बनाई जाएगी। पाई आयात नहीं की जा रही है।


0

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

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

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


0

पायथन (दुभाषिया) संकलित है

प्रमाण: यदि यह सिंटैक्स त्रुटि है, तो यह आपके कोड को भी संकलित नहीं करेगा

उदाहरण 1:

print("This should print") 
a = 9/0 

आउटपुट:

This should print
Traceback (most recent call last):
  File "p.py", line 2, in <module>
    a = 9/0
ZeroDivisionError: integer division or modulo by zero

कोड सफलतापूर्वक संकलित हो जाता है। पहली पंक्ति निष्पादित हो जाती है ( print) दूसरी पंक्ति फेंकता है ZeroDivisionError(रन टाइम एरर)।

उदाहरण 2:

print("This should not print")
/0         

आउटपुट:

  File "p.py", line 2
    /0
    ^
SyntaxError: invalid syntax

निष्कर्ष : यदि आपकी कोड फ़ाइल में SyntaxErrorकुछ भी नहीं है तो संकलन विफल हो जाएगा।

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