170 votes

Le code Java 8 peut-il être compilé pour s'exécuter sur Java 7 jvm?

Java 8 introduit de nouvelles fonctionnalités importantes telles que les expressions lambda.

Ces changements de langage sont-ils accompagnés de changements aussi importants dans le bytecode compilé qui empêcheraient son exécution sur une machine virtuelle Java 7 sans utiliser de retrotranslator?

152voto

JesperE Points 34356

Non, à l’aide de 1,8 fonctionnalités dans votre code source vous oblige à cibler une VM 1,8. J’ai juste essayé la nouvelle version de Java 8 et essayé de compiler avec `` et le compilateur refuse :

61voto

Esko Luontola Points 53877

Par défaut méthodes nécessitent de tels changements sur le bytecode et la JVM qu'ils auraient été impossible à faire sur l'île de Java 7. Le vérificateur de bytecode de Java 7 et au-dessous de rejeter les interfaces avec le corps de méthode (sauf pour l'initialiseur statique de la méthode). En essayant d'imiter méthodes par défaut avec des méthodes statiques de l'appelant n'allait pas produire les mêmes résultats, parce que les méthodes par défaut peut être remplacée dans les sous-classes.

Lambda peut s'exécuter sur Java 7, si les classes de l'API juste existerait-il. Le invokedynamic instruction existe sur Java 7, mais il aurait été possible de mettre en œuvre des lambdas de sorte qu'il génère le lambda classes au moment de la compilation (début du JDK 8 reprend l'a fait ainsi) et dans ce cas serait de travailler sur n'importe quel version de Java.

Répéter les Annotations est juste sucre syntaxique. Ils sont bytecode compatible avec les versions précédentes.

IIRC, les Annotations de Type n'existent qu'au moment de la compilation, de sorte qu'ils ne devraient pas nécessiter de bytecode changements.

Méthode noms des paramètres peuvent exister dans le bytecode Java 7, donc, qui est également compatible. Avec Java 7, ils n'existent pas dans les interfaces, mais je ne suis pas sûr qu'ils existent, avec Java 8. Je ferais mieux d'aller vérifier cela - j'ai un cas d'utilisation qui en bénéficieraient.

Les autres nouveautés sont pour la plupart de nouvelles Api, des améliorations pour HotSpot et de l'outillage.

33voto

Edwin Dalorzo Points 19899

Autant que je sache, aucun de ces changements dans le JDK 8, l'ajout de nouvelles bytecode. Une partie de la lambda instrumentation est fait à l'aide de invokeDynamic (qui existe déjà dans le JDK 7). Ainsi, à partir de la JVM du jeu d'instructions de point de vue, rien ne doit faire la base de code incompatible. Il ya, cependant, beaucoup de API associées et des améliorations du compilateur, cela pourrait rendre le code de JDK 8 difficile à compiler/exécuter en vertu de la précédente Jdk (mais je n'ai pas essayé).

Peut-être que les documents de référence suivants peuvent aider en quelque sorte à enrichir la compréhension de la façon dont les changements liés à la lambda sont en préparation.

Elles expliquent dans le détail comment les choses sont instrumentés sous le capot. Peut-être que vous trouverez la réponse à vos questions.

11voto

Stefan Zobel Points 21

Si vous êtes prêt à utiliser un « retrotranslator » essayez excellent Retrolambda de Esko Luontola : https://github.com/orfjackal/retrolambda

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X