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.

questionAnswers(9)

yourAnswerToTheQuestion