2008-08-21 16 views
8

Estoy jugando con a toy interpreter in Java y estaba considerando intentar escribir un compilador simple que pueda generar bytecode para Java Virtual Machine. Lo que me hizo pensar, ¿cuánta optimización deben hacer los compiladores que se dirigen a máquinas virtuales como JVM y CLI?Virtual Machine Optimization

Los compiladores Do Just In Time (JIT) realizan optimizaciones constantes de plegado, mirilla, etc.

Respuesta

0

La optimización de bytecode es probablemente un oxímoron en la mayoría de los casos. A menos que controle la máquina virtual, no tiene idea de lo que hace para acelerar la ejecución del código, en todo caso. El compilador necesitaría conocer los detalles de la VM para generar código optimizado.

3

código de bytes La optimización es, probablemente, una contradicción en la mayoría de los casos

No creo que eso sea cierto. Las optimizaciones como las invariantes de ciclo de elevación y las constantes de propagación nunca pueden perjudicar, incluso si la JVM es lo suficientemente inteligente como para hacerlas por sí misma, por la simple virtud de hacer que el código funcione menos.

3

La optimización es lo que hace que las JVM sean viables como entornos para aplicaciones de larga ejecución, puede apostar que SUN, IBM y sus amigos hacen todo lo posible para optimizar su código byte y código compilado JIT de la manera más eficiente posible.

Dicho esto, si crees que puedes preoptizar tu bytecode, probablemente no haga mucho daño.

Sin embargo, vale la pena tener en cuenta que las JVM pueden tender a desempeñarse mejor (y no fallar) cuando se presentan con el tipo de bytecode que el compilador de Java tiende a construir. No es desconocido que las optimizaciones se pierdan o incluso que la JVM se bloquee cuando se produzcan permutaciones de bytecode correctas, pero a diferencia de lo que produciría javac. Afortunadamente, ese tipo de cosas ahora está más en el pasado, pero puede ser algo a tener en cuenta.

2

Obfuscators como ProGuard realizarán muchas optimizaciones estáticas en su bytecode.

1

El compilador de HotSpot optimizará su código en tiempo de ejecución mejor de lo que es posible en tiempo de compilación: tiene más información para trabajar, después de todo. La única vez que debe optimizar el bytecode en lugar de solo su algoritmo es cuando se dirige a dispositivos móviles, como Blackberry, donde la JVM para esa plataforma no es lo suficientemente potente como para optimizar el código en tiempo de ejecución y simplemente ejecuta el bytecode.

0

Nota para Aseraphim:

También puede ser útil para optimizar el código de bytes para aplicaciones no incrustadas en algunos casos limitados:

  1. Cuando la entrega de código sobre el alambre, por ejemplo, para aplicaciones WebStart a minimice el tamaño de entrega/caché y porque no conoce necesariamente la capacidad/velocidad del cliente.

  2. Para el código que usted sabe que es crítico para el rendimiento y se usa en la puesta en marcha antes (por ejemplo) HotSpot ha tenido tiempo para recopilar cualquier estadística.

De nuevo, las transformaciones que realiza un buen optimizador/ofuscador pueden ser muy útiles.

Cuestiones relacionadas