goto en Java bytecode

<!-Donc l'autre jour quand je regardais la page wikipedia pour Java bytecode je suis tombé sur cet exemple:

Examiner le code Java suivant:

  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);
  }

un compilateur Java peut traduire le code Java CI-DESSUS en code octet comme suit, en supposant que ce qui précède a été mis dans une méthode:

  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

et je remarque que le petit mot goto apparaît quelques fois, ce qui après avoir vérifié le JVM spécification valide. Ma question est pourquoi? GOTO est un mot-clé réservé mais inutilisable en Java, alors pourquoi quand nous écrivons et compilons du code java semble-t-il être compilé avec goto de nouveau dedans. Je me demande si c'est juste la façon dont les choses ont toujours été faites à un niveau inférieur de programmation, ou si c'est parce que L'on fait confiance à la JVM pour utiliser le mot goto plus efficacement. En fin de compte, je suis curieux de savoir pourquoi goto est considéré comme une si mauvaise pratique qu'il est interdit dans le code java, pourtant semble être remis directement dans votre code une fois compilé.

18
demandé sur ArtB 2013-11-15 12:53:20

9 réponses

Java programmation structurée des fonctionnalités telles que les boucles (for/while) sont implémentés au niveau du bytecode avec branche conditionnelle (