Ngay cả tôi cũng gặp vấn đề tương tự khi hiểu CPython, JPython, IronPython, PyPy khác nhau như thế nào.
Vì vậy, tôi sẵn sàng làm rõ ba điều trước khi bắt đầu giải thích:
- Python : Đây là một ngôn ngữ, nó chỉ nêu / mô tả cách truyền đạt / thể hiện bản thân với người phiên dịch (chương trình chấp nhận mã python của bạn).
- Thực hiện : Đó là tất cả về cách người phiên dịch được viết, cụ thể, bằng ngôn ngữ nào và cuối cùng nó làm gì .
- Mã byte : Đây là mã được xử lý bởi một chương trình, thường được gọi là máy ảo, thay vì máy tính "thực", bộ xử lý phần cứng.
CPython là việc thực hiện, được viết bằng ngôn ngữ C. Nó kết thúc việc tạo ra mã byte (bộ hướng dẫn dựa trên máy stack), cụ thể là Python và sau đó thực thi nó. Lý do để chuyển đổi mã Python thành mã byte là bởi vì việc triển khai trình thông dịch sẽ dễ dàng hơn nếu nó trông giống như hướng dẫn của máy. Nhưng, không cần thiết phải tạo một số mã byte trước khi thực thi mã Python (nhưng CPython không tạo ra).
Nếu bạn muốn xem mã byte của CPython thì bạn có thể. Đây là cách bạn có thể:
>>> 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
Bây giờ, chúng ta hãy xem mã trên. Dòng 1 đến 6 là một định nghĩa hàm. Trong dòng 8, chúng tôi nhập mô-đun 'dis' có thể được sử dụng để xem mã byte trung gian của Python (hoặc bạn có thể nói, trình dịch ngược mã cho mã byte Python) được tạo bởi CPython (trình thông dịch).
LƯU Ý : Tôi đã nhận được liên kết tới mã này từ kênh #python IRC: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c
Và sau đó, có Jython, được viết bằng Java và cuối cùng tạo ra mã byte Java. Mã byte Java chạy trên Môi trường chạy thi hành Java, đây là một triển khai của Máy ảo Java (JVM). Nếu điều này gây nhầm lẫn thì tôi nghi ngờ rằng bạn không biết Java hoạt động như thế nào. Theo thuật ngữ layman, mã Java (ngôn ngữ, không phải trình biên dịch) được trình biên dịch Java lấy và xuất ra một tệp (là mã byte Java) chỉ có thể chạy bằng JRE. Điều này được thực hiện sao cho, khi mã Java được biên dịch thì nó có thể được chuyển sang các máy khác ở định dạng mã byte Java, chỉ có thể được chạy bởi JRE. Nếu điều này vẫn còn gây nhầm lẫn thì bạn có thể muốn xem trang web này .
Ở đây, bạn có thể hỏi liệu mã byte của CPython có di động như Jython không, tôi nghi ngờ là không. Mã byte được tạo ra trong triển khai CPython dành riêng cho trình thông dịch đó để giúp thực thi mã dễ dàng hơn (tôi cũng nghi ngờ rằng, việc sản xuất mã byte trung gian như vậy, chỉ để dễ xử lý được thực hiện trong nhiều trình thông dịch khác).
Vì vậy, trong Jython, khi bạn biên dịch mã Python, bạn kết thúc bằng mã byte Java, có thể chạy trên JVM.
Tương tự, IronPython (được viết bằng ngôn ngữ C #) biên dịch mã Python của bạn thành Common Language Runtime (CLR), đây là một công nghệ tương tự như so với JVM, được phát triển bởi Microsoft.