Zephyr (./23) :
Avant de lire ce topic, je pensais que le JIT consistait "simplement" en une compilation des blocs de codes les plus fréquemment exécutés. Même si ça me semble a priori logique qu'on dispose au runtime de plus d'informations qu'en temps de compilation, vous êtes sûr que certaines sont utilisées, et savez lesquelles ? Parceque moi non plus, l'exemple de Flanker ne me semble pas crédible (j'ai du mal à croire qu'on puisse envisager une compilation en plein milieu de l'exécution d'un programme, sauf peut-être si on s'apprête à lancer une boucle vraiment monstrueusement grosse ?)
En fait ce n'est même pas par blocs, c'est une granularité moins fine, du genre par classe ou par méthode (enfin dans les VM objet courantes).
Et heu en effet, je ne connais pas de VM objet qui recompile aussi finement que le décrit flanker. D'autant que compiler une version ou les trois ne coûte pas beaucoup plus cher et un test à l'exécution sur un registre ça ne coûte plus rien sur les procs modernes...
D'ailleurs, la plupart des optims dont on a parlé dans ce topic existent déja dans les compilos. Les compilos C++ corrects font de la monomorphisation (une version pour les int une pour les pointeurs et une pour les flottants pour faire simple), donc il n'y a plus le coût du polymorphisme, mais ça coûte en espace disque/ram du binaire et ça multiplie le temps de compilation (ou en recherche des trucs comme MLton le font carrément au link pour tout le programme, c'est très long mais produit du code très efficace). La plupart des compilos et JIT évitent de trop monomorphiser pour rester raisonnable en espace et temps de compilation.
D'autre part, un JIT ça se base quand même sur une VM, avec un jeu d'instructions spécifiquement adapté à un type d'exécution, et donc beaucoup d'optims ne sont pas possibles à cause de ce langage intermédiaire parfois trop restrictif pour produire du code efficace pour certains styles de programmation (pas de récursion terminale facile en Java, pas d'exceptions rapides, politique de boxing (encapsulation des valeurs immédiates dans des wrappers objets), etc.).
En bref, les JIT c'est bien mais c'est pas le rêve et ça ne permet pas de faire beaucoup mieux qu'un compilo classique (dans certains cas oui, dans d'autres c'est l'inverse).