今日、私は入門プログラミング コースを教えていて、Java での変数の割り当てを含むいくつかの簡単なコードについて説明していました。コードのポイントは、何か特別なことを見せびらかすことではなく、学生が変数代入ステートメントを確実に理解できるようにすることでした。
ボード上に次のメソッドがあり、一度に 1 行ずつトレースしていました。
private void simpleMethod() {
int myInt = 137;
myInt = 42;
myInt = myInt + 1;
/* ... code using myInt ... */
}
学生からmyInt
、プログラムの実行時に値 137 と 42 が実際に保持されるのか、それとも 43 を保持するようにジャンプするのかと尋ねられました。私は学生に、コードは各行を順番に実行するので、変数は実際に保持されると言いました。これらの中間値。
正直なところ、バイトコードが何を出力するかはわかりませんでしたjavac
(JVM による最適化を完全に無視していました)。(または任意の Java コンパイラ)は、ばかげた割り当てステートメントを最適化し、代わりに 43javac
に直接初期化することを法的に許可されていますか?myInt
によるとjavap
、私のシステムでは、上記のコードでコンパイルするとjavac
生成されます
0: sipush 137
3: istore_1
4: bipush 42
6: istore_1
7: iload_1
8: iconst_1
9: iadd
10: istore_1
11: return
したがって、ここでは最適化は行われません。ただし、私の質問は、これを最適化することが合法かどうかであり、これは何も解決しません。