Ketika kita menjalankan python3 halo.py, sesuatu terjadi di antara tombol Enter dan munculnya teks di layar. Memahami perjalanan tersebut menjelaskan banyak hal yang kelak kita temui: file aneh bernama __pycache__, kecepatan Python, hingga cara error dilaporkan. Pada Chapter ini kita menelusuri alur kerja Python dari source code sampai eksekusi.
Alur Kerja: Dari Teks Menjadi Aksi #
Python sering disebut bahasa interpreted, tetapi proses di balik layarnya terdiri dari dua tahap:
- Compiler Python membaca source code. Ketika interpreter Python menjalankan file
.py, kode teks tersebut terlebih dahulu diurai dan diterjemahkan menjadi bytecode — instruksi ringkas untuk mesin virtual milik Python. - Python Virtual Machine mengeksekusi bytecode. Python Virtual Machine (PVM) adalah bagian dari interpreter yang membaca instruksi bytecode satu per satu dan menjalankannya.
Jadi Python tidak menerjemahkan kode langsung menjadi bahasa mesin seperti C atau C++, melainkan menjadi bytecode yang dieksekusi PVM. Inilah sebabnya istilah yang lebih presisi untuk CPython adalah bytecode interpreter.
Bukti Bytecode di Disk #
Kita tidak perlu memercayai teori di atas begitu saja; interpreter Python menyimpan hasil terjemahan bytecode ke disk. Mari kita buktikan. Buat file geometri.py berikut:
PI = 3.14159
def luas_lingkaran(jari_jari):
return PI * jari_jari ** 2Kemudian impor module tersebut dari Python:
$ python3 -c "import geometri; print(geometri.luas_lingkaran(7))"
153.93791Setelah perintah tersebut dijalankan, muncul folder baru di sebelah geometri.py:
__pycache__/
└── geometri.cpython-312.pycFile .pyc di dalam __pycache__ adalah bytecode hasil terjemahan. Interpreter menyimpannya agar import berikutnya tidak perlu menerjemahkan ulang source code yang sama — selama file .py tidak berubah. Jika kita mengedit geometri.py, interpreter otomatis menerjemahkan ulang dan menimpa file .pyc lama.
Melihat Isi Bytecode dengan Module dis #
Standard library menyediakan module dis (disassembler) untuk melihat instruksi bytecode yang sebenarnya. Mari kita bedah fungsi penjumlahan sederhana:
import dis
def tambah(a, b):
return a + b
dis.dis(tambah)Output yang Dihasilkan:
3 0 RESUME 0
4 2 LOAD_FAST 0 (a)
4 LOAD_FAST 1 (b)
6 BINARY_OP 0 (+)
10 RETURN_VALUEKita tidak perlu menghafal instruksi di atas. Yang penting ditangkap:
- Baris 3 dan 4 di kolom paling kiri menunjukkan nomor baris source code asal setiap instruksi —
def tambah(a, b)ada di baris 3,return a + bada di baris 4. Nomor baris inilah yang muncul ketika Python melaporkan error. - Instruksi
LOAD_FAST: PVM mengambil nilai argumenta, lalub, dan menaruhnya di tumpukan (stack) internal. - Instruksi
BINARY_OP 0 (+): PVM mengambil dua nilai teratas dari stack, menjumlahkannya, lalu meletakkan hasilnya kembali. - Instruksi
RETURN_VALUE: hasil penjumlahan dikembalikan ke pemanggil fungsi.
Expression sekecil a + b ternyata dijabarkan PVM menjadi rangkaian instruksi yang eksplisit. Semua kode Python — dari yang paling sederhana sampai framework raksasa — pada akhirnya berbentuk instruksi seperti ini.
Konsekuensi Bagi Kita #
Alur kerja ini menjelaskan dua sifat penting Python:
- Portabilitas tinggi. Bytecode berjalan di atas PVM, bukan langsung di prosesor. Satu file
.pydapat dijalankan di Windows, macOS, dan Linux tanpa perubahan, masing-masing oleh interpreter untuk platformnya. - Kompilasi terasa “tidak ada”. Karena compiler Python bekerja otomatis setiap kali kode dijalankan, kita tidak pernah menjalankan langkah kompilasi manual — tetapi fase penerjemahan tetap ada, dan error sintaks tetap terdeteksi sebelum satu baris pun dieksekusi.
Ada satu konsekuensi lagi yang sering dikeluhkan: eksekusi bytecode lebih lambat daripada kode C yang menjadi machine code asli. Untuk sebagian besar pekerjaan — scripting, analisis data, web — selisih ini tidak terasa. Ketika terasa, library komputasi NumPy dan kawan-kawan menjalankan bagian beratnya di kode C. Kita akan menyentuh topik performa pada section Memory dan Performance.
Setelah memahami alur source code → bytecode → PVM, pertanyaan berikutnya adalah bagaimana Python dibandingkan dengan bahasa lain yang memilih jalur berbeda — pembahasan pada Chapter Python vs Bahasa Pemrograman Lain.