URL: https://linuxfr.org/news/llvm-30 Title: LLVM 3.0 Authors: rewind nazcafan, baud123, Manuel Menal et Benoît Sibaud Date: 2011年11月12日T15:13:25+01:00 License: CC By-SA Tags: llvm, compilateur et objective-c Score: 55 LLVM, pour [Low Level Virtual Machine](http://fr.wikipedia.org/wiki/Low_Level_Virtual_Machine), est une suite de compilation qui commence à se faire une place à côté du vénérable GCC. Sa grande modularité, comparé au monolithique GCC, permet d'écrire facilement un compilateur, en utilisant la [représentation intermédiaire de LLVM](http://llvm.org/docs/LangRef.html), et en faisant appel ensuite aux optimisations et à la génération de code de LLVM. Le projet arrive maintenant à une certaine maturité grâce à cette [version 3.0](http://lists.cs.uiuc.edu/pipermail/llvm-announce/2011-December/000039.html) qui apporte beaucoup de nouveautés. Il est à noter que la numérotation suit le schéma d'OpenBSD, c'est-à-dire que la version 3.0 suit la version 2.9, ce n'est donc pas une version majeure – malgré les modifications plus importantes qu'à l'accoutumée – qui sont détaillées dans la seconde partie. ---- [The LLVM Compiler Infrastructure](http://llvm.org/) [Les notes de version de LLVM 3.0](http://llvm.org/releases/3.0/docs/ReleaseNotes.html) [Les notes de version de Clang 3.0](http://llvm.org/releases/3.0/docs/ClangReleaseNotes.html) ---- # Les nouveautés dans le cœur de LLVM ## Un modèle mémoire LLVM s'est doté d'un [modèle mémoire](http://llvm.org/docs/Atomics.html) compatible avec ceux du tout récent C++11, du futur C1X et du vénérable Java. Il introduit une spécification des accès mémoire suivant différents [ordres](http://llvm.org/docs/LangRef.html#ordering). Les instructions atomiques, comme le bien connu [[compare-and-swap]], qui étaient auparavant accessibles via une [[fonction intrinsèque]] sont maintenant directement [intégrées dans le langage](http://llvm.org/docs/LangRef.html#memoryops). ## Un nouveau système de gestion des exceptions Le [système de gestion des exceptions](http://llvm.org/docs/ExceptionHandling.html) a été entièrement revu. Le [nouveau système](http://blog.llvm.org/2011/11/llvm-30-exception-handling-redesign.html) permet de corriger un grand nombre de bugs. Il permet également de produire du code mieux optimisé, grâce à l'utilisation d'instructions du langage plutôt que de fonctions intrinsèques. Il est à noter qu'il est en partie compatible avec le système utilisé par GCC, ce qui permet qu'un programme compilé avec CLang/LLVM puisse interagir avec un programme compilé avec GCC, et inversement. ## Un nouvel allocateur de registre Un [nouvel allocateur de registre glouton](http://blog.llvm.org/2011/09/greedy-register-allocation-in-llvm-30.html) a été développé. L'[[allocation de registres]] est l'étape pendant laquelle le compilateur va assigner au mieux des variables à des registres ou à des zones mémoires, en essayant d'optimiser les opérations effectuées (une opération sur une zone mémoire est plus coûteuse qu'une opération dans un registre). Le problème de l'allocation de registre étant un problème NP-complet, il est nécessaire de passer par des heuristiques. Le code généré par ce nouvel allocateur est 1 à 2% plus petit en taille et jusqu'à 10% plus rapide que le code généré par l'ancien allocateur. Par conséquent, ce nouvel allocateur est maintenant l'allocateur par défaut dans LLVM. ## La refonte des types en interne Comme annoncé dans la nouvelle de sortie de LLVM 2.9, [le système de type a été entièrement revu](http://blog.llvm.org/2011/11/llvm-30-type-system-rewrite.html). L'ancien système était basé sur la structure des types, c'est-à-dire que deux types ayant la même structure étaient représentés par un seul et même objet. Ceci avait pour avantage de pouvoir comparer les types en comparant les pointeurs sur les objets, mais comme énorme inconvénient de vérifier pour chaque nouveau type l'existence d'un type avec la même structure, donc de faire des comparaisons de graphes. En plus de cet inconvénient, les types opaques, une fois résolus, impliquaient un parcours complet de tous les types et valeurs existantes, ce qui provoquait de nombreux bugs. En outre, les types récursifs (comme les listes chaînées) étaient [difficiles à construire](http://llvm.org/releases/2.9/docs/ProgrammersManual.html#BuildRecType). Le nouveau système résout tous ces problèmes en introduisant les types nommés, qui correspondent grosso-modo aux structures en C. Les types nommés sont d'abord créés, puis leur corps est défini. Les anciens types basés sur la structure existent toujours mais sont relégués au second plan. Un autre avantage est qu'une grande partie de la fusion des types est maintenant faite au niveau de l'édition des liens, pour tous les types en même temps, plutôt qu'à la compilation, à chaque nouveau type. ## Autres améliorations en vrac * Le backend MIPS a fait de gros progrès et est considéré comme mature. Il gère notamment diverses sous-architectures. * LLVM gère désormais la [prédiction de branche](http://llvm.org/docs/BranchWeightMetadata.html) et `__builtin_expect` sous forme de métadonnées dans la représentation intermédiaire. # Les projets annexes à LLVM ## Clang [Clang](http://clang.llvm.org/) est le compilateur C/C++/Objective C/Objective C++ attitré du projet LLVM, développé en même temps que LLVM. [Comparé à GCC](http://clang.llvm.org/comparison.html#gcc), Clang est modulaire (comme LLVM) et fait un gros effort sur les messages de diagnostic en donnant, quand il le peut, la manière de corriger l'erreur. Clang essaie toutefois d'être compatible avec les options de GCC pour que le remplacement puisse se faire de manière souple. Dans cette [version 3.0](http://clang.llvm.org/docs/ReleaseNotes.html), Clang a été grandement amélioré sur les points suivants : * Les diagnostics ont encore été améliorés, permettant notamment de suggérer la correction de petites erreurs de nom (`Int` à la place de `int` par exemple). * La libclang, une interface en C permettant de parcourir l'arbre de syntaxe abstrait produit par Clang, permet maintenant une meilleure complétion. Les bindings Python ont également été améliorés. * Le préprocesseur peut maintenant être instrumenté à l'aide de [[fonctions de rappel]]. * La prise en charge de Windows, que ce soit via MinGW, Cygwin ou nativement, a été améliorée, notamment par la gestion d'extensions spécifiques au compilateur MSVC. * Un système d'annotation permet de faire quelques vérifications de sûreté sur du code multi-threadé, en particulier dans la gestion des verrous. * La prise en charge complète de [C++11](http://clang.llvm.org/cxx_status.html#cxx11) ainsi que du futur C1X continue. ## DragonEgg [DragonEgg](http://dragonegg.llvm.org/) est un greffon GCC qui permet de remplacer les modules d'optimisation et de génération de code de GCC par ceux de LLVM. Il est le successeur du frontend llvm-gcc. DragonEgg a été mis à jour pour gérer pleinement GCC 4.6 et ne nécessite plus aucun patch à GCC. Il permet également d'appliquer les optimisations de LLVM et de GCC en même temps. Le frontend llvm-gcc n'est désormais plus distribué. ## Et ailleurs * libc++, une implémentation de la bibliothèque standard C++ (jusqu'à la version C++11) a été portée sur FreeBSD de manière à devenir l'implémentation par défaut dans FreeBSD 10. * Le debugger LLDB est désormais plus fiable et robuste. Un [tutoriel](http://lldb.llvm.org/tutorial.html) et une [feuille de triche^Wmémento](http://lldb.llvm.org/lldb-gdb.html) sont disponibles. ## La rencontre des développeurs LLVM La [dernière rencontre des développeurs LLVM](http://llvm.org/devmtg/2011-11/) a eu lieu il y a quelques jours. Le programme était alléchant mais les supports de présentation ne sont pas encore disponibles. On peut noter une présence importante de Google qui utilise LLVM de différentes manières sur l'ensemble de son code. # Projets externes utilisant LLVM Voici des [exemples de projets utilisant LLVM](http://llvm.org/docs/ReleaseNotes.html#externalproj) pris parmi les nombreux projets répertoriés dans les notes de sortie. Cette sélection est nécessairement partielle et partiale. ## Le langage Tart Le [langage Tart](http://code.google.com/p/tart/) est un mix entre C, C++, Python, Java, C#, D, Haskell, Ruby, Scala. Les [premiers exemples](http://docs.tart.googlecode.com/hg/intro/quickstart.html) permettent de mieux se rendre compte de la syntaxe. La [documentation très bien faite](http://docs.tart.googlecode.com/hg/index.html) permet de voir les fonctionnalités intéressantes : une différenciation entre variable mutable et immutable, closures, interfaces et protocoles, surcharge des opérateurs via des fonctions, attributs (annotations), réflexion, appels direct à des fonctions C, macros dans le langage, templates, etc. ## Le langage Julia Le [langage Julia](http://www.julialang.org/) est un langage à vocation technique, comme ~~MatLab~~[[Scilab]] ou [[GNU_Octave]]. La [documentation très riche](https://github.com/JuliaLang/julia/wiki/Manual) montre les multiples possibilités de ce langage : [[dispatch multiple]] associé à un système de typage bien pensé tout en étant très efficace, coroutines, nombres complexes et rationnels directement dans le langage, gestion d'Unicode, exécution de commandes du shell, macros intégrés dans le langage, et bien évidemment module d'algèbre linéaire (utilisant LAPACK). Julia offre en outre un outil de session interactive. Et dire que ce logiciel n'est qu'en version 0 pré-release...

AltStyle によって変換されたページ (->オリジナル) /