LLVM

infrastructure de compilateurs pour plusieurs langages de programmation

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.

LLVM

Informations
Développé par LLVM Developer Group, Université de l'Illinois, Apple, Google
Première version [1]Voir et modifier les données sur Wikidata
Dernière version 18.1.5 ()[2]Voir et modifier les données sur Wikidata
Dépôt github.com/llvm/llvm-projectVoir et modifier les données sur Wikidata
Écrit en C++, C et assembleurVoir et modifier les données sur Wikidata
Système d'exploitation Multiplateforme, NetBSD, FreeBSD, OpenBSD, Linux, MINIX 3 (en), Microsoft Windows et IllumosVoir 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'Illinois et Apache License v2.0 with LLVM Exceptions (d)Voir et modifier les données sur Wikidata
Site web llvm.orgVoir et modifier les données sur Wikidata

Caractéristiques modifier

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 modifier

Jusqu'à la version 2.9, LLVM offrait une compilation C/C++ et ObjectiveC via LLVM-GCC. Depuis, DragonEgg remplace LLVM-GCC [3] 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[4].

Pipeline modifier

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 modifier

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

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

Liens externes modifier