J'ai lu sur les interprètes méta-circulaires sur le web (y compris SICP) et j'ai examiné le code de certaines implémentations (comme PyPy et Narcissus).
J'ai lu pas mal de choses sur deux langues qui ont fait grand usage de l'évaluation métacirculaire, Lisp et Smalltalk. Pour autant que je sache, Lisp était le premier compilateur auto-hébergé et Smalltalk avait la première "vraie" implémentation JIT.
Une chose que je n'ai pas bien comprise est comment ces interprètes / compilateurs peuvent-ils atteindre de si bonnes performances ou, en d'autres termes, pourquoi PyPy est-il plus rapide que CPython? Est-ce à cause de la réflexion?
Et aussi, mes recherches Smalltalk m'ont amené à croire qu'il existe une relation entre JIT, machines virtuelles et réflexion. Les machines virtuelles telles que la JVM et le CLR permettent une grande introspection de type et je crois qu'elles en font un grand usage dans la compilation Just-in-Time (et AOT, je suppose?). Mais pour autant que je sache, les machines virtuelles sont un peu comme des CPU, en ce sens qu'elles ont un jeu d'instructions de base. Les machines virtuelles sont-elles efficaces car elles incluent des informations de type et de référence, ce qui permettrait une réflexion indépendante du langage?
Je pose cette question car de nombreux langages interprétés et compilés utilisent désormais le bytecode comme cible (LLVM, Parrot, YARV, CPython) et les machines virtuelles traditionnelles comme JVM et CLR ont gagné en performances incroyables. On m'a dit qu'il s'agissait de JIT, mais pour autant que je sache, JIT n'a rien de nouveau depuis que Smalltalk et le propre Self de Sun l'ont fait avant Java. Je ne me souviens pas que les machines virtuelles aient particulièrement bien performé dans le passé, il n'y en avait pas beaucoup en dehors de JVM et .NET et leurs performances n'étaient certainement pas aussi bonnes qu'aujourd'hui (j'aurais aimé pouvoir trouver cette affirmation mais je parler d'expérience personnelle).
Puis tout d'un coup, à la fin des années 2000, quelque chose a changé et de nombreuses machines virtuelles ont commencé à apparaître, même pour les langues établies, et avec de très bonnes performances. A-t-on découvert quelque chose sur l'implémentation JIT qui a permis à presque toutes les machines virtuelles modernes de monter en flèche en termes de performances? Un papier ou un livre peut-être?