Aller au menu - Aller au contenu

Clang fait ses preuves en s'autocompilant

Revenir à la liste des news
Participer à la discussion

Image

Informations

Contributeur(s) : gnomnain
Publié : le 13/02/2010 à 20:37:40
Catégorie : Programmation
Visualisations : 23 007

Licence : Creative Commons BY SA

Clang fait ses preuves en s'autocompilant


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.

Image utilisateur
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


Image utilisateur
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


Image utilisateur

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.


Liens


66 Participations

Pour accéder à cette section
Connectez-vous !
connexion_rpx
Page Précédente  1  2  3 
Pseudo Discussion
3 visiteurs sur cette news (0 membre et 3 anonymes)
Page Précédente  1  2  3 
Hors ligne e=mc2 # Posté le 15/02/2010 à 09:39:09
Avatar

Ville : Le bonhomme
Pays : France métropolitaine

Et le premier binaire à été écrit avec des plaquettes percées :-° .

Image utilisateur
 
Hors ligne gnomnain # Posté le 15/02/2010 à 15:45:19
Blblbl !
Avatar
Groupe : Anciens

Oui, le principe c'est de faire le truc de manière incrémentale. Par exemple, ils ont pas créé directement un compilateur C en binaire, mais on pu commencer par un assembleur, puis un interpréteur pour un langage plutôt simple et bas niveau (comme Forth) et ainsi de suite.
Une fois qu'on a un interpréteur pour un langage, on peut écrire le compilateur pour ce langage dans ce langage et là ça devient rigolo parce qu'il suffit d'interpréter le compilateur et de le faire tourner sur lui-même.

Image utilisateur
Haskell - Learn You a Haskell - Real World Haskell - xmonad - OCaml
Apprenez Haskell ! - #ircduzero
<colbseton> Serialk: tu cherches vraiment des liens logiques dans tout ce que je raconte ?
 
Hors ligne sidarape # Posté le 15/02/2010 à 23:19:14
Voici votre E.P.P.Z monsieur!
Avatar

Ville : Québec, qc
Pays : Canada
Études : Cégep Sainte-Foy

Citation : e=mc2
Et le premier binaire à été écrit avec des plaquettes percées :-° .

Et les plaquettes en carton, le carrton en papier, papier en bois, l'arbre est dans ses feuilles Marilonnn Marilééééé, l'arbre est dans ses feuilles Marilonnn Donnnnn Dééééé. Ok, je sors :p --> []

Image utilisateur

Vive le Québec Libre!!!
 
Hors ligne bluestorm # Posté le 17/02/2010 à 10:27:38
dont ask to ask
Avatar
Groupe : Anciens
Flux RSS

Citation
De plus, seuls les commentaires constructifs sont acceptés, et non les appréciations de la qualité de la news.

Je ne suis pas sûr de ce que tu veux dire. Pourquoi ne pourrait-on pas porter un jugement sur la news elle-même ? Je pense comprendre que ça vient d'une bonne intention (éviter les commentaires pas constructifs), mais la formulation est maladroite.

Je trouve que la news est bien, mais qu'elle présente trop l'ensemble comme un projet spécifique à Apple, alors que c'est à portée beaucoup plus large. Clang est mentionné en premier, sur lequel surtout les gens d'Apple travaillent, et du coup LLVM qui est signalé ensuite semble encore Apple-spécifique alors que ce n'est pas du tout le cas, c'est une communauté de programmeurs et d'universitaires beaucoup plus large. Je pense qu'on pourrait (ou aurait pu) rajouter un message pour clarifier ça, car les commentaires sont parfois confus à ce sujet.


zulon > Clang Static Analyzer est un outil standalone qui repose sur le front-end Clang. C'est assez logique, puisque ce genre d'outil travaille sur un AST et repose donc sur la présence d'un parseur (parfois un peu boosté avec des phases de simplification) pour faire son travail sur des programmes concrets.
 
Hors ligne gnomnain # Posté le 17/02/2010 à 13:35:23
Blblbl !
Avatar
Groupe : Anciens

En effet, en relisant la news, je vois que c'est pas très clair, ça aurait mérité un peu plus d'explications. Quand aux commentaires, le problème, c'est les commentaires de type "bonne news" sans aucun contenu sur la news que les commentaires sur la news elle-même qui posent problème. Je suis très content de recevoir des commentaires constructifs sur la forme, mais la plupart du temps les gens se contentent d'une "bonne news" (et maintenant, rajoutent une raison bidon derrière) et ça n'apporte pas grand chose. La formulation n'est donc pas très adaptée, mais c'est difficile de formuler ça de façon correcte.

Image utilisateur
Haskell - Learn You a Haskell - Real World Haskell - xmonad - OCaml
Apprenez Haskell ! - #ircduzero
<colbseton> Serialk: tu cherches vraiment des liens logiques dans tout ce que je raconte ?
 
Hors ligne nicknick63 # Posté le 18/02/2010 à 14:03:34
Avatar
Flux RSS

Ville : Clermont-ferrand
Pays : France métropolitaine

Le problème gnomnain c'est que tu sembles appliquer un jugement de valeur aux commentaires un peu strict. Or il me semble que le but du SdZ c'est d'être accessible à tous le monde, et dans ce tout le monde il y a des gens qui n'ont rien d'autre à dire que "Bonne news, je l'ai lu en mangeant mes Chocapics lol".
Alors évidemment pour beaucoup ces commentaires paraissent non seulement inutiles mais en plus gênants, mais ce n'est pas l'avis de tous. Comment les interdire sans apporter un jugement de valeur à leurs auteurs, qui ne sont sûrement pas encore très habitués aux us et coutumes du Nain Ternet...
Alors autant continuer soit à les ignorer, soit à leur faire remarquer plus ou moins poliment que leur remarque était tout ce qu'il y a de plus inutile.

Alala qu'ils sont élitistes ces gens de #sdz :D .
 
Pour accéder à cette section
Connectez-vous !
connexion_rpx

Revenir à la liste des news