Bahkan saya memiliki masalah yang sama dalam memahami bagaimana CPython, JPython, IronPython, PyPy berbeda satu sama lain.
Jadi, saya bersedia untuk membersihkan tiga hal sebelum saya mulai menjelaskan:
- Python : Ini adalah bahasa, hanya menyatakan / menjelaskan cara menyampaikan / mengekspresikan diri kepada penerjemah (program yang menerima kode python Anda).
- Implementasi : Ini semua tentang bagaimana penerjemah ditulis, khususnya, dalam bahasa apa dan apa yang akhirnya dilakukan .
- Bytecode : Ini adalah kode yang diproses oleh suatu program, biasanya disebut sebagai mesin virtual, bukan oleh mesin komputer "nyata", prosesor perangkat keras.
CPython adalah implementasinya, yang ditulis dalam bahasa C. Itu akhirnya menghasilkan bytecode (set instruksi berbasis stack-machine) yang spesifik Python dan kemudian mengeksekusinya. Alasan untuk mengkonversi kode Python ke bytecode adalah karena lebih mudah untuk mengimplementasikan juru bahasa jika itu terlihat seperti instruksi mesin. Tapi, tidak perlu menghasilkan bytecode sebelum eksekusi kode Python (tapi CPython menghasilkan).
Jika Anda ingin melihat bytecode CPython maka Anda bisa. Begini caranya:
>>> 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
Sekarang, mari kita lihat kode di atas. Baris 1 hingga 6 adalah definisi fungsi. Pada baris 8, kita mengimpor modul 'dis' yang dapat digunakan untuk melihat bytecode Python perantara (atau Anda dapat mengatakan, disassembler untuk bytecode Python) yang dihasilkan oleh CPython (interpreter).
CATATAN : Saya mendapatkan tautan ke kode ini dari saluran #python IRC: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c
Dan kemudian, ada Jython, yang ditulis dalam Java dan akhirnya menghasilkan kode byte Java. Kode byte Java berjalan pada Java Runtime Environment, yang merupakan implementasi dari Java Virtual Machine (JVM). Jika ini membingungkan maka saya curiga Anda tidak tahu bagaimana Java bekerja. Dalam istilah awam, kode Java (bahasa, bukan kompiler) diambil oleh kompiler Java dan menghasilkan file (yang merupakan kode byte Java) yang dapat dijalankan hanya menggunakan JRE. Hal ini dilakukan agar, begitu kode Java dikompilasi, maka kode itu dapat di-porting ke komputer lain dalam format kode byte Java, yang hanya dapat dijalankan oleh JRE. Jika ini masih membingungkan maka Anda mungkin ingin melihat halaman web ini .
Di sini, Anda mungkin bertanya apakah bytecode CPython portable seperti Jython, saya kira tidak. The bytecode yang dihasilkan dalam pelaksanaan CPython adalah khusus untuk yang interpreter untuk membuatnya mudah untuk eksekusi kode selanjutnya (Saya juga menduga bahwa, produksi bytecode menengah seperti, hanya untuk kemudahan dalam pengolahan dilakukan di banyak penafsir lainnya).
Jadi, dalam Jython, ketika Anda mengkompilasi kode Python Anda, Anda berakhir dengan kode byte Java, yang dapat dijalankan pada JVM.
Demikian pula, IronPython (ditulis dalam bahasa C #) mengkompilasi kode Python Anda ke Common Language Runtime (CLR), yang merupakan teknologi serupa dibandingkan dengan JVM, yang dikembangkan oleh Microsoft.