Ini adalah kebingungan besar bagi orang-orang yang mulai mengerjakan python dan jawabannya di sini sedikit sulit untuk dipahami sehingga saya akan membuatnya lebih mudah.
Saat kami memerintahkan Python untuk menjalankan skrip kami, ada beberapa langkah yang dilakukan Python sebelum kode kami benar-benar mulai berangsur-angsur hilang:
- Ini dikompilasi ke bytecode.
- Kemudian diarahkan ke mesin virtual.
Ketika kita mengeksekusi kode sumber, Python mengkompilasinya menjadi kode byte. Kompilasi adalah langkah terjemahan, dan kode byte adalah representasi independen kode sumber tingkat rendah platform-level. Perhatikan bahwa kode byte Python bukan kode mesin biner (misalnya, instruksi untuk chip Intel).
Sebenarnya, Python menerjemahkan setiap pernyataan dari kode sumber ke dalam instruksi kode byte dengan menguraikannya menjadi langkah-langkah individual. Terjemahan kode byte dilakukan untuk mempercepat eksekusi. Kode byte dapat dijalankan lebih cepat daripada pernyataan kode sumber asli. Ekstensi has.pyc dan akan ditulis jika dapat menulis ke mesin kami.
Jadi, lain kali kita menjalankan program yang sama, Python akan memuat file .pyc dan melewati langkah kompilasi kecuali jika sudah diubah. Python secara otomatis memeriksa stempel waktu dari file kode sumber dan byte untuk mengetahui kapan harus mengkompilasi ulang. Jika kita menyimpan kembali kode sumber, kode byte secara otomatis dibuat lagi pada saat program dijalankan.
Jika Python tidak dapat menulis file kode byte ke mesin kami, program kami masih berfungsi. Kode byte dihasilkan dalam memori dan dibuang begitu saja pada saat keluar dari program. Tetapi karena file .pyc mempercepat waktu startup, kami mungkin ingin memastikan itu telah ditulis untuk program yang lebih besar.
Mari kita simpulkan apa yang terjadi di balik layar. Ketika Python mengeksekusi sebuah program, Python membaca .py ke dalam memori, dan mem-parsingnya untuk mendapatkan bytecode, kemudian melanjutkan untuk mengeksekusi. Untuk setiap modul yang diimpor oleh program, Python terlebih dahulu memeriksa untuk melihat apakah ada versi bytecode yang dikompilasi, dalam .pyo atau .pyc, yang memiliki cap waktu yang sesuai dengan file .py-nya. Python menggunakan versi bytecode jika ada. Jika tidak, ia mem-parsing file .py modul, menyimpannya menjadi file .pyc, dan menggunakan bytecode yang baru saja dibuat.
File kode byte juga merupakan salah satu cara pengiriman kode Python. Python masih akan menjalankan program jika semua itu dapat menemukan file .pyc, bahkan jika file sumber .py asli tidak ada.
Mesin Virtual Python (PVM)
Setelah program kami dikompilasi ke dalam kode byte, program tersebut dikirim untuk dieksekusi ke Python Virtual Machine (PVM). PVM bukan program terpisah. Itu tidak perlu diinstal dengan sendirinya. Sebenarnya, PVM hanyalah sebuah loop besar yang berulang melalui instruksi kode byte kami, satu per satu, untuk melakukan operasi mereka. PVM adalah mesin runtime dari Python. Itu selalu hadir sebagai bagian dari sistem Python. Ini adalah komponen yang benar-benar menjalankan skrip kami. Secara teknis itu hanya langkah terakhir dari apa yang disebut interpreter Python.