2011-02-03 12 views
5

Estoy escribiendo mi propia copia de la JVM y me gustaría probar su comportamiento en algunas operaciones numéricas simples, como adiciones, restas, desbordamiento numérico, etc. En lugar de escribir el bytecode a mano, pensé que sería una buena idea simplemente escribir código Java simple, tener javac compilarlo en bytecode, y luego probar la JVM en ese bytecode.¿Desactivar la optimización en javac?

El problema es que javac está realizando muchas optimizaciones en línea (¡muy sensatas!) Que evitan que el código pruebe lo que me gustaría que probara. Por ejemplo, una prueba intenta verificar que los desbordamientos integrales se manejen correctamente para todos los tipos. He aquí una instantánea:

byte min = (byte)-128; 
byte max = (byte) 127; 

assertTrue((byte)(max + 1) == min); // Should overflow and work correctly. 

El .class archivo generado tiene el resultado de ((byte)max + 1) hardcoded como (byte) -128, lo que contradice por completo el punto de la prueba.

Mi pregunta es esta: ¿hay alguna manera de deshabilitar la optimización en javac? No he podido encontrar un modificador de línea de comandos para hacer esto, aunque tal vez simplemente no he buscado lo suficiente. Si no hay forma de hacerlo, ¿hay otro compilador de Java que tenga la capacidad de compilar con todas las optimizaciones desactivadas?

Respuesta

1

Muchos compiladores de producción, incluido el derivado de Sun común javac, hacen ese tipo de simplificación independientemente de la optimización que se haya establecido.

¿Ha mirado Jasmin, el bytecode de Java 'ensamblador'?

+0

no he oído hablar de Jasmin! Ese es un enlace genial. Puede que tenga que investigar esto. – templatetypedef

3

Creo que la mayoría de las optimizaciones que parece pensar en realidad son obligatorias por el JLS, ya que son constant expressions. Por lo tanto, asegúrese de que no tenga expresiones constantes, y javac no puede optimizarlas.

En su ejemplo, puede escribir así:

byte min = new Byte((byte)-128).byteValue(); 
byte max = new Byte((byte) 127).byteValue(); 

assertTrue((byte)(max + 1) == min); // Should overflow and work correctly. 
Cuestiones relacionadas