Sebagian besar situs web di internet mengatakan:
"gunakan
javac
perintah untuk mengkompilasi.java
file. Kemudian jalankan dengan menggunakanjava
perintah"
Tapi hari ini saya mencoba menjalankan program java tanpa javac
dan saya mendapat hasil yang aneh.
Berikut adalah isi file yang disebut hello.java
:
public class Myclass {
public static void main(String[] args){
System.out.println("hello world");
}
}
Lalu aku berlari:
$ javac hello.java
Yang memberi saya kesalahan ini:
hello.java:1: error: class Myclass is public, should be declared in a file named Myclass.java
public class Myclass {
^
1 error
Tetapi ketika saya menjalankannya tanpa javac
perintah, itu dieksekusi tanpa kesalahan.
$ java hello.java
hello world
Apakah java
perintah juga mengkompilasi program? Jika ya, mengapa kita membutuhkan javac
perintah?
Versi java saya adalah:
openjdk version "12.0.2" 2019-07-16
OpenJDK Runtime Environment (build 12.0.2+10)
OpenJDK 64-Bit Server VM (build 12.0.2+10, mixed mode)
Myclass.java
dan kemudian dari baris perintah kompilasi seperti inijavac Myclass.java
dan kemudian jalankan seperti inijava Myclass
.javac
masih digunakan untuk mengkompilasi jika Anda tidak ingin menyebarkan kode sumber, atau Anda memiliki lebih dari satu file ( dokumentasi darijava
: untuk opsi sumber-berkas Hanya digunakan untuk meluncurkan program sumber-file tunggal.)javac
mengkompilasi sumber Java ke dalam bytecode spesifik JVM yang ditafsirkan danjava
perintah memuatnya di dalam ClassLoader JVM.Jawaban:
Sebelum ke Java 11, untuk menjalankan kode Anda, Anda harus terlebih dahulu mengkompilasinya, kemudian Anda dapat menjalankannya. Ini sebuah contoh:
Sejak Java 11, Anda masih dapat melakukan
javac
+java
, atau Anda dapat menjalankannyajava
sendiri untuk mengkompilasi dan menjalankan otomatis kode Anda. Perhatikan bahwa tidak ada.class
file yang akan dihasilkan. Ini sebuah contoh:Jika Anda menjalankan
java -help
, Anda akan melihat berbagai penggunaan yang diizinkan. Begini tampilannya di komputer saya. Yang terakhir adalah apa yang Anda temui:java [options] <sourcefile> [args]
yang akan "mengeksekusi program file sumber tunggal".MEMPERBARUI:
Seperti yang ditunjukkan oleh @BillK, OP juga bertanya:
Alasan yang kita butuhkan
javac
adalah membuat.class
file sehingga kode dapat dibuat, diuji, didistribusikan, dijalankan, dibagikan, dll. Seperti sekarang ini. Motivasi untuk JEP 330 adalah untuk membuatnya lebih mudah untuk "tahap awal belajar Java, dan ketika menulis program utilitas kecil" tanpa mengubah kegunaan lain yang ada.sumber
1.
di1.8
dalam rilis yang lebih baru)javac
.Jika Anda menjalankan Java 11, ada fitur baru yang memungkinkan eksekusi file sumber tunggal. Kompiler sumber tunggal lebih bebas dalam hal nama kelas dibandingkan nama file, sehingga Anda dapat menjalankannya tetapi tidak berhasil mengompilasi.
Jika Anda menggunakan versi Java sebelumnya, maka hello.java Anda saat ini tidak dapat dikompilasi, karena kesalahan kompilasi, khususnya di sekitar nama kelas. Jadi sama sekali tidak ada cara memanggil java hello.java mengkompilasi kode Anda, karena itu tidak mengkompilasi.
Tampaknya kemungkinan besar Anda menjalankan beberapa kode yang dikompilasi sebelumnya ketika menjalankan perintah java.
sumber
Untuk menjawab mengapa kesalahan ini diberikan, nama kelas untuk file tersebut harus cocok dengan file tersebut
basename
.Anda memiliki dua opsi untuk membuat kode ini berfungsi untuk tradisional
javac
;java
urutan:Ubah nama kelas menjadi
public class Hello
atauGanti nama
hello.java
menjadimyclass.java
.The
java
interpreter untuk Java 11 tidak memaksakan persyaratan ini. Kelas yang berisimain
dapat memiliki nama apa saja, asalkan itu adalah kelas pertama dalam file. Ini terutama dimaksudkan untuk memudahkan proses pembelajaran bagi pemula, dan untuk memungkinkan "scripting java" dengan shebang ( ref. ).sumber
Ya, tapi tidak dengan cara yang Anda maksudkan.
Ketika Anda menggunakan
javac
perintah untuk mengkompilasi file .java ke file .class, outputnya adalah sesuatu yang disebut bytecode. Bytecode adalah kode mesin (instruksi asli) untuk CPU teoretis berdasarkan spesifikasi Java Virtual Machine.Spesifikasi CPU virtual ini adalah jenis rata-rata jenis CPU yang umum pada saat spesifikasi ditulis. Karena ini, ia dekat dengan banyak jenis CPU yang berbeda sehingga memudahkan untuk menjalankan file Java .class yang sama pada beberapa jenis CPU.
Ketika Java pertama kali diluncurkan,
java
perintah akan membaca file .class dan menginterpretasikan instruksi bytecode satu per satu dan kemudian memetakannya ke instruksi asli yang setara untuk CPU yang sebenarnya dijalankan. Ini berhasil tetapi tidak terlalu cepat. Untuk meningkatkan kompilasi Just in Time (JIT) ini telah ditambahkan ke Java Runtime.Dengan JIT,
java
perintah tersebut mengambil bytecode dan mengkompilasinya kembali ke instruksi asli untuk CPU yang digunakan. Runtime Java modern cenderung mulai menafsirkan bytecode sementara JIT mengkompilasi di latar belakang dan beralih ke instruksi asli yang dikompilasi ketika sudah siap dan juga akan profil aplikasi yang berjalan dan kemudian mengkompilasi ulang bytecode lagi dengan optimasi yang berbeda untuk mendapatkan kinerja terbaik.EDIT (untuk menenangkan pemilih yang turun):
Jadi dalam kasus spesifik Anda (saat Anda menjalankan JRE lebih baru dari v11) kode dikompilasi (setidaknya) dua kali
sumber
mixed-mode
dalam versi keluaran