Seperti yang saya mengerti, penyebab perbedaan kecepatan antara bahasa yang dikompilasi dan python adalah, bahwa kode pertama mengkompilasi semua jalan ke kode mesin asli, sedangkan python mengkompilasi ke bytecode python, untuk ditafsirkan oleh PVM. Saya melihat bahwa cara ini kode python dapat digunakan pada beberapa sistem operasi (setidaknya dalam kebanyakan kasus), namun saya tidak mengerti, mengapa tidak ada kompiler tambahan (dan opsional) untuk python, yang mengkompilasi dengan cara yang sama seperti kompiler tradisional . Ini akan diserahkan kepada programmer untuk memilih, mana yang lebih penting bagi mereka; kinerja atau kinerja multiplatform pada mesin asli. Secara umum; mengapa tidak ada bahasa yang bisa berperilaku baik sebagai dikompilasi dan ditafsirkan?
sumber
Jawaban:
Tidak. Alasan mengapa ada perbedaan kecepatan antara bahasa seperti Python dan C ++ adalah karena bahasa yang diketik secara statis memberikan kompiler banyak informasi tentang struktur program dan data yang memungkinkannya untuk mengoptimalkan perhitungan dan akses memori. Karena C ++ tahu bahwa variabel bertipe int, ia dapat menentukan cara optimal untuk memanipulasi variabel itu bahkan sebelum program dijalankan. Di Python di sisi lain, runtime tidak tahu nilai apa yang ada dalam variabel sampai garis tercapai oleh penerjemah. Ini sangat penting untuk struktur, di mana dalam C ++, kompiler dapat dengan mudah mengetahui ukuran struktur dan setiap lokasi bidangnya di dalam memori selama kompilasi. Ini memberinya kekuatan besar dalam memprediksi bagaimana data dapat digunakan dan memungkinkannya mengoptimalkan menurut prediksi tersebut.
Untuk mengkompilasi bahasa seperti Python secara efektif, Anda perlu:
sumber
eval
, dan banyak hal lain untuk membuat penulis kompiler sedih. Ini tidak setingkat gcc, tapi tentu saja lebih cepat daripada juru bahasa CPython.Dua konsep mungkin membantu kita memahami lebih baik mengapa Python dikompilasi ke kode mesin asli "mungkin" tidak berjalan secepat kompilasi C atau bahasa yang dikompilasi lainnya. Mereka disebut mengikat awal dan mengikat terlambat.
Saya harus mulai dengan mengatakan saya bukan ahli Python, dan saya datang ke situs ini secara tidak sengaja. Tapi saya suka situs ini.
Seperti disebutkan dalam respons lain di sini, kompiler C ++ dapat mengetahui banyak tentang program dan membuat keputusan tentang operasi mana yang akan digunakan untuk struktur data tertentu. Sebagai contoh jika dua variabel integer perlu ditambahkan bersama-sama, kompiler tahu mereka adalah integer asli, lebar 32 bit misalnya dan dapat menambahkannya bersama dengan satu instruksi "ADD". Jadi kompilasi instruksi ADD ke dalam kode. Terkunci dan tidak dapat diubah saat program sedang berjalan. Itu mengikat awal.
Di sisi lain dalam bahasa seperti Python kita bisa mengharapkan program untuk membuang berbagai jenis data bersama dengan cara yang kompleks. Sekarang kompiler tidak tahu apakah 2 variabel kita adalah bilangan bulat, float, string atau daftar. Jadi ia harus mengkompilasi kode yang menentukan informasi itu pada waktu menjalankan dan memilih operasi yang benar ketika program sedang berjalan. Ini mengikat terlambat dan kita dapat memahami bahwa akan ada hit kinerja untuk melakukan pekerjaan ekstra saat program sedang berjalan. Ini adalah harga yang Anda bayar untuk membiarkan opsi-opsi itu terbuka dalam bahasa seperti Python tetapi itu memberikan fleksibilitas run-time maksimum.
sumber
Saya pikir ini lebih berkaitan dengan spesifikasi Python itu sendiri, alasan yang sama Anda tidak dapat mengkompilasi C # ke kode mesin. Bahasa spesifik sebenarnya akan membuat program Anda bermasalah bahkan jika itu mungkin karena sifat bahasa. Mengapa tidak belajar bahasa C saja? Jauh lebih mudah daripada C ++ dan sedikit lebih maju dari Python tetapi masih bisa didekati.
sumber