質問: 4; System.out.println(a); } } 上のプログラムをコンパイルして生成されたclassファイルを逆アセンブルします。 Compiled from "Test.java" public class Test extends java.lang.Object{ public Test(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()V 4: return public static void main(java.lang.String[]); Code: 0: iconst_0 1: istore_1 2: iconst_3 3: istore_1 4: iconst_4 5: istore_1 6: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 9: iload_1 10: invokevirtual #3; //Method java/io/PrintStream.println:(I)V 13: return } すると、上のような結果になります。 変数aに対して0,3,4を順番に代入していますので、istore_1が3回出てきますが、そのうち最後のistore_1以外は明らかに無駄な処理です。 0と3の代入については、その値を使うことが無いので、最適化によって処理自体が取り除かれても良さそうな気がするのですが... このような明らかに無駄と思える処理について、javacが最適化を行わない理由をご存知でしたら、教えてください。
回答: 最近のjavacは最適化しません。 java2で既にしていなかったように思うのですが、ここの記憶ははっきりしません。 最適化はJITなどの実行環境がそのプラットフォームにあわせて行うべきという思想からです。