Saya mencoba untuk mendapatkan pemahaman yang lebih baik tentang perbedaannya. Saya telah menemukan banyak penjelasan online, tetapi mereka cenderung ke arah perbedaan abstrak daripada implikasi praktis.
Sebagian besar pengalaman pemrograman saya dengan CPython (dinamis, ditafsirkan), dan Java (statis, dikompilasi). Namun, saya mengerti bahwa ada jenis lain dari bahasa yang ditafsirkan dan dikompilasi. Terlepas dari kenyataan bahwa file yang dapat dieksekusi dapat didistribusikan dari program yang ditulis dalam bahasa yang dikompilasi, apakah ada kelebihan / kekurangan untuk setiap jenis? Seringkali, saya mendengar orang berpendapat bahwa bahasa yang ditafsirkan dapat digunakan secara interaktif, tetapi saya percaya bahwa bahasa yang dikompilasi dapat memiliki implementasi interaktif juga, benar?
sumber
Jawaban:
Bahasa yang dikompilasi adalah bahasa tempat program, setelah dikompilasi, diekspresikan dalam instruksi mesin target. Misalnya, operasi "+" tambahan dalam kode sumber Anda dapat diterjemahkan langsung ke instruksi "ADD" dalam kode mesin.
Bahasa ditafsirkan adalah salah satu di mana petunjuk tidak langsung dieksekusi oleh mesin target, melainkan membaca dan dieksekusi oleh program lain (yang biasanya adalah ditulis dalam bahasa mesin asli). Misalnya, operasi "+" yang sama akan dikenali oleh interpreter pada saat run time, yang kemudian akan memanggil fungsi "add (a, b)" sendiri dengan argumen yang sesuai, yang kemudian akan menjalankan kode mesin "ADD" instruksi .
Anda dapat melakukan apa saja yang dapat Anda lakukan dalam bahasa yang ditafsirkan dalam bahasa yang dikompilasi dan sebaliknya - keduanya Turing lengkap. Namun keduanya memiliki kelebihan dan kekurangan untuk implementasi dan penggunaan.
Saya akan benar-benar menggeneralisasi (purists memaafkan saya!) Tetapi, secara kasar, inilah kelebihan dari bahasa yang dikompilasi:
Dan inilah kelebihan dari bahasa yang ditafsirkan:
Perhatikan bahwa teknik modern seperti kompilasi bytecode menambah kompleksitas tambahan - yang terjadi di sini adalah bahwa kompiler menargetkan "mesin virtual" yang tidak sama dengan perangkat keras yang mendasarinya. Instruksi mesin virtual ini kemudian dapat dikompilasi lagi pada tahap selanjutnya untuk mendapatkan kode asli (mis. Seperti yang dilakukan oleh kompiler Java JVM JIT).
sumber
Bahasa itu sendiri tidak dikompilasi atau diinterpretasikan, hanya implementasi spesifik dari suatu bahasa. Java adalah contoh sempurna. Ada platform berbasis bytecode (JVM), kompiler asli (gcj) dan interpeter untuk superset Java (bsh). Jadi, apa itu Java sekarang? Kompilasi bytecode, kompilasi asli atau ditafsirkan?
Bahasa lain, yang disusun serta ditafsirkan, adalah Scala, Haskell atau Ocaml. Masing-masing bahasa ini memiliki juru bahasa interaktif, serta kompiler ke kode byte atau kode mesin asli.
Jadi, secara umum mengkategorikan bahasa dengan "dikompilasi" dan "ditafsirkan" tidak masuk akal.
sumber
Mulailah berpikir dalam bentuk: ledakan dari masa lalu
Dahulu kala, dahulu kala, hiduplah di negeri penterjemah dan kompiler komputasi. Segala macam keributan terjadi karena kelebihan satu sama lain. Pendapat umum pada waktu itu adalah sesuatu di sepanjang garis:
Satu atau dua urutan perbedaan besarnya dalam kinerja runtime ada antara program yang ditafsirkan dan program yang dikompilasi. Poin pembeda lain, runability time-run dari kode misalnya, juga menarik, tetapi perbedaan utama berkisar pada masalah kinerja run-time.
Saat ini bentang alam telah berkembang sedemikian rupa sehingga perbedaan yang dikompilasi / ditafsirkan cukup tidak relevan. Banyak bahasa yang dikompilasi memanggil layanan run-time yang tidak sepenuhnya berdasarkan kode mesin. Juga, sebagian besar bahasa yang ditafsirkan "dikompilasi" ke dalam byte-code sebelum dieksekusi. Interpreter kode byte bisa sangat efisien dan menyaingi beberapa kompiler yang dihasilkan kode dari sudut pandang kecepatan eksekusi.
Perbedaan klasiknya adalah bahwa kompiler menghasilkan kode mesin asli, interpreter membaca kode sumber dan membuat kode mesin dengan cepat menggunakan semacam sistem run-time. Saat ini ada sangat sedikit penafsir klasik yang tersisa - hampir semua dari mereka mengkompilasi ke dalam byte-code (atau keadaan semi-dikompilasi lainnya) yang kemudian berjalan pada "mesin" virtual.
sumber
Kasus-kasus ekstrim dan sederhana:
Kompiler akan menghasilkan biner yang dapat dieksekusi dalam format asli yang dapat dieksekusi mesin target. File biner ini berisi semua sumber daya yang diperlukan kecuali perpustakaan sistem; ini siap dijalankan tanpa persiapan dan pemrosesan lebih lanjut dan berjalan seperti kilat karena kode tersebut adalah kode asli untuk CPU pada mesin target.
Seorang juru bahasa akan memberikan perintah kepada pengguna dalam satu lingkaran di mana ia dapat memasukkan pernyataan atau kode, dan pada saat memukul
RUN
atau yang setara, juru bahasa akan memeriksa, memindai, menguraikan, dan mengeksekusi secara interpretatif setiap baris sampai program berjalan ke titik penghentian atau kesalahan. . Karena setiap baris diperlakukan sendiri dan penerjemah tidak "mempelajari" apa pun dari melihat baris sebelumnya, upaya mengubah bahasa yang dapat dibaca manusia menjadi instruksi mesin dilakukan setiap waktu untuk setiap baris, jadi ini lambat. Sisi baiknya, pengguna dapat memeriksa dan berinteraksi dengan programnya dengan berbagai cara: Mengubah variabel, mengubah kode, menjalankan dalam mode jejak atau debug ... apa pun.Dengan semua itu, izinkan saya menjelaskan bahwa hidup tidak sesederhana itu lagi. Misalnya,
Pada akhirnya, hari-hari ini, menafsirkan vs kompilasi adalah trade-off, dengan waktu yang dihabiskan (sekali) kompilasi sering dihargai oleh kinerja runtime yang lebih baik, tetapi lingkungan interpretatif memberikan lebih banyak peluang untuk interaksi. Mengkompilasi vs menafsirkan sebagian besar masalah bagaimana pekerjaan "memahami" program ini dibagi antara proses yang berbeda, dan garis ini agak kabur saat ini karena bahasa dan produk mencoba menawarkan yang terbaik dari kedua dunia.
sumber
Dari http://www.quora.com/Apa-adalah- perbedaan- antara antara- compiled-and- interpreted- programming- languages
sumber
Keuntungan terbesar dari kode sumber yang ditafsirkan dibandingkan kode sumber yang dikompilasi adalah PORTABILITAS .
Jika kode sumber Anda dikompilasi, Anda perlu mengkompilasi executable yang berbeda untuk setiap jenis prosesor dan / atau platform yang Anda inginkan untuk menjalankan program Anda (misalnya satu untuk Windows x86, satu untuk Windows x64, satu untuk Linux x64, dan sebagainya di). Selain itu, kecuali jika kode Anda sepenuhnya memenuhi standar dan tidak menggunakan fungsi / pustaka platform-spesifik, Anda benar-benar harus menulis dan memelihara beberapa basis kode!
Jika kode sumber Anda ditafsirkan, Anda hanya perlu menulisnya sekali dan dapat ditafsirkan dan dieksekusi oleh penerjemah yang sesuai pada platform apa pun! Ini portabel ! Perhatikan bahwa seorang penerjemah itu sendiri adalah sebuah program executable yang sudah ditulis dan disusun untuk platform tertentu.
Keuntungan dari kode yang dikompilasi adalah menyembunyikan kode sumber dari pengguna akhir (yang mungkin merupakan kekayaan intelektual ) karena alih-alih menggunakan kode sumber asli yang dapat dibaca manusia, Anda menggunakan file biner yang dapat dieksekusi yang tidak jelas.
sumber
Compiler dan interpreter melakukan pekerjaan yang sama: menerjemahkan bahasa pemrograman ke bahasa pgoramming lain, biasanya lebih dekat ke perangkat keras, seringkali kode mesin langsung dapat dieksekusi.
Secara tradisional, "dikompilasi" berarti bahwa terjemahan ini terjadi semua dalam satu waktu, dilakukan oleh pengembang, dan dieksekusi yang dihasilkan didistribusikan kepada pengguna. Contoh murni: C ++. Kompilasi biasanya memakan waktu yang cukup lama dan mencoba melakukan banyak optmisasi mahal sehingga eksekusi yang dihasilkan dapat berjalan lebih cepat. Pengguna akhir tidak memiliki alat dan pengetahuan untuk mengkompilasi barang-barang sendiri, dan yang dapat dieksekusi sering harus dijalankan pada berbagai perangkat keras, sehingga Anda tidak dapat melakukan banyak optimasi perangkat keras khusus. Selama pengembangan, langkah kompilasi terpisah berarti siklus umpan balik yang lebih panjang.
Secara tradisional, "ditafsirkan" berarti bahwa terjemahan terjadi "dengan cepat", ketika pengguna ingin menjalankan program. Contoh murni: vanilla PHP. Penerjemah yang naif harus mengurai dan menerjemahkan setiap bagian kode setiap kali dijalankan, yang membuatnya sangat lambat. Tidak dapat melakukan optimasi yang rumit dan mahal karena membutuhkan waktu lebih lama daripada waktu yang dihemat dalam eksekusi. Tetapi sepenuhnya dapat menggunakan kemampuan perangkat keras yang dijalankannya. Kurangnya langkah kompilasi terpisah mengurangi waktu umpan balik selama pengembangan.
Tapi saat ini "dikompilasi vs. ditafsirkan" bukan masalah hitam-putih, ada nuansa di antaranya. Naif, penerjemah sederhana sudah hampir punah. Banyak bahasa menggunakan proses dua langkah di mana kode tingkat tinggi diterjemahkan ke bytecode platform-independent (yang jauh lebih cepat untuk ditafsirkan). Kemudian Anda memiliki "kompilator tepat waktu" yang mengkompilasi kode paling banyak sekali per program dijalankan, kadang-kadang hasil cache, dan bahkan secara cerdas memutuskan untuk menafsirkan kode yang jarang berjalan, dan melakukan optimasi kuat untuk kode yang banyak berjalan. Selama pengembangan, debugger mampu mengalihkan kode di dalam program yang sedang berjalan bahkan untuk bahasa yang dikompilasi secara tradisional.
sumber
Pertama, klarifikasi, Java tidak sepenuhnya dikompilasi statis dan terhubung dengan cara C ++. Ia dikompilasi menjadi bytecode, yang kemudian ditafsirkan oleh JVM. JVM dapat pergi dan melakukan kompilasi just-in-time ke bahasa mesin asli, tetapi tidak harus melakukannya.
Lebih tepatnya: saya pikir interaktivitas adalah perbedaan praktis utama. Karena semuanya ditafsirkan, Anda dapat mengambil kutipan kecil dari kode, parsing dan jalankan melawan kondisi lingkungan saat ini. Jadi, jika Anda sudah mengeksekusi kode yang menginisialisasi variabel, Anda akan memiliki akses ke variabel itu, dll. Itu benar-benar cocok untuk hal-hal seperti gaya fungsional.
Akan tetapi, penafsiran membutuhkan banyak biaya, terutama ketika Anda memiliki sistem besar dengan banyak referensi dan konteks. Menurut definisi, ini boros karena kode identik mungkin harus ditafsirkan dan dioptimalkan dua kali (walaupun sebagian besar runtimes memiliki beberapa caching dan optimisasi untuk itu). Namun, Anda membayar biaya runtime dan seringkali membutuhkan lingkungan runtime. Anda juga cenderung melihat optimasi antar-prosedur yang kompleks karena saat ini kinerjanya tidak cukup interaktif.
Oleh karena itu, untuk sistem besar yang tidak akan banyak berubah, dan untuk bahasa tertentu, lebih masuk akal untuk mengkompilasi dan prelink semuanya, lakukan semua optimasi yang dapat Anda lakukan. Ini berakhir dengan runtime yang sangat ramping yang sudah dioptimalkan untuk mesin target.
Sedangkan untuk menghasilkan executbles, itu tidak ada hubungannya dengan itu, IMHO. Anda sering dapat membuat executable dari bahasa yang dikompilasi. Tetapi Anda juga dapat membuat executable dari bahasa yang ditafsirkan, kecuali bahwa interpreter dan runtime sudah dikemas dalam exectuable dan disembunyikan dari Anda. Ini berarti bahwa Anda umumnya masih membayar biaya runtime (walaupun saya yakin bahwa untuk beberapa bahasa ada cara untuk menerjemahkan semuanya ke pohon yang dapat dieksekusi).
Saya tidak setuju bahwa semua bahasa dapat dibuat interaktif. Bahasa tertentu, seperti C, sangat terikat pada mesin dan seluruh struktur tautan sehingga saya tidak yakin Anda dapat membangun versi interaktif yang lengkap dan bermakna
sumber
Agak sulit untuk memberikan jawaban praktis karena perbedaannya adalah tentang definisi bahasa itu sendiri. Dimungkinkan untuk membangun penerjemah untuk setiap bahasa yang dikompilasi, tetapi tidak mungkin untuk membangun kompiler untuk setiap bahasa yang ditafsirkan. Ini sangat banyak tentang definisi formal bahasa. Sehingga informatika teoritis menyukai hal-hal yang tidak disukai di universitas.
sumber
The Python Book © 2015 Imagine Publishing Ltd, cukup menghilangkan perbedaan dengan petunjuk berikut yang disebutkan di halaman 10 sebagai:
sumber
Kompilasi adalah proses membuat program yang dapat dieksekusi dari kode yang ditulis dalam bahasa pemrograman yang dikompilasi. Kompilasi memungkinkan komputer untuk menjalankan dan memahami program tanpa perlu perangkat lunak pemrograman yang digunakan untuk membuatnya. Ketika suatu program dikompilasi, ia sering dikompilasi untuk platform tertentu (misalnya platform IBM) yang bekerja dengan komputer yang kompatibel dengan IBM, tetapi tidak untuk platform lain (misalnya platform Apple). Kompiler pertama dikembangkan oleh Grace Hopper saat bekerja pada komputer Harvard Mark I. Saat ini, sebagian besar bahasa tingkat tinggi akan menyertakan kompiler mereka sendiri atau memiliki toolkit yang tersedia yang dapat digunakan untuk mengkompilasi program. Contoh kompiler yang digunakan dengan Java adalah Eclipse dan contoh kompiler yang digunakan dengan C dan C ++ adalah perintah gcc.
sumber
Definisi pendek (tidak tepat):
Bahasa yang dikompilasi: Seluruh program diterjemahkan ke kode mesin sekaligus, kemudian kode mesin dijalankan oleh CPU.
Bahasa yang ditafsirkan: Program dibaca baris demi baris dan segera setelah baris dibaca instruksi mesin untuk baris tersebut dijalankan oleh CPU.
Tetapi sungguh, beberapa bahasa dewasa ini dikompilasi atau ditafsirkan secara murni, sering kali merupakan campuran. Untuk deskripsi yang lebih rinci dengan gambar, lihat utas ini:
Apa perbedaan kompilasi dan interpretasi?
Atau posting blog saya nanti:
https://orangejuiceliberationfront.com/the-difference-between-compiler-and-interpreter/
sumber