私は自分のJVMのコピーを作成していますが、追加、減算、数値のオーバーフローなどの単純な数値演算でその動作をテストしたいと思います。バイトコードを手作業で書くのではなく、単純なJavaコードを書くだけの良いアイデアは、javac
をコンパイルしてバイトコードにしてから、そのバイトコードでJVMをテストしてください。javacで最適化を無効にしますか?
問題は、javac
が、私がテストしたいものをコードからテストするのを妨げる多くの(非常に賢明な!)インライン最適化を行っていることです。たとえば、1つのテストでは、積分オーバーフローがすべてのタイプに対して正しく処理されているかどうかを検証しようとします。
byte min = (byte)-128;
byte max = (byte) 127;
assertTrue((byte)(max + 1) == min); // Should overflow and work correctly.
生成.class
ファイルが完全にテストのポイントを敗北(byte) -128
、としてハード((byte)max + 1)
の結果があります。ここでは1つのスナップショットです。
質問:javac
で最適化を無効にする方法はありますか?私はこれを行うためのコマンドラインスイッチを見つけることができませんでしたが、おそらく私はちょうど十分に見苦しくはありませんでした。これを行う方法がない場合は、すべての最適化をオフにしてコンパイルできる別のJavaコンパイラがありますか?
:あなたの例では
、あなたはこのようにそれを書くこと!それはかなりクールなリンクです。私はこれを調べなければならないかもしれない。 – templatetypedef