(Setahu saya) tidak ada yang namanya "bahasa" yang diinterpretasikan atau "bahasa" yang dikompilasi.
Bahasa menentukan sintaksis dan makna kata kunci kode, konstruk alur, dan berbagai hal lainnya, tetapi saya tidak mengetahui bahasa yang menentukan apakah harus dikompilasi atau ditafsirkan dalam spesifikasi bahasa.
Sekarang jika pertanyaan Anda adalah ketika Anda menggunakan kompiler bahasa vs juru bahasa, itu benar-benar turun ke pro / kontra dari kompiler vs interpreter dan tujuan proyek.
Sebagai contoh, Anda dapat menggunakan kompiler JRuby untuk integrasi yang lebih mudah dengan perpustakaan java daripada penerjemah ruby MRI. Ada kemungkinan juga alasan untuk menggunakan juru bahasa rubi MRI di atas JRuby, saya tidak terbiasa dengan bahasa dan tidak dapat berbicara dengan ini.
Manfaat yang didapat dari penerjemah:
- Tanpa kompilasi berarti waktu dari mengedit kode hingga menguji aplikasi dapat dikurangi
- Tidak perlu membuat binari untuk banyak arsitektur karena juru bahasa akan mengelola abstraksi arsitektur (meskipun Anda mungkin masih perlu khawatir tentang skrip yang menangani ukuran integer dengan benar, hanya saja bukan distribusi biner)
Manfaat yang dikemukakan dari kompiler:
- Kode asli yang dikompilasi tidak memiliki overhead juru bahasa dan karena itu biasanya lebih efisien dalam hal waktu dan ruang
- Interoperabilitas biasanya lebih baik, satu-satunya cara untuk in-proc interoperation dengan skrip adalah melalui interpreter daripada FFI standar
- Kemampuan untuk mendukung arsitektur yang belum dikompilasi oleh interpreter (seperti embedded system)
Namun, saya berani bertaruh dalam 90% kasus, ini berjalan seperti ini: Saya ingin menulis perangkat lunak ini di blub karena saya tahu betul dan harus melakukan pekerjaan dengan baik. Saya akan menggunakan interpreter blub (atau kompiler) karena itu adalah metode kanonik yang diterima secara umum untuk menulis perangkat lunak dalam blub.
Jadi TL; DR pada dasarnya, berdasarkan kasus per perbandingan pembanding dengan kompiler untuk kasus penggunaan khusus Anda.
Juga, FFI: Antarmuka Fungsi Asing, dengan kata lain antarmuka untuk beroperasi dengan bahasa lain. Lebih banyak membaca di wikipedia
Poin penting di sini adalah bahwa banyak implementasi bahasa benar-benar melakukan semacam hibrida dari keduanya. Banyak bahasa yang umum digunakan saat ini bekerja dengan mengkompilasi program ke dalam format perantara seperti bytecode, dan kemudian mengeksekusinya dalam sebuah interpreter. Ini adalah bagaimana Java, C #, Python, Ruby, dan Lua biasanya diimplementasikan. Bahkan, ini bisa dibilang bagaimana sebagian besar bahasa yang digunakan saat ini diimplementasikan. Jadi, kenyataannya adalah, bahasa saat ini menafsirkan dan menyusun kode mereka. Beberapa bahasa ini memiliki kompiler JIT tambahan untuk mengkonversi bytecode ke kode asli untuk dieksekusi.
Menurut pendapat saya, kita harus berhenti berbicara tentang bahasa yang ditafsirkan dan dikompilasi karena mereka bukan lagi kategori yang berguna untuk membedakan kompleksitas implementasi bahasa saat ini.
Ketika Anda bertanya tentang kelebihan bahasa yang ditafsirkan dan dikompilasi, Anda mungkin bermaksud sesuatu yang lain. Anda mungkin bertanya tentang manfaat pengetikan statis / dinamis, manfaat mendistribusikan executable asli, keuntungan relatif kompilasi JIT dan AOT. Ini semua adalah masalah yang terkait dengan interpretasi / kompilasi tetapi merupakan masalah yang berbeda.
sumber
Pertama-tama, bahasa pemrograman dapat ditafsirkan dan dikompilasi. Interpretasi dan kompilasi hanyalah metode untuk menghasilkan kode yang dapat dieksekusi dari kode sumber. Dengan seorang juru bahasa kode sumber sedang dibaca dan ditafsirkan oleh seorang juru bahasa yang kemudian mengeksekusi kode itu ketika menafsirkannya. Seorang kompiler di sisi lain membaca kode sumber dan menghasilkan file biner yang dapat dieksekusi dari kode sumber - sehingga program dapat dijalankan sebagai proses terpisah secara independen.
Sekarang sebelum orang bertanya-tanya ... Ya, C / C ++ / C # / Java dapat diartikan, dan ya, JavaScript dan skrip Bash dapat dikompilasi. Namun, apakah ada penerjemah atau kompiler yang berfungsi untuk bahasa-bahasa ini adalah pertanyaan lain.
Sekarang untuk benar-benar menjawab pertanyaan ketika kita akan menggunakan "bahasa yang ditafsirkan" di atas "bahasa yang dikompilasi". Pertanyaan itu sendiri agak membingungkan, tetapi saya menganggap itu berarti kapan lebih suka interpretasi daripada kompilasi. Salah satu kelemahan kompilasi adalah bahwa ia menghasilkan beberapa overhead karena proses kompilasi - kode sumber harus dikompilasi ke kode mesin yang dapat dieksekusi sehingga tidak cocok untuk tugas-tugas yang memerlukan penundaan minimal ketika menggunakan kode sumber untuk menjalankan suatu program. Di sisi lain kode sumber yang dikompilasi hampir selalu lebih cepat daripada kode sumber yang ditafsirkan setara karena overhead yang disebabkan oleh menafsirkan kode. Penerjemah di sisi lain dapat memanggil dan menjalankan kode sumber dengan overhead doa yang sangat sedikit, tetapi dengan mengorbankan kinerja run-time.
Pada akhirnya hampir tidak mungkin untuk menyebutkan kasus penggunaan yang pasti kapan harus memilih satu demi satu, tetapi misalnya satu (untuk penjelasan saya sangat tidak realistis) kasus akan ketika kode sumber program berubah secara dinamis antara permintaan program dan overhead kompilasi juga tinggi untuk itu menjadi pilihan yang layak. Dalam hal itu menafsirkan kode sumber daripada mengkompilasi mungkin akan diinginkan.
Namun, ada sesuatu yang dapat dianggap sebagai contoh dunia nyata: kode sumber hidnig pada saat penyebaran. Dengan aslinyakode yang dikompilasi, pengembang menyebarkan kode macine yang dapat dieksekusi dari program dan data. Dengan kode yang diinterpretasikan, kode sumber itu sendiri harus digunakan yang kemudian dapat diperiksa dan direkayasa ulang dengan upaya yang jauh lebih sedikit daripada apa yang dilakukan untuk merekayasa balik kode mesin asli. Satu pengecualian untuk ini adalah bahasa seperti C # dan Java yang mengkompilasi ke bahasa langsung / bytecode (MSIL untuk C # dan Java bytecode untuk Java) yang kemudian dikerahkan dan dikompilasi "tepat waktu" saat runtime, seperti halnya penerjemah. Namun, ada yang disebut decompiler untuk MSIL dan Java Bytecode yang dapat merekonstruksi kode sumber asli dengan akurasi yang relatif baik dan dengan demikian rekayasa balik produk tersebut jauh lebih sepele daripada produk rekayasa balik yang digunakan dalam kode mesin asli.
sumber
Saya bisa memikirkan skenario berikut ketika Anda akan menggunakan bahasa yang ditafsirkan :
Saya dapat memikirkan skenario berikut ketika Anda ingin mengkompilasi kode Anda:
sumber
Pada akhirnya, pertukaran besar adalah antara produktivitas (berapa banyak baris kode yang harus Anda tulis) dan kinerja (seberapa cepat program Anda akan dijalankan).
Karena bahasa yang ditafsirkan ketika ditransformasikan ke informasi CPU memiliki lebih banyak informasi, mereka dapat mengandalkan refleksi dan pengetikan dinamis yang sangat meningkatkan produktivitas . Keuntungan lain dari bahasa yang ditafsirkan adalah bahwa mereka adalah platform independen selama ada penerjemah untuk platform.
Karena CPU tidak boleh mengubah kode bahasa dalam kode mesin dan menjalankan kode pada saat yang sama, seperti dalam kasus yang ditafsirkan, bahasa yang dikompilasi menghasilkan program yang lebih cepat. Selain itu, sistem yang dibangun dalam bahasa yang dikompilasi lebih aman karena dapat mendeteksi masalah pada waktu kompilasi yang pada dasarnya berarti Anda melihat kesalahan saat Anda mengetiknya (dengan IDE modern) alih-alih melihatnya hanya ketika Anda benar-benar menjalankan program (tentu saja , ini tidak memperbaiki kesalahan logis).
Mengetahui hal ini, bahasa yang ditafsirkan cocok untuk:
Dan bahasa yang dikompilasi cocok ketika:
sumber
Selain alasan yang disebutkan orang lain, ada satu kasus penggunaan yang sangat penting untuk memilih interpretasi ad hoc atas segala bentuk kompilasi atau pendekatan hybrid.
Dalam hal jika bahasa pemrograman digunakan sebagai protokol komunikasi , dan ketika latensi respons penting, lebih masuk akal untuk menghindari membuang-buang waktu untuk kompilasi dan kemungkinan preprocessing.
Ini berlaku untuk bahasa agen, misalnya, atau untuk cara bagaimana, katakanlah, Tcl / Tk biasanya digunakan.
Alasan lain yang mungkin untuk tetap dengan interpretasi adalah ketika juru bahasa digunakan untuk bootstrap itu sendiri atau bahasa tingkat yang lebih rumit, lebih tinggi, dan kesederhanaannya lebih penting daripada kinerja proses bootstrap.
Untuk hampir semua kasus penggunaan lain yang mungkin, kompilasi (atau pendekatan hybrid) lebih cocok.
sumber