goto no bytecode de Java
Então, no outro dia, quando eu estava olhando a página da Wikipedia para o bytecode de Java, me deparei com este exemplo:
Considere o seguinte código 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);
}
Um compilador Java pode traduzir o código Java acima em código de bytes da seguinte forma, assumindo que o acima foi colocado em um método:
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
E eu noto que a pequena palavra goto aparece algumas vezes, que ao verificarJVM especificação é válida.Minha pergunta é por que? GOTO é uma palavra-chave reservada mas inutilizável em Java, então por que quando escrevemos e compilamos código java ele parece ser compilado com goto de volta para ele. Eu estou querendo saber isso é apenas a maneira como as coisas sempre foram feitas em um nível mais baixo de programação, ou se é porque a JVM é confiável para usar a palavra goto de forma mais eficaz. Por fim, estou curioso para saber por que goto é considerada uma prática tão ruim que é proibida no código java, mas parece ser colocada de volta no seu código quando compilada.