Semua program memiliki lingkungan runtime. Kita cenderung melupakan ini, tetapi itu ada. Lib standar untuk C yang membungkus panggilan sistem ke sistem operasi. Objective-C memiliki runtime yang membungkus semua pesan yang lewat.
Dengan Java, runtime adalah JVM. Sebagian besar implementasi Java yang dikenal orang mirip dengan HotSpot JVM yang merupakan penerjemah kode byte dan kompiler JIT.
Ini tidak harus menjadi satu-satunya implementasi. Sama sekali tidak ada yang mengatakan Anda tidak dapat membangun runtime lib-esque standar untuk Java dan mengkompilasi kode ke kode mesin asli dan menjalankannya dalam runtime yang menangani panggilan untuk objek baru ke dalam mallocs dan akses file ke panggilan sistem pada mesin. Dan itulah yang dilakukan oleh kompiler Ahead Of Time (AOT daripada JIT). Sebut itu runtime apa yang Anda akan ... Anda bisa menyebutnya implementasi JVM (dan memang mengikuti spesifikasi JVM) atau lingkungan runtime atau lib standar untuk Java. Itu ada dan pada dasarnya melakukan hal yang sama.
Ini bisa dilakukan dengan mengimplementasikan ulang javac
untuk menargetkan mesin asli (seperti yang dilakukan GCJ ). Atau itu bisa dilakukan dengan menerjemahkan kode byte yang dihasilkan oleh javac
ke dalam kode mesin (atau byte) untuk komputer lain - itulah yang dilakukan Android. Berdasarkan Wikipedia itulah yang dilakukan Excelsior JET ("Kompiler mengubah kode byte Java portabel menjadi executable yang dioptimalkan untuk perangkat keras dan sistem operasi (OS)" yang diinginkan), dan hal yang sama berlaku untuk RoboVM .
Ada komplikasi tambahan dengan Java yang berarti ini sangat sulit dilakukan sebagai pendekatan eksklusif. Pemuatan dinamis kelas ( class.forName()
) atau objek yang diproksikan memerlukan dinamika yang tidak mudah disediakan oleh penyusun AOT dan karenanya JVM masing-masing juga harus menyertakan kompiler JIT (Excelsior JET) atau juru bahasa (GCJ) untuk menangani kelas yang tidak dapat dikompilasi menjadi asli.
Ingat, JVM adalah spesifikasi , dengan banyak implementasi . Pustaka standar C juga merupakan spesifikasi dengan banyak implementasi berbeda.
Dengan Java8, sedikit pekerjaan telah dilakukan pada kompilasi AOT. Paling-paling, seseorang hanya dapat meringkas AOT secara umum dalam batas-batas kotak teks. Namun, dalam KTT Bahasa JVM untuk 2015 (Agustus 2015), ada presentasi: Java Goes AOT (video youtube). Video ini berdurasi 40 menit dan masuk ke banyak aspek teknis yang lebih dalam dan tolok ukur kinerja.
gcj
contoh runnable minimalAnda juga dapat mengamati implementasi open source seperti
gcj
(sekarang usang). Misalnya file Java:Kemudian kompilasi dan jalankan dengan:
Sekarang Anda bebas untuk mendekompilasi dan melihat cara kerjanya.
file Main.o
mengatakan itu adalah file peri.readelf -d Main | grep NEEDED
mengatakan itu tergantung pada perpustakaan dinamis:Jadi libgcj.so harus di mana fungsi Java diimplementasikan.
Anda kemudian dapat mendekompilasi dengan:
dan lihat bagaimana penerapannya.
Sepertinya C ++, banyak nama mangling dan panggilan fungsi polimorfik tidak langsung.
Saya bertanya-tanya bagaimana pengumpulan sampah dimulai. Akan bermanfaat untuk melihat ke: /programming/7100776/garbage-collection-implementation-in-compiled-languages dan bahasa kompilasi lainnya dengan GC seperti Go.
Diuji pada Ubuntu 14.04, GCC 4.8.4.
Lihat juga https://en.wikipedia.org/wiki/Android_Runtime , tulang punggung Android 5 dan seterusnya, yang melakukan AOT penuh untuk mengoptimalkan aplikasi Android.
sumber