Apa perbedaan antara bahasa yang dikompilasi dan ditafsirkan?

118

Setelah membaca beberapa materi tentang hal ini saya masih tidak yakin apa perbedaan antara bahasa yang dikompilasi dan bahasa tafsir. Saya diberitahu bahwa ini adalah salah satu perbedaan antara Java dan JavaScript. Maukah seseorang membantu saya dalam memahaminya?

SIr Codealot
sumber

Jawaban:

165

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.

Norman Ramsey
sumber
7
Pak, saya punya pertanyaan berikut 1. Dalam bahasa apa "sesuatu yang lain" itu ditulis? 2. Dan dalam konteks JavaScript, apakah "sesuatu yang lain" itu bervariasi dari browser ke browser? 3. Misalnya, skrip saya berjalan di Google Chrome dan Internet Explorer, apakah diartikan sama di kedua browser?
JavaHopper
@Norman itu penjelasan yang luar biasa. Namun, inilah beberapa kebingungan yang masih saya miliki. Dalam implementasi terkompilasi, program asli diubah menjadi instruksi mesin asli. Bagaimana bisa? Saya pikir C, misalnya, setelah kompilasi akan menghasilkan kode assembly, yang lagi-lagi perlu dirakit oleh assembler asli ke dalam kode mesin yang mendasarinya. Jadi apa bedanya dengan VM (python atau JVM dll.) Melakukan hal yang sama dalam hal bahasa yang ditafsirkan?
qre0ct
58

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.

Mengapa teks yang dicoret? Karena jawaban ini menunjukkan dengan benar, ditafsirkan / dikompilasi adalah tentang implementasi konkret dari suatu bahasa, bukan tentang bahasa itu sendiri . Meskipun pernyataan seperti "C adalah bahasa yang dikompilasi" umumnya benar, tidak ada yang menghentikan seseorang untuk menulis penerjemah bahasa C. Faktanya, penerjemah untuk C memang ada .

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 bahasa yang diinterpretasikan adalah kode diterjemahkan ke instruksi mesin selangkah demi selangkah saat program dijalankan, sementara bahasa yang dikompilasi memiliki kode yang telah diterjemahkan sebelum eksekusi program.

stakx - tidak lagi berkontribusi
sumber
8
Jawa ditafsirkan? Dari wikipedia: "Aplikasi Java biasanya dikompilasi menjadi bytecode (file kelas) yang dapat berjalan di Java Virtual Machine (JVM) apa pun, apa pun arsitektur komputernya."
Personman
6
@Personman yang secara teknis masih "diinterpretasikan" sebagai JVM yang menjalankan kode, bukan OS itu sendiri. Ini benar-benar perbedaan semantik lagi, karena dapat dikatakan bahwa kompleksitas OS modern membuat perbedaan tersebut pada dasarnya tidak relevan untuk sebagian besar situasi. Anda berbicara tentang perbedaan antara OS yang menjalankan aplikasi, dan OS yang menjalankan aplikasi yang menjalankan kode.
GrayWizardx
5
Saya kira yang Anda maksud adalah file kelas itu sendiri diinterpretasikan oleh Java VM. Itu agak masuk akal, tetapi sumber java benar-benar dikompilasi ke bytecode Java VM. Anda dapat membuat Mesin Java fisik yang tidak memerlukan VM untuk menafsirkannya menjadi kode mesin arsitektur lain. Jadi sepertinya lebih akurat untuk mengatakan bahwa Java dikompilasi. Namun, ini adalah contoh yang baik tentang perbedaan yang membingungkan dan sembarangan. Lagipula, C yang dikompilasi diinterpretasikan oleh CPU, bukan?
Personman
13
Java adalah contoh yang sangat buruk dari bahasa yang dikompilasi atau ditafsirkan karena pada dasarnya keduanya. Jika saya akan membuat perbandingan, saya akan memilih C dan Lisp untuk menghindari kebingungan.
Bill the Lizard
7
@stakx - sebenarnya bytecode Java biasanya dikompilasi ke kode native oleh kompilator JIT juga. Satu-satunya cara untuk mendapatkan perilaku interpreter murni adalah dengan menonaktifkan compiler JIT secara eksplisit saat JVM diluncurkan.
Stephen C
15

Berikut adalah Perbedaan Dasar antara Bahasa Compiler vs Interpreter.

Bahasa Penyusun

  • Mengambil seluruh program sebagai input tunggal dan mengubahnya menjadi kode objek yang disimpan dalam file.
  • Kode Objek Menengah dibuat
  • misal: C, C ++
  • Program yang dikompilasi berjalan lebih cepat karena kompilasi dilakukan sebelum dieksekusi.
  • Persyaratan memori lebih karena pembuatan kode objek.
  • Kesalahan ditampilkan setelah seluruh program dikompilasi
  • Kode sumber --- Kompilator --- Kode Mesin --- Output

Bahasa Penerjemah:

  • Mengambil instruksi tunggal sebagai input tunggal dan menjalankan instruksi.
  • Kode Objek Menengah TIDAK dibuat
  • misalnya: Perl, Python, Matlab
  • Program yang diinterpretasikan berjalan lebih lambat karena kompilasi dan eksekusi berlangsung secara bersamaan.
  • Kebutuhan memori kurang.
  • Kesalahan ditampilkan untuk setiap instruksi.
  • Kode Sumber --- Interpreter --- Output
PGOEL
sumber
5

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".

Salil
sumber
3
Umm, tidak yakin dari mana Anda mendapatkan ini di luar dua pernyataan pertama. Ini secara teknis benar beberapa generasi yang lalu dengan banyak bahasa yang ditafsirkan, tetapi tergantung pada platform dan perhatian terhadap detail, dimungkinkan untuk menafsirkan kode yang berfungsi mendekati atau serta mengkompilasi kode untuk aktivitas tertentu.
GrayWizardx
Mengingat bahwa bahasa seperti Java, C # dan JavaScript yang hampir membanjiri dunia pemrograman saat ini, tidak adil untuk mengatakan bahwa "Kode yang dikompilasi lebih baik untuk aplikasi yang serius."
Sisir
2

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.

Personman
sumber
Sementara Java pertama kali diterjemahkan menjadi bytecode dan hanya saat menjalankan JVM mengubahnya menjadi kode mesin; apakah benar mengatakan itu dikompilasi dan tidak ditafsirkan?
Sisir
1
Saya kira Anda dapat mengatakan bahwa bytecode Java diinterpretasikan, tentu saja, tetapi tidak ada yang menulis bytecode Java. Java sendiri biasanya dikompilasi menjadi bytecode.
Personman
2

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 ++.

Praveen Kishor
sumber
0

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:

  • Bahasa Hard Compiled: Ketika program dikompilasi seluruhnya ke bahasa mesin. Interpreter yang digunakan hanya CPU. Contoh: Biasanya, untuk menjalankan program di C, kode sumber dikompilasi ke bahasa mesin, yang kemudian dieksekusi oleh CPU.
  • Bahasa yang ditafsirkan: Jika tidak ada kompilasi bagian mana pun dari program asli ke bahasa mesin. Dengan kata lain, tidak ada kode mesin baru yang dibuat; hanya kode mesin yang ada yang dijalankan. Penerjemah selain CPU juga harus digunakan (biasanya program). Contoh: Dalam implementasi kanonik Python, kode sumber dikompilasi terlebih dahulu ke bytecode Python dan kemudian bytecode itu dijalankan oleh CPython, program interpreter untuk bytecode Python .
  • Bahasa Soft Compiled: Ketika penerjemah selain CPU digunakan tetapi juga bagian dari program asli dapat dikompilasi ke bahasa mesin. Ini adalah kasus Java, di mana kode sumber dikompilasi ke bytecode terlebih dahulu dan kemudian, bytecode dapat diinterpretasikan oleh Java Interpreter dan / atau lebih lanjut dikompilasi oleh compiler JIT.

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.

MrIo
sumber