先日、ウィキペディアの Java バイトコードのページを見ていたら、次の例に出くわしました。
次の Java コードを検討してください。
outer:
for (int i = 2; i < 1000; i++) {
for (int j = 2; j < i; j++) {
if (i % j == 0)
continue outer;
}
System.out.println (i);
}
Java コンパイラは、上記の Java コードを次のようにバイト コードに変換する可能性があります。
0: iconst_2
1: istore_1
2: iload_1
3: sipush 1000
6: if_icmpge 44
9: iconst_2
10: istore_2
11: iload_2
12: iload_1
13: if_icmpge 31
16: iload_1
17: iload_2
18: irem
19: ifne 25
22: goto 38
25: iinc 2, 1
28: goto 11
31: getstatic #84; //Field java/lang/System.out:Ljava/io/PrintStream;
34: iload_1
35: invokevirtual #85; //Method java/io/PrintStream.println:(I)V
38: iinc 1, 1
41: goto 2
44: return
そして、小さな単語 goto が数回表示されていることに気付きました。これは、JVM仕様を確認すると有効です。 私の質問はなぜですか? GOTO は予約済みですが、Java では使用できないキーワードです。そのため、Java コードを記述してコンパイルすると、goto を使用してコンパイルされたように見えるのはなぜですか。これは、より低いレベルのプログラミングで常に行われてきた方法なのか、それとも JVM が goto ワードをより効果的に使用できると信頼されているためなのか、疑問に思っています。最終的には、goto が Java コードで禁止されているほど悪い慣行と見なされているのに、コンパイル時にコードに直接戻されるように見える理由について興味があります。