LLVM

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher
LLVM
Logo

Développeur LLVM Developer Group, Université de l'Illinois, Apple, Google
Première version [1]Voir et modifier les données sur Wikidata
Dernière version 3.9.1 ()[2]
5.0.0 ()[3]Voir et modifier les données sur Wikidata
Écrit en C++Voir et modifier les données sur Wikidata
Environnement MultiplateformeVoir et modifier les données sur Wikidata
Langues Anglais
Type CompilateurVoir et modifier les données sur Wikidata
Licence Licence Open Source NCSA/Université de l'IllinoisVoir et modifier les données sur Wikidata
Site web llvm.orgVoir et modifier les données sur Wikidata

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.

Caractéristiques[modifier | modifier le code]

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 MSIL, 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[modifier | modifier le code]

Jusqu'à la version 2.9, LLVM offrait une compilation C/C++ et ObjectiveC via LLVM-GCC. Depuis, DragonEgg remplace LLVM-GCC [4] 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 16 000 paquets que comprend l'archive Debian, 8,8 % d'entre eux ne compilent pas avec Clang [5].

Représentation du code[modifier | modifier le 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[modifier | modifier le code]

La publication de la version 3.3 : (en) Michael Larabel, « LLVM 3.3 Officially Released », Phoronix, 18 juin 2013

Liens externes[modifier | modifier le code]