No conozco las razones reales, no estoy involucrado de ninguna manera en la implementación de JVM, pero puedo pensar en algunas plausibles:
- La idea de Java es ser un lenguaje que se puede escribir una vez y ejecutar en cualquier lugar, y poner cosas precompiladas en el archivo de clase es una violación de eso (solo "un poco" porque, por supuesto, el código de bytes real todavía estaría allí)
- Aumentaría el tamaño de los archivos de clase porque tendría el mismo código allí varias veces, especialmente si ejecuta el mismo programa en varias JVM diferentes (lo cual no es realmente infrecuente, cuando considera que las diferentes versiones son diferentes JVM, lo que realmente tengo que hacer)
- Es posible que los archivos de clase en sí mismos no se puedan escribir (aunque sería bastante fácil verificarlo)
- Las optimizaciones de JVM se basan parcialmente en información en tiempo de ejecución y en otras ejecuciones pueden no ser tan aplicables (aunque aún deberían proporcionar algún beneficio)
Pero realmente estoy adivinando, y como puede ver, realmente no creo que ninguna de mis razones sea un obstáculo real. Supongo que Sun simplemente no considera este soporte como una prioridad, y tal vez mi primera razón sea cercana a la verdad, ya que hacer esto habitualmente también podría llevar a la gente a pensar que los archivos de clases de Java realmente necesitan una versión separada para cada VM en lugar de ser multiplataforma.
Mi forma preferida sería tener un traductor de código de bytes a nativo separado que podría usar para hacer algo como esto explícitamente de antemano, creando archivos de clase que se compilan explícitamente para una máquina virtual específica, con posiblemente el código de bytes original en ellos para que también se puede ejecutar con diferentes VM. Pero eso probablemente proviene de mi experiencia: he estado haciendo principalmente Java ME, donde realmente duele que el compilador de Java no sea más inteligente en la compilación.