Apa perbedaan antara bahasa yang dikompilasi dan ditafsirkan?
Perbedaannya bukan pada bahasanya; itu dalam implementasinya .
Setelah mengeluarkannya dari sistem saya, inilah jawabannya:
Dalam implementasi terkompilasi, program asli diterjemahkan ke dalam instruksi mesin asli, yang dijalankan langsung oleh perangkat keras.
Dalam implementasi yang ditafsirkan, program asli diterjemahkan ke dalam sesuatu yang lain. Program lain, yang disebut "juru bahasa", kemudian memeriksa "sesuatu yang lain" dan melakukan tindakan apa pun yang diminta. Bergantung pada bahasa dan implementasinya, ada berbagai macam bentuk "sesuatu yang lain". Dari yang lebih populer hingga yang kurang populer, "sesuatu yang lain" mungkin saja
Instruksi biner untuk mesin virtual, sering disebut bytecode , seperti yang dilakukan di Lua, Python, Ruby, Smalltalk, dan banyak sistem lainnya (pendekatan ini dipopulerkan pada tahun 1970-an oleh UCSD P-system dan UCSD Pascal)
Representasi seperti pohon dari program asli, seperti pohon sintaksis abstrak, seperti yang dilakukan untuk banyak prototipe atau penerjemah pendidikan
Representasi tokenized dari program sumber, mirip dengan Tcl
Karakter dari program sumber, seperti yang dilakukan di MINT dan TRAC
Satu hal yang memperumit masalah ini adalah dimungkinkan untuk menerjemahkan (mengompilasi) bytecode ke dalam instruksi mesin asli . Dengan demikian, implementasi intepret yang berhasil pada akhirnya akan mendapatkan kompiler. Jika kompilator berjalan secara dinamis, di belakang layar, ia sering disebut kompilator just-in-time atau kompilator JIT. JIT telah dikembangkan untuk Java, JavaScript, Lua, dan saya berani mengatakan banyak bahasa lainnya. Pada titik itu Anda dapat memiliki implementasi hybrid di mana beberapa kode diinterpretasikan dan beberapa kode dikompilasi.
Java dan JavaScript adalah contoh yang cukup buruk untuk menunjukkan perbedaan ini
, karena keduanya adalah bahasa yang ditafsirkan. Java(ditafsirkan)dan C (atau C ++)(dikompilasi)mungkin bisa menjadi contoh yang lebih baik.Pada dasarnya, kode yang dikompilasi dapat dieksekusi langsung oleh CPU komputer. Artinya, kode yang dapat dieksekusi ditentukan dalam bahasa "asli" CPU ( bahasa assembly ).
Kode bahasa yang ditafsirkan harus diterjemahkan pada waktu proses dari format apa pun ke instruksi mesin CPU. Terjemahan ini dilakukan oleh seorang juru bahasa.
Cara lain untuk menjelaskannya adalah bahwa
bahasayang diinterpretasikanadalahkode diterjemahkan ke instruksi mesin selangkah demi selangkah saat program dijalankan, sementarabahasa yangdikompilasimemilikikode yang telah diterjemahkan sebelum eksekusi program.sumber
Berikut adalah Perbedaan Dasar antara Bahasa Compiler vs Interpreter.
Bahasa Penyusun
Bahasa Penerjemah:
sumber
Kompiler, secara umum, membaca kode komputer bahasa tingkat yang lebih tinggi dan mengubahnya menjadi kode-p atau kode mesin asli. Seorang interpreter berjalan langsung dari p-code atau kode yang diinterpretasikan seperti Basic atau Lisp. Biasanya, kode yang dikompilasi berjalan jauh lebih cepat, lebih ringkas, dan telah menemukan semua kesalahan sintaksis dan banyak kesalahan referensi ilegal. Kode yang ditafsirkan hanya menemukan kesalahan tersebut setelah aplikasi mencoba menafsirkan kode yang terpengaruh. Kode yang ditafsirkan sering kali bagus untuk aplikasi sederhana yang hanya akan digunakan sekali atau paling banyak beberapa kali, atau bahkan mungkin untuk pembuatan prototipe. Kode yang dikompilasi lebih baik untuk aplikasi yang serius. Kompilator pertama-tama mengambil seluruh program, memeriksa kesalahan, mengkompilasinya, dan kemudian menjalankannya. Padahal, penerjemah melakukan ini baris demi baris, jadi dibutuhkan satu baris, periksa kesalahannya,
Jika Anda membutuhkan informasi lebih lanjut, cukup Google untuk "perbedaan antara compiler dan interpreter".
sumber
Ini adalah perbedaan yang sangat kabur, dan pada kenyataannya secara umum bukanlah properti dari bahasa itu sendiri, tetapi program yang Anda gunakan untuk mengeksekusi kode dalam bahasa itu.
Namun, sebagian besar bahasa digunakan terutama dalam satu bentuk atau lainnya, dan ya, Java pada dasarnya selalu dikompilasi, sedangkan javascript pada dasarnya selalu ditafsirkan.
Untuk mengkompilasi kode sumber adalah dengan menjalankan program di atasnya yang menghasilkan file biner yang dapat dieksekusi yang, ketika dijalankan, memiliki perilaku yang ditentukan oleh sumber. Misalnya, javac mengompilasi file .java human-readbale menjadi file .class yang dapat dibaca mesin.
Untuk menginterpretasikan kode sumber, jalankan program di atasnya yang menghasilkan perilaku yang ditentukan segera, tanpa membuat file perantara. Misalnya, ketika browser web Anda memuat stackoverflow.com, itu menafsirkan sekumpulan javascript (yang dapat Anda lihat dengan melihat sumber halaman) dan menghasilkan banyak efek bagus yang dimiliki halaman ini - misalnya, upvoting, atau notifier kecil bar di bagian atas.
sumber
Bahasa yang diinterpretasikan dijalankan pada saat run time sesuai dengan instruksi seperti di shell scripting dan bahasa yang dikompilasi adalah bahasa yang dikompilasi (diubah menjadi bahasa Assembly, yang dapat dimengerti CPU) dan kemudian dieksekusi seperti di c ++.
sumber
Seperti yang dikatakan orang lain, disusun dan ditafsirkan khusus untuk implementasi bahasa pemrograman; mereka tidak melekat dalam bahasa tersebut. Misalnya ada juru bahasa C.
Namun, kami dapat (dan dalam praktiknya kami melakukannya) mengklasifikasikan bahasa pemrograman berdasarkan penerapannya yang paling umum (terkadang kanonik). Misalnya, kami mengatakan C dikompilasi.
Pertama, kita harus mendefinisikan tanpa ambiguitas interpreter dan compiler:
Sebuah interpreter untuk bahasa X adalah sebuah program (atau mesin, atau hanya semacam mekanisme pada umumnya) yang mengeksekusi program p ditulis dalam bahasa X sehingga ia melakukan efek dan mengevaluasi hasil seperti yang ditentukan oleh spesifikasi X .
Sebuah compiler dari X ke Y adalah program (atau mesin, atau hanya semacam mekanisme pada umumnya) yang menerjemahkan program p dari beberapa bahasa X ke dalam program semantik setara p' dalam beberapa bahasa Y sedemikian rupa sehingga menafsirkan p ' dengan seorang juru bahasa untuk Y akan menghasilkan hasil yang sama dan memiliki efek yang sama seperti menafsirkan p dengan seorang juru bahasa untuk X .
Perhatikan bahwa dari sudut pandang programmer, CPU adalah juru bahasa mesin untuk bahasa mesin asli masing-masing.
Sekarang, kita dapat melakukan klasifikasi tentatif bahasa pemrograman menjadi 3 kategori tergantung pada penerapannya yang paling umum:
Kadang-kadang, bahasa yang dikompilasi lunak dan keras dirujuk ke hanya dikompilasi, sehingga C #, Java, C, C ++ dikatakan dikompilasi.
Dalam kategorisasi ini, JavaScript dulunya adalah bahasa yang ditafsirkan, tetapi itu sudah bertahun-tahun yang lalu. Saat ini, JIT dikompilasi ke bahasa mesin asli di sebagian besar implementasi JavaScript utama jadi saya akan mengatakan bahwa itu termasuk dalam bahasa kompilasi lunak.
sumber