Pourquoi est-llvm considérés comme impropres à la mise en œuvre d'un JIT?
De nombreux langages dynamiques en œuvre (ou si vous voulez mettre en œuvre) un Compilateur JIT afin d'accélérer leurs délais d'exécution. Inévitablement, quelqu'un de la galerie d'arachide demande pourquoi ils n'utilisent pas de LLVM. La réponse est souvent, "LLVM est impropre à la construction d'une ÉQUIPE." (Par Exemple, Armin Rigo commentaire ici.)
Pourquoi est-LLVM Impropres à la construction d'un JIT?
Note: je sais LLVM a sa propre ÉQUIPE. Si LLVM utilisé pour être impropre, mais il est maintenant adapté, merci de dire ce qui a changé. Je ne parle pas de l'exécution du Bytecode LLVM sur la LLVM JIT, je suis en train de parler à l'aide de la LLVM bibliothèques pour mettre en oeuvre JIT pour un langage dynamique.
- Hmm... stackoverflow.com/questions/4077396/llvm-jit-speed-up-choices/... dit que la réponse est "parce que c'est trop lent".
- -1 LLVM n'est pas considéré comme impropre à la mise en œuvre d'un JIT.
- Bien Jon, j'ai plusieurs bonnes réponses ci-dessous. Peut-être que vous pouvez en écrire un sur votre I-mise en œuvre-un-JIT-avec-LLVM-et-il-était-une expérience extraordinaire?
- Pour mon prochain tour, je vais vous dire le Chef de Fer comment faire des gaufres. (sent soi-même.)
- S'ok. A de pire sur cette autre question, où j'ai obtenu 4 downvotes en dépit d'être le seul répondeur pour avoir écrit plusieurs à faible latence pour les applications commerciales dans les langages fonctionnels! stackoverflow.com/a/4479114/13924
Vous devez vous connecter pour publier un commentaire.
Il y a quelques remarques à propos de LLVM dans le Vide Avaler post-mortem post de blog:
http://qinsb.blogspot.com/2011/03/unladen-swallow-retrospective.html .
J'ai écrit HLVM, un haut niveau de la machine virtuelle avec un riche système de type statique, y compris les types de valeur, la queue d'appel d'élimination, d'impression générique, FFI C et POSIX threads avec le soutien de la statique et de la compilation JIT. En particulier, HLVM offre une performance incroyable pour un haut niveau de la VM. J'ai même mis en place un ML-like interactive frontale avec les types de variantes et de filtrage en utilisant le compilateur JIT, comme on le voit dans cette ordinateur algèbre de démonstration. Tous mes HLVM liées au travail, combinés totaux seulement quelques semaines de travail (et je ne suis pas informaticien, juste amateur).
Je pense que les résultats parlent d'eux-mêmes et démontrent sans équivoque que LLVM est parfaitement adapté pour la compilation JIT.
mem2reg
optimisation passe réellement transforme code impératif sur les types de valeur (ints, des flotteurs, etc.) à partir de la mémoire des opérations purement fonctionnelle unique-statique-code d'affectation (le genre HLVM génère naturellement). Typage dynamique est plus difficile parce qu'il fait il est impossible d'atteindre, de manière prévisible,-de bonnes performances, mais quelques solutions simples devraient être efficaces, comme la représentation de toutes les valeurs "unboxed" les syndicats ou la compilation des fonctions pour toutes les combinaisons possibles de types d'arguments sur la demande.Il y a un présentation sur l'utilisation de LLVM comme un JIT backened où l'adresse de la plupart des préoccupations soulevées pourquoi ses mauvais, la plupart de ses semble se résumer à des gens qui construisent une statique compilateur JIT au lieu de construire une véritable ÉQUIPE.
Mise à jour: comme de 7/2014, LLVM a ajouté une fonctionnalité appelée "Patch Points", qui sont utilisés pour soutenir les Polymorphes Inline Caches dans Safari FTL JavaScript JIT. Ce couvre exactement le cas d'utilisation est plaint de l'int Armin Rigo commentaire dans la question d'origine.
Il prend du temps à démarrer est la plus grande plainte - cependant, ce n'est pas un problème en soi si vous n'avez que Java et le démarrage en mode d'interprétation, et l'utilisation de LLVM pour compiler le plus utilisé parties du programme.
Aussi bien qu'il existe des arguments comme cela dispersés partout sur l'internet, Mono a été en utilisant LLVM comme un compilateur JIT avec succès pendant un certain temps maintenant (mais il est intéressant de noter que la valeur par défaut est leur propre plus rapide mais moins efficace backend, et ils ont aussi des parties modifiées de LLVM).
Pour les langages dynamiques, LLVM peut-être pas le bon outil, juste parce qu'il a été conçu pour optimiser le système des langages de programmation comme le C et le C++ qui sont fortement/statiquement typés et le très faible niveau des fonctionnalités. En général, les optimisations effectuées sur C n'ont pas vraiment dynamique des langues rapide, parce que vous êtes tout simplement la création d'un moyen efficace de l'exécution d'un système lent. Dynamique moderne de la langue Ece faire des choses comme inline fonctions qui ne sont connus qu'au moment de l'exécution, ou de l'optimisation en fonction du type d'une variable a, la plupart du temps, ce qui LLVM n'est pas conçu pour.
IO()
? Dans le langage de base? (Le dangereux le cadre prévu pour la liaison C les fonctions doivent être capables de faire ce genre de chose, mais c'est une interopérabilité extension et je ne voudrais pas compter que comme Haskell).uint32_t = -1; char y = t;
va compiler en C, où, comme en Python ou en Haskellx = 0, y = '1', x + y
provoquera une erreur. La logique du sens.0.0 + 0
serait de travailler en python et en C (et haskell w/ unsafeCoerce) les frontières sont de moins en moins claires que vous assumez. Vous prétendez que Python est fortement typé, mais il a le même problème. Le problème n'est pas la conversion implicite, c'est la coercition implicite, qui n'existe pas en C, et je ne vois pas votre argument. Une telle classification est inutile et dépend de vos propres définitions de "fort".Pour plus de détail diatribe sur l'IR LLVM voir ici: IR LLVM est un compilateur IR.