แม้ว่าฉันจะมีปัญหาเดียวกันกับการทำความเข้าใจว่า CPython, JPython, IronPython, PyPy แตกต่างกันอย่างไร
ดังนั้นฉันยินดีที่จะล้างสามสิ่งก่อนที่จะเริ่มอธิบาย:
- Python : มันเป็นภาษามันมีเพียงรัฐ / อธิบายถึงวิธีการถ่ายทอด / แสดงตัวเองเพื่อล่าม (โปรแกรมที่ยอมรับรหัสหลามของคุณ)
- การดำเนินงาน : มันคือทั้งหมดที่เกี่ยวกับวิธีการล่ามถูกเขียนขึ้นโดยเฉพาะในสิ่งที่ภาษาและสิ่งที่มันจบลงด้วยการทำ
- Bytecode : มันเป็นรหัสที่ประมวลผลโดยโปรแกรมซึ่งโดยปกติจะเรียกว่าเครื่องเสมือนแทนที่จะใช้เครื่องคอมพิวเตอร์ "ของจริง" ตัวประมวลผลฮาร์ดแวร์
CPython เป็นการใช้งานซึ่งเขียนด้วยภาษา C มันจบลงด้วยการผลิต bytecode (ชุดคำสั่งตามสแต็ก - เครื่องจักร) ซึ่งเป็น Python ที่เฉพาะเจาะจงจากนั้นเรียกใช้งานมัน เหตุผลในการแปลงรหัส Python เป็น bytecode นั้นเป็นเพราะง่ายต่อการใช้ล่ามหากดูเหมือนว่าคำแนะนำเครื่อง แต่ก็ไม่จำเป็นที่จะต้องสร้าง bytecode บางตัวก่อนที่จะทำการประมวลผลของรหัส Python (แต่ CPython จะสร้างขึ้นมา)
หากคุณต้องการดูรหัสไบต์ของ CPython คุณก็สามารถทำได้ นี่คือวิธีที่คุณสามารถ:
>>> 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 เรานำเข้าโมดูล 'dis' ซึ่งสามารถใช้เพื่อดู Python bytecode ระดับกลาง (หรือคุณสามารถพูดถอดชิ้นส่วนสำหรับ Python bytecode) ที่สร้างโดย CPython (interpreter)
หมายเหตุ : ฉันได้ลิงค์ไปยังรหัสนี้จาก #python IRC channel: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c
จากนั้นมี Jython ซึ่งเขียนด้วยภาษาจาวาและสร้างโค้ด Java byte ขึ้นมา โค้ด Java byte รันบน Java Runtime Environment ซึ่งเป็นการปรับใช้ Java Virtual Machine (JVM) หากนี่สับสนแล้วฉันสงสัยว่าคุณไม่มีเงื่อนงำว่า Java ทำงานอย่างไร ในแง่คนธรรมดาโค้ด Java (ภาษาไม่ใช่คอมไพเลอร์) ถูกใช้โดยคอมไพเลอร์ Java และส่งออกไฟล์ (ซึ่งคือโค้ด Java byte) ที่สามารถรันได้โดยใช้ JRE เท่านั้น สิ่งนี้ถูกทำเพื่อที่ว่าเมื่อโค้ด Java ถูกคอมไพล์จึงสามารถถูกพอร์ตไปยังเครื่องอื่นในรูปแบบโค้ดไบต์ Java ซึ่งสามารถรันได้โดย JRE เท่านั้น หากสิ่งนี้ยังคงสับสนอยู่คุณอาจต้องการดูสิ่งนี้หน้าเว็บ
ที่นี่คุณอาจถามว่าไบต์เทคโทนของ CPython นั้นพกพาได้เหมือนกับ Jython หรือไม่ฉันไม่สงสัย bytecode ผลิตในการดำเนิน CPython เป็นที่เฉพาะเจาะจงกับล่ามว่าสำหรับการทำให้มันง่ายสำหรับการดำเนินการต่อไปของรหัส (ผมยังสงสัยว่าเช่นการผลิต bytecode กลางเพียงเพื่อความสะดวกของการประมวลผลจะทำในล่ามอื่น ๆ อีกมากมาย)
ดังนั้นใน Jython เมื่อคุณรวบรวมรหัส Python ของคุณคุณจะจบลงด้วยรหัส Java byte ซึ่งสามารถทำงานบน JVM
ในทำนองเดียวกัน IronPython (เขียนด้วยภาษา C #) จะรวบรวมรหัส Python ของคุณเป็น Common Language Runtime (CLR) ซึ่งเป็นเทคโนโลยีที่คล้ายคลึงกันเมื่อเทียบกับ JVM ที่พัฒนาโดย Microsoft