JIT est l'abréviation de compilateur juste à temps, et son nom est misson: pendant l'exécution, il détermine les optimisations de code intéressantes et les applique. Il ne remplace pas les compilateurs habituels mais fait partie des interprètes. Notez que les langages comme Java qui utilisent du code intermédiaire ont les deux : un compilateur normal pour la traduction du code source vers le code intermédiaire, et un JIT inclus dans l'interpréteur pour augmenter les performances.
Les optimisations de code peuvent certainement être effectuées par des compilateurs "classiques", mais notez la principale différence: les compilateurs JIT ont accès aux données lors de l'exécution. C'est un énorme avantage; l'exploiter correctement peut être difficile, évidemment.
Considérez, par exemple, un code comme celui-ci:
m(a : String, b : String, k : Int) {
val c : Int;
switch (k) {
case 0 : { c = 7; break; }
...
case 17 : { c = complicatedMethod(k, a+b); break; }
}
return a.length + b.length - c + 2*k;
}
Un compilateur normal ne peut pas en faire trop. Un compilateur JIT, cependant, peut détecter que l' m
on n'appelle jamais avec k==0
pour une raison quelconque (des choses comme cela peuvent se produire lorsque le code change avec le temps); il peut ensuite créer une version plus petite du code (et le compiler en code natif, bien que je considère cela comme un point mineur, conceptuellement):
m(a : String, b : String) {
return a.length + b.length - 7;
}
À ce stade, il va probablement même incorporer l'appel de méthode car il est trivial maintenant.
Apparemment, le Soleil a rejeté la plupart des optimisations javac
utilisées dans Java 6; On m'a dit que ces optimisations ont rendu difficile pour JIT de faire beaucoup, et le code compilé naïvement a finalement fonctionné plus rapidement. Allez comprendre.