在javac中禁用优化?

时间:2011-02-03 02:21:50

标签: optimization javac

我正在编写自己的JVM副本,并希望在一些简单的数字操作上测试它的行为,例如加法,减法,数字溢出等。而不是手工编写字节码,我认为它会是只编写普通的Java代码,让javac将其编译为字节码,然后在该字节码上测试JVM。

问题是javac正在进行大量(非常明智的!)内联优化,这些优化会阻止代码测试我想要测试的内容。例如,一个测试试图验证是否正确处理了所有类型的积分溢出。这是一个快照:

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

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

生成的.class文件的结果为((byte)max + 1)硬编码为(byte) -128,这完全违背了测试点。

我的问题是:有没有办法在javac 中禁用优化?我无法找到命令行开关来执行此操作,但也许我只是看起来不够努力。如果没有办法做到这一点,是否有另一个Java编译器能够在关闭所有优化的情况下进行编译?

2 个答案:

答案 0 :(得分:3)

我认为您似乎认为的大多数优化实际上是由JLS强制执行的,因为它们是constant expressions。因此,请确保您没有常量表达式,并且javac无法将它们优化掉。

在您的示例中,您可以这样写:

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

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

答案 1 :(得分:1)

许多生产编译器,包括常见的Sun派生javac,无论设置什么优化,都会进行这种简化。

您是否查看了Jasmin,Java字节码'汇编程序'?