Apakah Java sebuah bahasa pemrograman yang Dikompilasi atau Diartikan?

169

Di masa lalu saya telah menggunakan C ++ sebagai bahasa pemrograman. Saya tahu bahwa kode yang ditulis dalam C ++ melewati proses kompilasi sampai menjadi kode objek "kode mesin".

Saya ingin tahu bagaimana Java bekerja dalam hal itu. Bagaimana pengguna menulis kode Java yang dijalankan oleh komputer?

nama tampilan
sumber
14
C ++ dapat diartikan. Ada beberapa juru bahasa C di luar sana.
Tom Hawtin - tackline

Jawaban:

220

Implementasi Java biasanya menggunakan proses kompilasi dua langkah. Kode sumber Java dikompilasi ke bytecode oleh kompiler Java. Bytecode dijalankan oleh Java Virtual Machine (JVM). JVM modern menggunakan teknik yang disebut kompilasi Just-in-Time (JIT) untuk mengkompilasi bytecode ke instruksi asli yang dipahami oleh CPU perangkat keras dengan cepat saat runtime.

Beberapa implementasi JVM dapat memilih untuk menginterpretasikan bytecode alih-alih JIT mengkompilasinya ke kode mesin, dan menjalankannya secara langsung. Meskipun ini masih dianggap sebagai "interpreter," Ini sangat berbeda dari penerjemah yang membaca dan mengeksekusi kode sumber tingkat tinggi (yaitu dalam hal ini, kode sumber Java tidak ditafsirkan secara langsung, bytecode, output dari kompiler Java, adalah.)

Secara teknis dimungkinkan untuk mengkompilasi Java ke kode asli sebelumnya dan menjalankan biner yang dihasilkan. Dimungkinkan juga untuk menafsirkan kode Java secara langsung.

Untuk meringkas, tergantung pada lingkungan eksekusi, bytecode dapat berupa:

  • dikompilasi sebelumnya dan dieksekusi sebagai kode asli (mirip dengan kebanyakan kompiler C ++)
  • dikompilasi tepat waktu dan dieksekusi
  • ditafsirkan
  • langsung dieksekusi oleh prosesor yang didukung (bytecode adalah set instruksi asli dari beberapa CPU)
Mehrdad Afshari
sumber
20
Sebenarnya, beberapa HotSpot JVM memulai dengan menafsirkan bytecodes, dan hanya mengkompilasinya ke kode asli setelah mereka mengetahui apa yang layak dikompilasi, dan mengumpulkan beberapa statistik tentang bagaimana kode tersebut dijalankan; misalnya untuk mengetahui jalur paling umum yang diambil di setiap cabang kondisional.
Stephen C
1
Oleh karena itu, istilah 'Hotspot' :) Itu berlaku untuk apa yang sering berjalan, untuk mendapatkan optimasi.
Noon Silk
4
Anda bisa mematikan juru bahasa di HotSpot dengan -Xcomp. Pantas untuk dicoba pada aplikasi untuk melihat ide buruk apa itu.
Tom Hawtin - tackline
1
Ada pernyataan "Versi saat ini dari Sun HotSpot JVM menggunakan teknik yang disebut kompilasi Just-in-time (JIT) untuk mengkompilasi bytecode ke instruksi asli yang dipahami oleh CPU dengan cepat pada saat run time." Saya mendapat kesan bahwa JVM adalah seorang juru bahasa, tetapi itu menyarankan lebih lanjut mengkompilasi kode byte. Saya bingung. Juga ada tertulis bahwa ia melakukannya dengan cepat saat runtime. Adakah yang bisa menjelaskan hal ini juga?
Anand
karena java adalah bahasa yang diartikan bagaimana itu akan mempengaruhi kinerja atau eksekusi aplikasi java
NAND
93

masukkan deskripsi gambar di sini

Kode yang ditulis dalam Java adalah:

  • Pertama dikompilasi untuk bytecode oleh program yang disebut javac seperti yang ditunjukkan pada bagian kiri gambar di atas;
  • Kemudian, seperti yang ditunjukkan pada bagian kanan gambar di atas, program lain yang disebut java memulai lingkungan runtime Java dan mungkin mengkompilasi dan / atau menginterpretasikan bytecode dengan menggunakan Java Interpreter / JIT Compiler.

Kapan java menginterpretasikan bytecode dan kapan kompilasi? Kode aplikasi awalnya ditafsirkan, tetapi monitor JVM yang urutan bytecode sering dieksekusi dan menerjemahkannya ke kode mesin untuk eksekusi langsung pada perangkat keras. Untuk bytecode yang dijalankan hanya beberapa kali, ini menghemat waktu kompilasi dan mengurangi latensi awal; untuk bytecode yang sering dieksekusi, kompilasi JIT digunakan untuk berjalan dengan kecepatan tinggi, setelah fase awal interpretasi lambat. Selain itu, karena suatu program menghabiskan sebagian besar waktu mengeksekusi sebagian kecil kodenya, pengurangan waktu kompilasi menjadi signifikan. Akhirnya, selama interpretasi kode awal, statistik eksekusi dapat dikumpulkan sebelum kompilasi, yang membantu untuk melakukan optimasi yang lebih baik.

nama tampilan
sumber
Apakah karena bytecode di-cache bahwa Java menggunakan banyak memori?
Pedro Gordo
3
@sedulam: 'Banyak memori' adalah pernyataan kabur. Manajemen memori Java cukup mudah - Tiga generasi adalah apa yang JVM gunakan untuk membuat dan memelihara objek-objeknya. Ini jawaban SO lainnya mungkin berguna untuk Anda.
displayName
Dengan penjelasan di atas, secara teoritis, kode kompilasi C ++ akan selalu lebih cepat daripada kode java yang serupa secara logis karena akan selalu ada sebagian file .class yang JIT memutuskan untuk tidak bertransformasi menjadi kode mesin. Dengan kata lain, java tidak pernah dapat menangkap kecepatan eksekusi bare metal yang telah ditunjukkan oleh C ++. Apakah asumsi ini benar?
DevdattaK
@DevdattaK: Saya tidak tahu C ++ sebanyak itu, tetapi dugaan saya adalah bahwa untuk program yang lebih kecil dan khusus, Java dapat memberi Anda hasil lebih cepat karena tidak akan membuang waktu untuk mengkompilasi bagian-bagian kode yang tidak tersedia kecepatannya.
displayName
1
@DevdattaK asumsi Anda dibahas di halaman wiki ini en.m.wikipedia.org/wiki/Java_performance?wprov=sfla1 Singkatnya, itu tidak selalu benar.
Sundar Rajan
57

Istilah "bahasa yang ditafsirkan" atau "bahasa yang dikompilasi" tidak masuk akal, karena bahasa pemrograman apa pun dapat ditafsirkan dan / atau dikompilasi.

Adapun implementasi Java yang ada, sebagian besar melibatkan langkah kompilasi untuk bytecode , sehingga mereka melibatkan kompilasi. Runtime juga dapat memuat bytecode secara dinamis, sehingga beberapa bentuk interteter bytecode selalu diperlukan. Juru bahasa itu mungkin atau mungkin tidak menggunakan kompilasi untuk kode asli secara internal.

Kompilasi just-in-time parsial beberapa hari ini digunakan untuk banyak bahasa yang pernah dianggap "ditafsirkan", misalnya JavaScript.

starblue
sumber
5
Juga, Mesin Eksekusi JavaScript V8 Google tidak hanya melakukan kompilasi just-in-time parsial. Itu selalu mengkompilasi ke kode asli, pada kenyataannya, V8 bahkan tidak memiliki juru bahasa. Ini hanya memiliki kompiler (mirip dengan Maxine, tetapi tidak seperti Maxine V8 hanya memiliki satu kompiler). Ketiga contoh ini (GCJ, Maxine dan V8) membuktikan maksud Anda bahkan lebih kuat: tidak ada hal seperti bahasa yang ditafsirkan atau bahasa yang dikompilasi. Bahasa tidak ditafsirkan atau dikompilasi. Sebuah bahasa adalah (Itu sebenarnya kutipan oleh Shriram Krishnamurthi).
Jörg W Mittag
3
Mengapa Anda berbicara tentang javascript dalam pertanyaan java?
Koray Tugay
1
@ KorayTugay Sebagai contoh. Saya tentu tidak ingin menyiratkan bahwa Java dan Javascript memiliki kesamaan selain dari empat huruf pertama dari nama mereka.
starblue
Akankah setidaknya perbedaan dalam bahasa yang ditafsirkan dan dikompilasi tidak berarti bahwa biner bahasa yang dikompilasi tidak dapat mengubah alur eksekusi setiap saat, sementara bahasa yang ditafsirkan sangat patuh pada beberapa fungsi fungsi saat ini? Perpustakaan di C adalah opsi sementara dalam bahasa lain Anda tidak dapat memiliki objek array tanpa ekstensi biner C yang dapat diperbarui atau kode yang sama sekali berbeda pada platform lain. Bahasa Scripting akan dapat dijalankan pada keduanya sementara bahasa yang dikompilasi akan membutuhkan biner yang berbeda untuk dijalankan
Eaton Emmerich
53

Java dikompilasi ke bytecode, yang kemudian masuk ke Java VM, yang menerjemahkannya.

Sutra Siang
sumber
33
... tapi tidak sepenuhnya akurat.
Stephen C
2
JVM mungkin memilih untuk tidak "menafsirkan" bytecode. Ia dapat mengkompilasi JIT dan menjalankannya secara langsung.
Mehrdad Afshari
1
JIT tidak secara teknis mengeksekusinya secara langsung. Hanya mengingat bagaimana itu dieksekusi.
cletus
Mehrdad: Setuju, saya tidak menggambarkan kemungkinan operasi JIT di sini, karena saya menganggap itu hingga JVM, dan saya tetap menjaga jawaban saya sederhana :)
Noon Silk
7
cletus: Setelah JIT, itu akan langsung dieksekusi. JIT membaca sepotong bytecode (misalnya metode lengkap ) dan mengkompilasi ke kode mesin dan melompat ke sana.
Mehrdad Afshari
12

Java adalah bahasa pemrograman yang dikompilasi, tetapi alih-alih mengkompilasi langsung ke kode mesin yang dapat dieksekusi, Java mengkompilasi ke bentuk biner menengah yang disebut kode byte JVM. Kode byte kemudian dikompilasi dan / atau ditafsirkan untuk menjalankan program.

Sam Harwell
sumber
11

Jenis keduanya. Pertama java dikompilasi (beberapa lebih suka mengatakan "diterjemahkan") untuk bytecode, yang kemudian dikompilasi, atau ditafsirkan tergantung pada mood JIT.

maykeye
sumber
32
Itu bagian dari perangkat lunak yang canggih, untuk mengembangkan suasana hati :)
Thorarin
5
JIT memang merupakan bagian dari perangkat lunak yang sangat canggih, yang dapat melakukan optimasi berdasarkan informasi runtime (seperti profiler), yang tidak dapat dilakukan oleh kompiler masa depan (karena tidak memiliki informasi tentang perilaku runtime dari sebuah program sebelumnya). Tapi itu mungkin tidak benar-benar memiliki suasana hati ... :-)
Jesper
5

Java melakukan kompilasi dan interpretasi,

Di Jawa, program tidak dikompilasi menjadi file yang dapat dieksekusi ; mereka dikompilasi menjadi bytecode (seperti yang dibahas sebelumnya), yang kemudian ditafsirkan oleh JVM (Java Virtual Machine) / dijalankan pada saat runtime. Kode sumber Java dikompilasi menjadi bytecode ketika kita menggunakan kompiler javac. Bytecode akan disimpan di disk dengan ekstensi file .class .

Ketika program dijalankan, bytecode dikonversi , bytecode dapat dikonversi, menggunakan kompilator just-in-time (JIT). Hasilnya adalah kode mesin yang kemudian diumpankan ke memori dan dieksekusi.

Javac adalah Java Compiler yang mengkompilasi kode Java ke Bytecode. JVM adalah Java Virtual Machine yang Menjalankan / Menafsirkan / menerjemahkan Bytecode ke Kode Mesin Asli. Di Jawa meskipun dianggap sebagai bahasa yang ditafsirkan, itu dapat menggunakan kompilasi JIT (Just-in-Time) ketika bytecode berada di JVM. Kompiler JIT membaca bytecode di banyak bagian (atau secara penuh, jarang) dan mengkompilasinya secara dinamis ke dalam kode mesin sehingga program dapat berjalan lebih cepat, dan kemudian di-cache dan digunakan kembali nanti tanpa perlu dikompilasi ulang. Jadi kompilasi JIT menggabungkan kecepatan kode yang dikompilasi dengan fleksibilitas interpretasi.

Sebuah bahasa ditafsirkan adalah jenis bahasa pemrograman yang sebagian besar implementasi yang mengeksekusi instruksi langsung dan bebas, tanpa sebelumnya kompilasi program ke instruksi mesin-bahasa. Penerjemah mengeksekusi program secara langsung, menerjemahkan setiap pernyataan ke dalam urutan satu atau lebih subrutin yang telah dikompilasi ke dalam kode mesin.

Sebuah bahasa yang dikompilasi adalah bahasa pemrograman yang implementasi biasanya compiler (penerjemah yang menghasilkan kode mesin dari kode sumber), dan tidak juru (langkah-demi-langkah pelaksana kode sumber, di mana tidak ada terjemahan pra-runtime terjadi)

Dalam implementasi bahasa pemrograman modern seperti di Jawa, platform semakin populer untuk menyediakan kedua opsi.

utama
sumber
Harus “bytecode dapat diubah” daripada “ adalah dikonversi”. Spesifikasi Java mendefinisikan bytecode. Apakah bytecode dijalankan (a) langsung di perangkat keras , (b) melalui penerjemah, (c) dikompilasi sebelumnya, atau (d) dikompilasi secara on-the-fly saat runtime , semua dibiarkan sebagai detail implementasi. Perhatikan bahwa keempat opsi itu memang telah digunakan oleh berbagai implementasi Java dunia nyata.
Basil Bourque
Terima kasih telah menunjukkan ini. Jadi apa yang terjadi jika bytecode tidak dikonversi ke kode mesin? Saya bisa memikirkan skenario di mana bytecode adalah set instruksi asli untuk beberapa prosesor dan kemudian tidak perlu untuk konversi. Atau apakah saya melewatkan sesuatu.
prime
Klik tautan yang saya berikan untuk teknologi Jazelle DBX (Direct Bytecode eXecution) , di mana subset dari byvec JVM adalah instruksi mesin asli dari CPU (agak-agak). Tanpa itu, Anda mendapatkan kode mesin yang dihasilkan dari bytecode (a) dari interpreter (on the fly), (b) dari compiler sebelumnya, atau (c) on-the-fly dengan compiler just-in-time ( ditafsirkan pada awalnya, dan kemudian terkadang dikompilasi dan di-cache selama eksekusi).
Basil Bourque
-2

Java adalah bahasa yang dikompilasi byte yang menargetkan platform yang disebut Java Virtual Machine yang berbasis tumpukan dan memiliki beberapa implementasi yang sangat cepat pada banyak platform.

hobbs
sumber
1
Apa yang dimaksud dengan "byte-compiled"?
Jesper
2
@Jesper: "Byte-compiled" biasanya berarti "dikompilasi ke bytecode". "Bytecode" adalah istilah umum yang mencakup segala jenis kode perantara non-tekstual (umumnya tidak dapat dieksekusi mesin).
Greg Hewgill
-3

Kutipan dari: https://blogs.oracle.com/ask-arun/entry/run_your_java_applications_faster

Pengembang aplikasi dapat mengembangkan kode aplikasi pada berbagai OS yang tersedia di pasaran saat ini. Bahasa Jawa agnostik pada tahap ini ke OS. Kode sumber brilian yang ditulis oleh pengembang Aplikasi Java sekarang dikompilasi ke kode Java Byte yang dalam terminologi Java disebut sebagai kompilasi Sisi Klien. Kompilasi ke kode Byte Java inilah yang memungkinkan pengembang Java untuk 'menulis sekali'. Kode Java Byte dapat dijalankan pada OS dan server yang kompatibel, karenanya membuat kode sumber agnostik OS / Server. Setelah pembuatan kode Java Byte, interaksi antara aplikasi Java dan OS / Server yang mendasarinya lebih intim. Perjalanan berlanjut - Kerangka kerja aplikasi perusahaan mengeksekusi kode Java Byte ini dalam lingkungan run time yang dikenal sebagai Java Virtual Machine (JVM) atau Java Runtime Environment (JRE). JVM memiliki hubungan dekat dengan OS dan Perangkat Keras yang mendasarinya karena memanfaatkan sumber daya yang ditawarkan oleh OS dan Server. Kode Java Byte sekarang dikompilasi ke kode yang dapat dieksekusi bahasa mesin yang spesifik platform. Ini disebut sebagai kompilasi sisi Server.

Jadi saya akan mengatakan Java jelas merupakan bahasa yang dikompilasi.

Teo
sumber