(Pertama-tama, saya harus menjelaskan bahwa kompiler dan mesin virtual ( alias ) adalah bidang yang sama sekali tidak dikenal bagi saya)
Seperti yang saya pahami, setiap kali aplikasi Java / C # / ... dijalankan, VM dipanggil dan menerjemahkan kode perantara (bytecode, CIL, dll) ke instruksi mesin.
Tetapi mengapa operasi ini tidak dapat dilakukan hanya sekali - pada waktu instalasi?
Jawaban:
Dalam kasus Java, JVM dapat melakukan optimasi yang melintasi batas perpustakaan. Misalnya, Anda dapat menguraikan metode dari pustaka ke dalam kode klien Anda sendiri. Jenis optimasi ini tidak dapat dilakukan pada waktu kompilasi, karena perpustakaan dapat berubah sebelum eksekusi. Sangat mungkin libfoo-1.0 Anda digantikan oleh libfoo-1.1 tanpa kompilasi ulang. Jika itu terjadi, inline pustaka yang dilakukan pada waktu kompilasi akan menjadi sama sekali tidak valid.
Dengan melakukan optimasi hanya pada saat runtime, tidak ada kekhawatiran bahwa perubahan pustaka di bawah Anda akan membatalkan optimasi.
sumber
Karena ini mencegah mereka menggunakan banyak fitur. Sebagai contoh, bagaimana JIT dapat menghasilkan instance generik baru dari DLL yang dimuat saat run-time? DLL itu tidak ada pada saat instalasi.
sumber
Bisa dan sering, setidaknya dengan aplikasi .NET. Lihat Native Image Generator
sumber
Untuk mengulangi pertanyaan sesuai dengan klarifikasi:
Saya melihat masalah berikut:
Di mana hasil disimpan? Anda tidak dapat mengasumsikan bahwa file yang mengandung bytecode dapat ditulis; Anda tidak ingin menggembungkan mesin pengembang dengan membuang .exe baru ke penyimpanan permanen setiap kali ia menjalankan tes; dan jika Anda menyimpan file dalam penyimpanan sementara maka file itu akan hilang pada saat Anda reboot, jadi Anda belum mendapatkan banyak.
Anda menukar startup yang sedikit lambat setiap kali dengan startup yang sangat lambat pertama kali. Tidak akan meninggalkan kesan hebat pada klien.
Anda akan mengalami masalah signifikan dengan pemuatan kelas dinamis.
sumber