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.