Le 4 février, les développeurs de Clang, un compilateur pour les langages de la famille du C, ont annoncé qu'il
était maintenant capable de se compiler lui-même. Clang, écrit en C++, supportait déjà les langages C et Objective-C. Cependant, il ne gère pour l'instant qu'un
sous-ensemble réduit du C++, et n'est pas capable de compiler en entier des projets utilisant toutes les fonctionnalités du langage C++, comme
Boost. Le projet vient donc de réaliser une avancée significative, mais ne peut pas encore tout à fait rivaliser avec des compilateurs comme GCC.
Clang, un compilateur C, C++ et Objective-C
Clang est une partie d'un compilateur C, C++ et Objective-C : il transforme le code en un autre langage, plus simple, qui est ensuite compilé en code machine par un deuxième compilateur appelé
LLVM.
Le projet a été lancé par Apple, pour remplacer
gcc, le compilateur du projet GNU. En effet, dans Mac OS, gcc a d'abord été utilisé comme un compilateur à part entière, puis comme
front end, traduisant le code C dans un langage compréhensible par LLVM. Cependant, il est difficile d'intégrer gcc avec d'autres programmes, parce que son architecture ne s'y prête pas, mais aussi parce qu'il est publié sous licence
GPL, ce qui signifie que les programmes qui y font appel doivent être publiés sous une licence compatible. De plus, alors que Apple utilise beaucoup l'Objective-C, le support de ce langage n'est pas considéré comme prioritaire par les développeurs de gcc. Apple a donc décidé de lancer le projet clang, dont le code a été publié sous licence BSD en juillet 2007. Depuis la version
Snow Leopard, clang fait partie des compilateurs distribués avec Mac OS.
Qu'est-ce que clang apporte ?
Dès le départ, clang a été conçu comme un
ensemble modulable de bibliothèques liées dynamiquement et pouvant être utilisées de manière indépendante. Cela permet d'utiliser les fonctionnalités de clang à la carte, sans avoir à le recompiler pour chaque usage, et ouvre la voie à de nombreuses applications.
Par exemple, en plus de pouvoir compiler du C, il est aussi utilisable pour gérer la coloration syntaxique, faire une liste des fontions utilisées par l'IDE, ou bien pour des outils de
refactorisation automatique. Pour faciliter ce type d'utilisation, le maximum d'informations sur la structure du code original est gardé pendant la compilation.
Une attention particulière a été apportée aux
messages d'erreurs, afin qu'ils soient le plus clairs possible. Quand le compilateur est utilisé en ligne de commande, clang affiche avec les messages d'erreurs la ligne de code concernée, et montre où exactement se trouve l'erreur. Si le code provoquant une erreur a été généré par une macro, clang affiche à la fois le code avant l'application de la macro et le code de la macro. Les erreurs sont aussi mieux ciblées : le plus souvent, clang montre la cause du problème plutôt que sa conséquence. Ainsi, en cas de point-virgule oublié, clang indique que l'erreur se trouve à la ligne où le point-virgule manque plutôt qu'à la ligne suivante.
Ces fonctionnalités permettent une meilleure intégration avec l'IDE : la conception modulaire de clang permet par exemple de récupérer les erreurs sous une forme facile à traiter pour l'afficher directement dans l'IDE (c'est le cas dans l'IDE Xcode d'Apple).
Enfin, des tests ont montré que clang est un compilateur plus rapide que gcc, tout en utilisant moins de mémoire. Il est de plus capable d'exploiter les processeurs multiples pour accélérer la compilation.
Les développeurs de clang développent aussi un
analyseur statique. Le but de ce programme est d'analyser un code source et d'essayer de déceler des bugs potentiels (fuites mémoires, utilisation de variables non initialisées, pointeurs invalides, ...) sans exécuter le programme. Bien que ce genre de programme ne puisse pas trouver tous les bugs, et que l'analyseur statique de clang soit toujours en développement, il est capable de trouver un certain nombre de bugs dans les programmes, parfois difficiles à détecter manuellement. Ils peuvent ensuite être affichés directement dans l'IDE, ou sous forme de rapport généré en HTML.
LLVM, l'autre partie du compilateur
Le logo de LLVM
Mais Clang n'est qu'une partie d'un compilateur complet. Il génère de l'assembleur LLVM, un langage de bas niveau indépendant du processeur utilisé. C'est ensuite LLVM qui se charge de le transformer en code machine optimisé. En plus de permettre de compiler des programmes statiquement, LLVM est conçu pour permettre la compilation à la volée, ce qui permet par exemple d'optimiser les programmes pendant leur exécution.
LLVM est utilisable de façon indépendante du langage : on peut donc l'utiliser pour compiler
de nombreux langages différents, en appliquant à tous les mêmes optimisations. Il permet notamment de compiler des programmes à partir de la représentation intermédiaire utilisée par gcc, et peut donc être utilisé avec tous les langages supportés par gcc (même si quelques modifications sont nécessaires pour permettre cela).
Des applications concrètes
Clang et LLVM sont de plus en plus utilisés par Apple. Par exemple, depuis Mac OS 10.5, Apple utilise LLVM pour optimiser les
shaders OpenGL : dans ces programmes qui peuvent être exécutés plusieurs millions de fois, les opérations qui ne sont pas supportées par la carte graphique doivent être réalisées sur le processeur. Avant d'utiliser LLVM, Apple utilisait une sorte de compilateur qui mettait bout à bout des morceaux de code prédéfinis. Cependant, cette approche demande de coder une version en assembleur de chaque fonction pour chaque processeur, et très peu d'optimisations étaient possibles. Utiliser LLVM a permis d'écrire le code des opérations en C et d'appliquer beaucoup plus facilement des optimisations sans avoir à écrire de code dédié.
Dans un domaine proche, clang et LLVM sont utilisés par NVidia et Apple pour leur implémentation d'
OpenCL, une
API permettant de réaliser des calculs lourds de façon parallèle, par exemple en utilisant une carte graphique mais aussi en profitant des processeurs à plusieurs coeurs.
Le projet
Unladen Swallow, qui vise à coder un interpréteur plus performant pour le langage dynamique Python, utilise aussi LLVM : les fonctions les plus utilisées sont compilées à la volée en code machine pour leur permettre de s'exécuter plus rapidement. Cette technique est aussi utilisée par
LanguageKit, un composant de l'environnement de bureau libre
Étoilé qui permet d'implémenter facilement des interpréteurs pour des langages dynamiques.
66 Participations
Connectez-vous !
Connectez-vous !
Revenir à la liste des news