Tôi không biết lý do thực sự, không liên quan đến việc thực hiện JVM, nhưng tôi có thể nghĩ ra một số lý do chính đáng:
- Ý tưởng của Java là trở thành một ngôn ngữ viết-một-lần-chạy-ở bất cứ đâu và việc đưa những thứ được biên dịch sẵn vào tệp lớp là loại vi phạm điều đó (chỉ "loại" vì tất nhiên mã byte thực vẫn sẽ ở đó)
- Nó sẽ làm tăng kích thước tệp lớp vì bạn sẽ có cùng một mã ở đó nhiều lần, đặc biệt nếu bạn tình cờ chạy cùng một chương trình dưới nhiều JVM khác nhau (điều này không thực sự phổ biến, khi bạn coi các phiên bản khác nhau là các JVM khác nhau, mà bạn thực sự phải làm)
- Bản thân các tệp lớp có thể không ghi được (mặc dù sẽ khá dễ dàng để kiểm tra điều đó)
- Các tối ưu hóa JVM một phần dựa trên thông tin về thời gian chạy và trên các lần chạy khác, chúng có thể không áp dụng được (mặc dù chúng vẫn sẽ mang lại một số lợi ích)
Nhưng tôi thực sự đang đoán, và như bạn có thể thấy, tôi không thực sự nghĩ rằng bất kỳ lý do nào trong số những lý do của tôi là thực sự dừng show. Tôi nghĩ Sun không coi hỗ trợ này là ưu tiên, và có lẽ lý do đầu tiên của tôi gần với sự thật, vì việc làm này theo thói quen cũng có thể khiến mọi người nghĩ rằng các tệp lớp Java thực sự cần một phiên bản riêng biệt cho mỗi máy ảo thay vì đa nền tảng.
Cách ưa thích của tôi thực sự sẽ là có một trình dịch bytecode-to-native riêng biệt mà bạn có thể sử dụng để làm điều gì đó như thế này một cách rõ ràng trước đó, tạo các tệp lớp được xây dựng rõ ràng cho một máy ảo cụ thể, có thể có mã byte gốc trong chúng để bạn cũng có thể chạy với các máy ảo khác nhau. Nhưng điều đó có lẽ xuất phát từ kinh nghiệm của tôi: Tôi hầu như chỉ làm Java ME, nơi mà thực sự đau đầu là trình biên dịch Java không thông minh hơn về biên dịch.