我正在编写自己的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编译器能够在关闭所有优化的情况下进行编译?
答案 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字节码'汇编程序'?