LLVM

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

Développeur LLVM Developer Group, Université de l'Illinois, Apple, Google
Dernière version 3.4 (6 janvier 2014)
Écrit en C++, Assembleur, ...
Environnement Multiplate-forme
Langue Anglais
Type Compilateur
Licence Licence Open Source NCSA/Université de l'Illinois
Site web llvm.org

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 à la compilation, l'édition de liens, l'exécution ou durant les "temps morts" d'un programme écrit dans un langage quelconque.

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 OpenGL de 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 [1] pour proposer, via un greffon gcc, une compilation complète des langages Ada, C, C++, Fortran et partiellement de Go, Java, Obj-C et Obj-C++. Surtout, LLVM propose un compilateur C, C++, Obj-C et Obj-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 [2].

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]

  1. (en) Information de version 2.9.
  2. (en) Reconstruction de l'archive Debian avec clang.

La publication de la version 3.3 : http://www.phoronix.com/scan.php?page=news_item&px=MTM5MDk

Liens externes[modifier | modifier le code]