Pourquoi llvm est-il considéré comme inapproprié pour mettre en œuvre un JIT?

De nombreux langages dynamics implémentent (ou souhaitent implémenter) un compilateur JIT pour accélérer leurs temps d’exécution. Inévitablement, quelqu’un de la galerie de l’arachide demande pourquoi il n’utilise pas LLVM. La réponse est souvent: “LLVM ne convient pas à la construction d’un JIT”. (Par exemple, le commentaire d’Armin Rigo ici. )

Pourquoi LLVM est-il inapproprié pour construire un JIT?

Note: Je sais que LLVM a son propre JIT. Si LLVM était autrefois inadapté, mais convient maintenant, veuillez indiquer ce qui a changé. Je ne parle pas de l’exécution de LLVM Bytecode sur le JIT LLVM, je parle de l’utilisation des bibliothèques LLVM pour implémenter un JIT pour un langage dynamic.

Il y a quelques notes sur LLVM dans le post du blog post-mortem Unladen Swallow: http://qinsb.blogspot.com/2011/03/unladen-swallow-retrospective.html .

Malheureusement, LLVM dans son état actuel est vraiment conçu comme un optimiseur de compilateur statique et un back-end. La génération et l’optimisation du code LLVM sont bonnes mais coûteuses. Les optimisations sont toutes conçues pour fonctionner sur des IR générés par des langages statiques de type C. La plupart des optimisations importantes pour l’optimisation de Python nécessitent une connaissance approfondie de l’exécution du programme sur les itérations précédentes, et LLVM ne nous a pas aidés à le faire.

Pourquoi LLVM est-il inapproprié pour construire un JIT?

J’ai écrit HLVM , une machine virtuelle de haut niveau avec un système de type statique riche comprenant les types de valeur, l’élimination des appels de queue, l’impression générique, les threads C FFI et POSIX avec prise en charge de la compilation statique et JIT. En particulier, HLVM offre des performances incroyables pour une machine virtuelle de haut niveau. J’ai même implémenté un front-end interactif de type ML avec des types de variantes et des correspondances de motifs en utilisant le compilateur JIT, comme dans cette démonstration de calcul formel . Tous mes travaux liés à HLVM combinent à peine quelques semaines de travail (et je ne suis pas informaticien, juste un passionné).

Je pense que les résultats parlent d’eux-mêmes et démontrent sans équivoque que LLVM convient parfaitement à la compilation JIT.

Il y a une présentation sur l’utilisation de LLVM en tant que JIT où les problèmes soulevés par la plupart des problèmes semblent se résumer à la création d’un compilateur statique en tant que JIT au lieu de créer un JIT réel.

Mise à jour: à compter de 7/2014, LLVM a ajouté une fonctionnalité appelée “Points de correction”, utilisée pour prendre en charge les caches en ligne polymorphes dans FTL JavaScript JIT de Safari. Cela couvre exactement le cas d’utilisation reproché au commentaire d’Armin Rigo dans la question initiale.

La plus grande plainte prend beaucoup de temps à démarrer, mais ce n’est pas vraiment un problème si vous faites ce que fait Java et si vous démarrez en mode interprète, et utilisez LLVM pour comstackr les parties les plus utilisées du programme.

Même si des arguments comme celui-ci sont disséminés sur Internet, Mono utilise le compilateur JIT avec succès depuis un certain temps (bien qu’il soit intéressant de noter qu’il utilise par défaut son propre moteur plus rapide mais moins efficace, et a également modifié certaines parties de LLVM).

Pour les langages dynamics, LLVM n’est peut-être pas le bon outil, simplement parce qu’il a été conçu pour optimiser les langages de programmation système tels que C et C ++ qui sont fortement typés statiquement et prennent en charge des fonctionnalités de très bas niveau. En général, les optimisations effectuées sur C ne rendent pas vraiment les langages dynamics rapides, car vous ne faites que créer un moyen efficace d’exécuter un système lent. Les JIT de langage dynamic modernes font des choses comme l’inclusion de fonctions connues uniquement lors de l’exécution ou l’optimisation en fonction du type de la plupart des variables pour lesquelles LLVM n’est pas conçu.

Pour plus de détails sur le LLVM IR, voir ici: LLVM IR est un compilateur IR .