Итак, на днях, когда я смотрел страницу wikipedia для байт-кода 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-коде, но, похоже, он возвращается обратно в ваш код при компиляции.