De quelle (s) manière (s) le LLVM est-il de bas niveau?

12

De quelle (s) manière (s) le LLVM (Low Level Virtual Machine) est-il de bas niveau? (Au moment d'écrire ces lignes, je n'ai pas trouvé cette extension de l'abréviation "LLVM" sur son site Web, mais sur Wikipedia .)

Est-il appelé "Low Level" dans quoi est-il conçu (une infrastructure de compilation) ou parce qu'il fonctionne à un "niveau inférieur" que d'autres outils?

À titre (d'illustration) de ceci, la LLVM est-elle de niveau inférieur à la JVM et au CLR , ou est-elle uniquement conçue pour des utilisations de "niveau inférieur"?

Abbafei
la source

Réponses:

16

LLVM est de niveau inférieur à celui des machines virtuelles classiques telles que JVM et CLR. Par exemple, bien qu'il possède des crochets pour un garbage collector, il ne fournit pas lui-même un garbage collector.

De même, la JVM a un compilateur JIT intégré (sauf dans les versions vraiment anciennes). LLVM a quelques compilateurs JIT pour LLVM IR, mais c'est toujours au développeur de relier les choses et de JIT le code.

Lorsque la JVM rencontre un externe non résolu, elle s'éteint et trouve la bonne classe pour le satisfaire, et sait comment rechercher les fichiers .class directement dans le système de fichiers et dans les fichiers .jar 1 . Les compilateurs JIT de LLVM ont des crochets où vous pouvez décider comment des choses comme ça sont gérées. Comme vous vous en doutez, certaines personnes ont écrit des versions par défaut, donc elle peut faire les choses à peu près dans le même ordre que la JVM - mais vous êtes également libre de les ignorer et de faire les choses différemment si vous le souhaitez.

Autrement dit, si vous développez un compilateur (ou quelque chose dans cet ordre), il dispose de nombreux outils pour vous faciliter la vie. Au lieu de vous soucier de l'optimisation, vous pouvez faire à peu près la traduction la plus simple que vous pouvez gérer de votre code source vers LLVM IR, puis utiliser les bibliothèques LLVM pour gérer l'optimisation, le JIT, la liaison, etc. Néanmoins, ce sont des bibliothèques - il fournit certaines fonctions vraiment utiles pour que vous n'ayez pas à traiter tous les détails, mais ce sont toujours des fonctions et vous écrivez toujours du code pour les invoquer. Ce n'est pas un produit fini, juste des outils utiles pour construire des produits relativement rapidement et facilement.


1 Techniquement, tout cela n'est pas intégré à la JVM proprement dite. Il spécifie ce qui est généralement appelé le chargeur de classe primordial dans le cadre de la JVM proprement dite, puis il existe des chargeurs de classe utilisateur spécifiés dans java.util.ClassLoader qui gèrent d'autres choses. Certains chargeurs de classe sont inclus par défaut, et si vous le souhaitez assez, vous pouvez les compléter en définissant le vôtre.

Jerry Coffin
la source
12

Il est de bas niveau car il est conçu pour que les machines virtuelles existantes ou futures (la JVM) puissent l'utiliser comme cœur de leur implémentation.

Voyez les choses de cette façon: les machines virtuelles de Java et Python sont très portables car elles sont écrites en C standard et dépendent beaucoup de leurs propres bibliothèques. L'intention du LLVM est de fournir une infrastructure afin qu'il soit facile de porter n'importe quelle machine virtuelle sur une plate-forme qui prend déjà en charge le LLVM.

LLVM offre un support pour la compilation statique et JIT, et est conçu de manière à pouvoir s'exécuter dans un espace de système d'exploitation approuvé. Cela signifie que, en théorie, exécuter une machine virtuelle sur LLVM devrait signifier beaucoup moins de travail et produire quelque chose de beaucoup plus rapide et efficace. En théorie.

Ensuite, LLVM, étant de niveau inférieur, devrait être plus facile à porter vers différentes OS et architectures matérielles.

Il y a de grandes économies à réaliser si les implémenteurs de langage pouvaient écrire sur une seule plate-forme de bas niveau facile à porter. Les VM les plus connues sont à mi-chemin entre la langue qu'elles servent et le système d'exploitation, et elles doivent implémenter leurs propres représentations intermédiaires, et JITC.

Apalala
la source
5

La partie "bas niveau" du nom LLVM fait référence au niveau du jeu d'instructions virtuel utilisé. Le langage intermédiaire (IR) que LLVM utilise est proche du niveau du code machine bien qu'il soit indépendant de l'architecture et général.

Le bytecode de la JVM et du CLR, d'autre part, est d'un niveau assez élevé en ce qu'il contient des instructions qui se trouvent sur une couche d'abstraction plus élevée. Ce sont deux langages d'assemblage orientés objet basés sur la pile. Par exemple, la JVM a l'instruction invokevirtual, qui est une instruction qui doit connaître le modèle d'objet spécifique du langage Java.

Zayenz
la source
3

Il est certainement de niveau inférieur à celui de toutes les machines virtuelles spécifiques à la langue et des machines virtuelles unifiées comme JVM et CLR. Sa conception est proche de la représentation intermédiaire de bas niveau dans GCC (GIMPLE) et les compilateurs similaires. Il n'y a pas de GC par défaut, aucun système de type de haut niveau spécifique n'est appliqué, aucun alignement n'est supposé (il doit être spécifié explicitement), les types de données entiers et à virgule flottante sont explicites (et dépendent de la plate-forme), et le niveau le plus bas de tous - un arithmétique de pointeur décent est disponible.

SK-logic
la source