Sejak Java 1.6, JVM dapat menjalankan berbagai bahasa pemrograman di atas, bukan hanya Java. Saya secara konseptual memahami bagaimana Java dijalankan pada Java VM, tetapi tidak bagaimana bahasa lain dapat berjalan di sana juga. Bagi saya, itu semua tampak seperti ilmu hitam. Apakah Anda memiliki artikel yang ingin saya tunjukkan agar saya dapat lebih memahami bagaimana semua ini cocok?
12
Jawaban:
Kuncinya adalah bahasa asli JVM: bytecode Java. Bahasa apa pun dapat dikompilasi menjadi bytecode yang dipahami JVM - semua yang Anda butuhkan untuk ini adalah bytecode yang memancarkan kompiler. Sejak saat itu, tidak ada perbedaan dari sudut pandang JVM. Sedemikian rupa sehingga Anda dapat mengambil file kelas Scala, Clojure, Jython dll yang telah dikompilasi dan mendekompilasi (menggunakan misalnya JAD ) menjadi kode sumber Java yang terlihat normal.
Anda dapat menemukan detail lebih lanjut tentang ini di artikel / utas berikut:
Saya tidak mengetahui adanya perubahan mendasar pada Java 5 atau 6 JVM yang akan membuatnya mungkin atau lebih mudah untuk (kode dikompilasi dari) bahasa lain untuk dijalankan di dalamnya. Dalam pemahaman saya, JVM 1.4 lebih atau kurang mampu dalam hal itu seperti JVM 6 (mungkin ada perbedaan; Saya bukan ahli JVM). Hanya saja orang mulai mengembangkan bahasa lain dan / atau kompiler bytecode pada paruh pertama dekade ini, dan hasilnya mulai muncul (dan menjadi lebih dikenal) sekitar 2006 ketika Java 6 diterbitkan.
Namun, semua versi JVM ini berbagi beberapa keterbatasan: JVM secara statis diketik berdasarkan sifatnya, dan hingga rilis 7, tidak mendukung bahasa dinamis. Ini telah berubah dengan diperkenalkannya
invokedynamic
, instruksi bytecode baru yang memungkinkan pemanggilan metode bergantung pada pemeriksaan tipe dinamis.sumber
Mesin virtual, seperti JVM, adalah program yang menerima sebagai input, biasanya file, seperangkat instruksi sederhana (yang biasanya mudah dikonversi menjadi instruksi CPU nyata), dan sebenarnya mengkompilasi dan menjalankannya sebagai instruksi CPU asli (biasanya menggunakan kompiler sesuai permintaan seperti HotSpot atau JIT).
Ini pada dasarnya adalah lapisan abstraksi. Biasanya lebih mudah untuk menempatkan implementasi set instruksi VM ke arsitektur prosesor yang berbeda, karena beberapa kesamaan (seperti berbasis stack). Ini juga jauh lebih mudah untuk port bahasa pemrograman yang berbeda untuk instruksi VM, karena itu lebih berorientasi pada bahasa pemrograman modern daripada instruksi CPU primitif. Banyak Mesin Virtual seperti JVM dan CLR (.NET) berisi instruksi untuk memanggil metode virtual, dan membuat instance objek.
Jadi mari kita ambil sebuah bahasa sebagai contoh. Sebut saja MyLanguage. Karena ini adalah bahasa pemrograman, akhirnya dikompilasi hingga ke beberapa instruksi arsitektur CPU. Jadi itu berarti bahwa, mengingat set instruksi Mesin Virtual yang kompatibel dan fleksibel, juga memungkinkan untuk mengkompilasi MyLanguage ke set instruksi VM itu.
Selalu ada pertanyaan tentang efisiensi, karena Anda mungkin perlu meretas beberapa solusi dalam set instruksi VM yang tidak harus Anda lakukan secara native, tetapi itu masih mungkin.
sumber
JVM adalah mesin komputasi Turing-complete (kecuali untuk memori terbatas), dan mesin Turing-complete (fisik atau virtual) apa pun dapat mengeksekusi bahasa pemrograman apa pun (kecuali untuk memori, kinerja, dan keterbatasan IO fisik).
sumber
Untuk sesaat pikirkan saja JVM sebagai prosesor dengan set instruksi sendiri seperti mungkin x86. Prosesor dapat mengeksekusi kode say C yang telah dikompilasi ke dalam bahasa mesinnya. Menerapkan analogi yang sama dengan JVM, Bahasa lain dapat dieksekusi di JVM seperti pada prosesor lain jika bahasa-bahasa tersebut dikompilasi ke instruksi mesin JVM. JVM kemudian dapat menjalankan instruksi ini untuk bahasa X.
sumber