यहां तक कि मुझे यह समझने में भी यही समस्या थी कि सीपीथॉन, जेपीथॉन, आयरनपिथॉन, PyPy एक दूसरे से अलग कैसे हैं।
इसलिए, मैं तीन चीजों को स्पष्ट करने के लिए तैयार हूं इससे पहले कि मैं व्याख्या करना शुरू करूं:
- अजगर : यह एक भाषा है, यह केवल व्याख्या करने वाले (खुद को अपने अजगर कोड को स्वीकार करने वाले कार्यक्रम) को व्यक्त / व्यक्त करने का वर्णन / वर्णन करता है।
- कार्यान्वयन : यह सब के बारे में है कि दुभाषिया कैसे लिखा गया था, विशेष रूप से, किस भाषा में और यह क्या करता है ।
- बाइटकोड : यह एक कोड है जिसे एक प्रोग्राम द्वारा संसाधित किया जाता है, जिसे आमतौर पर "वास्तविक" कंप्यूटर मशीन, हार्डवेयर प्रोसेसर के बजाय एक वर्चुअल मशीन के रूप में संदर्भित किया जाता है।
सीपीथॉन कार्यान्वयन है, जो सी भाषा में लिखा गया था। यह बाइटकोड (स्टैक-मशीन बेस्ड इंस्ट्रक्शन सेट) का उत्पादन करता है जो पायथन विशिष्ट है और फिर इसे निष्पादित करता है। पायथन कोड को बाईटेकोड में बदलने का कारण यह है कि मशीन के निर्देशों की तरह लगने पर दुभाषिया को लागू करना आसान होता है। लेकिन, पायथन कोड के निष्पादन से पहले कुछ बायटेकोड का उत्पादन करना आवश्यक नहीं है (लेकिन सीपीथॉन उत्पादन करता है)।
यदि आप CPython के bytecode को देखना चाहते हैं तो आप कर सकते हैं। यहाँ है कि आप कैसे कर सकते हैं:
>>> def f(x, y): # line 1
... print("Hello") # line 2
... if x: # line 3
... y += x # line 4
... print(x, y) # line 5
... return x+y # line 6
... # line 7
>>> import dis # line 8
>>> dis.dis(f) # line 9
2 0 LOAD_GLOBAL 0 (print)
2 LOAD_CONST 1 ('Hello')
4 CALL_FUNCTION 1
6 POP_TOP
3 8 LOAD_FAST 0 (x)
10 POP_JUMP_IF_FALSE 20
4 12 LOAD_FAST 1 (y)
14 LOAD_FAST 0 (x)
16 INPLACE_ADD
18 STORE_FAST 1 (y)
5 >> 20 LOAD_GLOBAL 0 (print)
22 LOAD_FAST 0 (x)
24 LOAD_FAST 1 (y)
26 CALL_FUNCTION 2
28 POP_TOP
6 30 LOAD_FAST 0 (x)
32 LOAD_FAST 1 (y)
34 BINARY_ADD
36 RETURN_VALUE
अब, उपरोक्त कोड पर एक नजर डालते हैं। लाइन्स 1 से 6 एक फ़ंक्शन परिभाषा है। पंक्ति 8 में, हम 'डिस' मॉड्यूल का आयात करते हैं जिसका उपयोग मध्यवर्ती पायथन बायटेकोड को देखने के लिए किया जा सकता है (या आप कह सकते हैं, पायथन बाइटकोड के लिए disassembler) जो कि सीपीथॉन (दुभाषिया) द्वारा उत्पन्न होता है।
नोट : मुझे इस कोड का लिंक #python IRC चैनल से मिला: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c
और फिर, Jython है, जो जावा में लिखा गया है और जावा बाइट कोड का निर्माण करता है। जावा बाइट कोड जावा रनटाइम पर्यावरण पर चलता है, जो जावा वर्चुअल मशीन (जेवीएम) का कार्यान्वयन है। यदि यह भ्रामक है तो मुझे संदेह है कि आपके पास कोई सुराग नहीं है कि जावा कैसे काम करता है। आम शब्दों में, जावा (भाषा, संकलक नहीं) कोड जावा संकलक द्वारा लिया जाता है और एक फ़ाइल (जो जावा बाइट कोड है) को आउटपुट करता है जिसे केवल JRE का उपयोग करके चलाया जा सकता है। ऐसा इसलिए किया जाता है कि जब एक बार जावा कोड संकलित हो जाता है तो इसे जावा बाइट कोड प्रारूप में अन्य मशीनों में पोर्ट किया जा सकता है, जिसे केवल JRE द्वारा चलाया जा सकता है। यदि यह अभी भी भ्रमित हो रहा है तो आप इस वेब पेज पर एक नज़र डालना चाहते हैं ।
यहाँ, आप पूछ सकते हैं कि क्या CPython का बायटेकोड Jython की तरह पोर्टेबल है, मुझे संदेह नहीं है। बाईटकोड CPython कार्यान्वयन में उत्पादित कोड के आगे निष्पादन के लिए यह आसान बनाने के लिए है कि दुभाषिया के लिए विशिष्ट था (मैं यह भी कहा कि, इस तरह के मध्यवर्ती बाईटकोड उत्पादन संदेह है, बस आसानी के लिए प्रसंस्करण के कई अन्य व्याख्याकार में किया जाता है)।
तो, Jython में, जब आप अपना Python कोड संकलित करते हैं, तो आप Java बाइट कोड के साथ समाप्त होते हैं, जिसे JVM पर चलाया जा सकता है।
इसी प्रकार, आयरनपाइथन (सी # भाषा में लिखा गया) आपके पायथन कोड को कॉमन लैंग्वेज रनटाइम (सीएलआर) के रूप में संकलित करता है, जो माइक्रोसॉफ्ट द्वारा विकसित जेवीएम की तुलना में एक समान तकनीक है।