LLVM
LLVM (anciennement appelé Low Level Virtual Machine en français : « machine virtuelle de bas niveau ») est une infrastructure de compilateur conçue pour l'optimisation du code à la compilation, à l'édition de liens, voire à l'exécution ou durant les « temps morts » d'un programme, quel que soit le langage d'origine.
Développé par | LLVM Developer Group, Université de l'Illinois, Apple, Google |
---|---|
Première version | [1] |
Dernière version | 14.0.6 ()[2] |
Version avancée |
13.0.1-rc1 ()[3] 13.0.1-rc2 ()[4] 13.0.1-rc3 ()[5] |
Dépôt | github.com/llvm/llvm-project |
Écrit en | C++, C et assembleur |
Système d'exploitation | Multiplateforme |
Langues | Anglais |
Type | Compilateur |
Licence | Licence Open Source NCSA/Université de l'Illinois et licence Apache version 2.0 |
Site web | llvm.org |
Caractéristiques
LLVM permet de créer une machine virtuelle pour des langages similaires à Java et sa JVM, un générateur de code pour une architecture matérielle spécifique, et des optimiseurs de compilation indépendants de toute plate-forme et de tout langage. LLVM est indépendante des langages et des architectures : elle se charge de faire le lien vers un module spécifique au langage, et vers un générateur de code pour une machine particulière. Elle prend en charge les optimisations inter-procédurales (IPO) de haut niveau, propose des compilateurs statiques ou à la volée (JIT) et de nombreux composants dans différentes phases de développement (par exemple, du bytecode Java et des interfaces CIL de Microsoft .NET, une interface Python, une allocation de registres par coloration de graphe, etc). Le compilateur à la volée est capable d'optimiser des branches statiques inutiles pendant l'exécution d'un programme, et est par conséquent très pratique dans des cas où le programme a plusieurs options : la plupart pouvant être facilement diagnostiquées comme inutiles quel que soit l'environnement. C'est pour cette raison que, par exemple, cette infrastructure est utilisée dans le pipeline de certaines implémentations d'OpenGL et notamment sous Linux ou BSD, avec LLVMpipe au sein du module Gallium3D de Mesa 3D, ainsi que dans Mac OS X 10.5 (Leopard) pour fournir une prise en charge pour le matériel manquant.
Compilation
Jusqu'à la version 2.9, LLVM offrait une compilation C/C++ et ObjectiveC via LLVM-GCC. Depuis, DragonEgg remplace LLVM-GCC [6] pour proposer, via un greffon gcc, une compilation complète des langages Ada, C, C++, Fortran et partiellement de Go, Java, Objective-C et Objective-C++. Surtout, LLVM propose un compilateur C, C++, Objective-C et Objective-C++ intitulé Clang. Dans sa version 3.0, la prise en charge des langages C et C++ est quasiment totale, seules quelques extensions GCC n'étant pas encore prises en charge. Ainsi, sur presque 33 000 paquets que comprend l'archive Debian, 4 % d'entre eux ne compilent pas avec Clang[7].
Pipeline
LLVM a un pipeline très simple. Les fichiers sources (fichiers C++ par exemple) sont traduits en un langage intermédiaire, appelé LLVM-IR (de l'anglais LLVM Intermediate Representation). Ensuite, de multiples analyses et transformations sont faites sur cette représentation intermédiaire. C'est aussi à ce niveau qu'interviennent certaines extensions, comme Polly par exemple. Enfin, dans un dernier temps, le code machine est généré en fonction de la représentation intermédiaire.
Représentation du code
LLVM offre un ensemble d'instructions indépendant de tout langage et de tout système. La plupart des instructions ont une forme similaire au code à trois adresses. Chaque instruction a également une forme d'attribution statique simple (forme SSA), ce qui veut dire que chaque variable (appelée un registre typé) est assignée une seule fois puis est figée : ceci permet de simplifier l'analyse des dépendances parmi les variables.
Toutes les sortes de conversion de type, allant de la coercition ascendante à la coercition descendante d'un objet, doivent être réalisées en utilisant explicitement l'instruction cast
. LLVM possède des types de base comme les entiers de taille fixe, et exactement cinq types dérivés, à savoir : pointeurs, tableaux, vecteurs, structures, et fonctions. Un type issu d'un langage concret peut être représenté par une combinaison de ces types dans LLVM. Par exemple, une classe en C++ peut être représentée par une combinaison de structures, fonctions, et tableaux de pointeurs de fonctions.
Notes et références
- Chris Lattner, « The LLVM 1.0 Release is finally available! »
- « LLVM 14.0.6 Release », (consulté le )
- « https://github.com/llvm/llvm-project/releases/tag/llvmorg-13.0.1-rc1 »
- « https://github.com/llvm/llvm-project/releases/tag/llvmorg-13.0.1-rc2 »
- « https://github.com/llvm/llvm-project/releases/tag/llvmorg-13.0.1-rc3 »
- (en) Information de version 2.9.
- (en) Reconstruction de l'archive Debian avec clang.
La publication de la version 3.3 : (en) Michael Larabel, « LLVM 3.3 Officially Released », Phoronix,
Liens externes
- (en) Site officiel
- (en) LLVM: A Compilation Framework for Lifelong Program Analysis & Transformation (publication de Chris Lattner et Vikram Adve)
- (en) Manuel de référence du langage LLVM (décrit la représentation intermédiaire LLVM)
- (en) LLVM/GCC Integration Proposal (discussion au sujet de l'intégration de LLVM dans GCC)
- Portail de la programmation informatique
- Portail des logiciels libres