Question

je déconne avec un interprète de jouets en Java et j'envisageais d'essayer d'écrire un compilateur simple capable de générer du bytecode pour la machine virtuelle Java.Ce qui m'a fait réfléchir : quel degré d'optimisation doit être effectué par les compilateurs qui ciblent les machines virtuelles telles que JVM et CLI ?

Les compilateurs Just In Time (JIT) effectuent-ils un pliage constant, des optimisations de judas, etc. ?

Était-ce utile?

La solution

Je vais juste ajouter deux liens qui expliquent Le bytecode de Java plutôt bien et certains des diverses optimisations de la JVM pendant l'exécution.

Autres conseils

L'optimisation du bytecode est probablement un oxymore dans la plupart des cas

Je ne pense pas que ce soit vrai.Les optimisations telles que le levage des invariants de boucle et la propagation des constantes ne peuvent jamais faire de mal, même si la JVM est suffisamment intelligente pour les réaliser seule, du simple fait de faire en sorte que le code fasse moins de travail.

L'optimisation est ce qui rend les JVM viables en tant qu'environnements pour les applications de longue durée. Vous pouvez être sûr que SUN, IBM et leurs amis font de leur mieux pour garantir qu'ils peuvent optimiser votre bytecode et votre code compilé JIT de la manière la plus efficace possible.

Cela étant dit, si vous pensez pouvoir pré-optimiser votre bytecode, cela ne fera probablement pas beaucoup de mal.

Il convient toutefois d'être conscient que les JVM peuvent avoir tendance à être plus performantes (et à ne pas planter) lorsqu'elles sont présentées avec le type de bytecode que le compilateur Java a tendance à construire.Il n'est pas rare que des optimisations soient manquées ou même que la JVM plante lorsque des permutations de bytecode se produisent, qui sont correctes mais contrairement à ce qui serait produit par javac.Espérons que ce genre de chose appartient désormais au passé, mais il faut peut-être en être conscient.

Les obfuscateurs tels que ProGuard effectueront pour vous de nombreuses optimisations statiques sur votre bytecode.

Le compilateur HotSpot optimisera mieux votre code au moment de l'exécution qu'il n'est possible au moment de la compilation - il dispose de plus d'informations avec lesquelles travailler, après tout.La seule fois où vous devriez optimiser le bytecode au lieu de simplement votre algorithme, c'est lorsque vous ciblez des appareils mobiles, tels que le Blackberry, où la JVM de cette plate-forme n'est pas assez puissante pour optimiser le code au moment de l'exécution et exécute simplement le bytecode.

L'optimisation du bytecode est probablement un oxymore dans la plupart des cas.À moins que vous ne contrôliez la machine virtuelle, vous n'avez aucune idée de ce qu'elle fait pour accélérer l'exécution du code, le cas échéant.Le compilateur aurait besoin de connaître les détails de la VM afin de générer du code optimisé.

Note aux Aséraphins :

Il peut également être utile pour optimiser le bytecode pour les applications non embarquées dans certains cas limités :

  1. Lors de la livraison de code par câble, par exemple pour les applications WebStart, afin de minimiser la taille du livrable/du cache et parce que vous ne connaissez pas nécessairement la capacité/la vitesse du client.

  2. Pour le code dont vous savez qu'il est critique en termes de performances et utilisé au démarrage avant (disons) que HotSpot ait eu le temps de collecter des statistiques.

Encore une fois, les transformations effectuées par un bon optimiseur/obfuscateur peuvent être très utiles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top