Saya tidak tahu alasan sebenarnya, tidak terlibat dengan cara apa pun dalam implementasi JVM, tetapi saya dapat memikirkan beberapa alasan yang masuk akal:
- Ide Java adalah menjadi bahasa tulis-sekali-dijalankan-di mana saja, dan memasukkan hal-hal yang telah dikompilasi ke dalam file kelas adalah jenis pelanggaran itu (hanya "jenis" karena tentu saja kode byte yang sebenarnya akan tetap ada)
- Ini akan meningkatkan ukuran file kelas karena Anda akan memiliki kode yang sama di sana beberapa kali, terutama jika Anda menjalankan program yang sama di bawah beberapa JVM yang berbeda (yang sebenarnya tidak jarang, ketika Anda menganggap versi yang berbeda sebagai JVM yang berbeda, yang Anda benar-benar harus dilakukan)
- File kelas itu sendiri mungkin tidak dapat ditulis (meskipun akan sangat mudah untuk memeriksanya)
- Pengoptimalan JVM sebagian didasarkan pada informasi waktu proses dan pada proses lain mungkin tidak dapat diterapkan (meskipun masih memberikan beberapa manfaat)
Tapi saya benar-benar menebak, dan seperti yang Anda lihat, saya tidak benar-benar berpikir alasan saya adalah penghenti pertunjukan yang sebenarnya. Saya pikir Sun tidak menganggap dukungan ini sebagai prioritas, dan mungkin alasan pertama saya mendekati kebenaran, karena melakukan ini biasanya mungkin juga membuat orang berpikir bahwa file kelas Java benar-benar membutuhkan versi terpisah untuk setiap VM daripada menjadi lintas platform.
Cara yang saya sukai sebenarnya adalah memiliki penerjemah bytecode-to-native terpisah yang dapat Anda gunakan untuk melakukan sesuatu seperti ini secara eksplisit sebelumnya, membuat file kelas yang secara eksplisit dibangun untuk VM tertentu, dengan kemungkinan bytecode asli di dalamnya sehingga Anda dapat berjalan dengan VM yang berbeda juga. Tapi itu mungkin berasal dari pengalaman saya: Saya kebanyakan melakukan Java ME, di mana sangat menyakitkan karena kompiler Java tidak lebih pintar tentang kompilasi.