Python memiliki kompiler! Anda hanya tidak menyadarinya karena itu berjalan secara otomatis. Anda dapat mengetahui bahwa file tersebut ada di sana: lihat file .pyc
(atau .pyo
jika optimizer diaktifkan) yang dihasilkan untuk modul yang Anda inginkan import
.
Juga, itu tidak dikompilasi dengan kode mesin asli. Sebagai gantinya, ia mengkompilasi ke kode byte yang digunakan oleh mesin virtual. Mesin virtual itu sendiri adalah program yang dikompilasi. Ini sangat mirip dengan cara kerja Java; sangat mirip, pada kenyataannya, bahwa ada varian Python ( Jython ) yang mengkompilasi ke kode byte Java Virtual Machine sebagai gantinya! Ada juga IronPython , yang mengkompilasi ke Microsoft CLR (digunakan oleh .NET). (Kompilator kode byte Python normal kadang-kadang disebut CPython untuk memisahkannya dari alternatif ini.)
C ++ perlu memaparkan proses kompilasi karena bahasa itu sendiri tidak lengkap; itu tidak menentukan semua yang perlu diketahui oleh penghubung untuk membangun program Anda, juga tidak dapat menentukan opsi kompilasi dengan mudah (beberapa kompiler memungkinkan Anda menggunakannya #pragma
, tetapi itu bukan standar). Jadi, Anda harus melakukan sisa pekerjaan dengan makefiles dan mungkin auto hell (autoconf / automake / libtool). Ini benar-benar hanya peninggalan dari bagaimana C melakukannya. Dan C melakukannya dengan cara itu karena itu membuat kompiler sederhana, yang merupakan salah satu alasan utama itu begitu populer (siapa pun bisa membuat kompiler C sederhana di tahun 80-an).
Beberapa hal yang dapat memengaruhi operasi kompiler atau tautan tetapi tidak ditentukan dalam sintaks C atau C ++:
- resolusi ketergantungan
- persyaratan perpustakaan eksternal (termasuk urutan ketergantungan)
- tingkat pengoptimal
- pengaturan peringatan
- versi spesifikasi bahasa
- pemetaan tautan (bagian mana yang dituju dalam program akhir)
- arsitektur target
Beberapa di antaranya dapat dideteksi, tetapi tidak dapat ditentukan; misalnya saya dapat mendeteksi C ++ mana yang digunakan __cplusplus
, tetapi saya tidak dapat menentukan bahwa C ++ 98 adalah yang digunakan untuk kode saya di dalam kode itu sendiri; Saya harus meneruskannya sebagai flag ke compiler di Makefile, atau membuat pengaturan dalam dialog.
Meskipun Anda mungkin berpikir bahwa sistem "resolusi ketergantungan" ada di kompiler, secara otomatis menghasilkan catatan ketergantungan, catatan ini hanya mengatakan file header mana yang digunakan oleh file sumber yang diberikan. Mereka tidak dapat menunjukkan modul kode sumber tambahan apa yang diperlukan untuk menautkan ke program yang dapat dieksekusi, karena tidak ada cara standar dalam C atau C ++ untuk menunjukkan bahwa file header yang diberikan adalah definisi antarmuka untuk modul kode sumber lain sebagai lawan dari hanya sekelompok baris yang ingin Anda tunjukkan di banyak tempat sehingga Anda tidak mengulanginya. Ada tradisi dalam konvensi penamaan file, tetapi ini tidak dikenal atau dipaksakan oleh kompiler dan tautan.
Beberapa di antaranya dapat diatur menggunakan #pragma
, tetapi ini non-standar, dan saya berbicara tentang standar. Semua hal ini dapat ditentukan oleh standar, tetapi belum untuk kepentingan kompatibilitas ke belakang. Kebijaksanaan yang berlaku adalah bahwa makefile dan IDE tidak rusak, jadi jangan memperbaikinya.
Python menangani semua ini dalam bahasa. Sebagai contoh, import
menentukan ketergantungan modul eksplisit, menyiratkan pohon ketergantungan, dan modul tidak dibagi menjadi file header dan sumber (yaitu antarmuka dan implementasi).