128 votes

LLVM vs clang sur OS X

J'ai une question concernant llvm, clang et gcc sur OS X.

Quelle est la différence entre llvm-gcc 4.2, llvm 2.0 et clang ? Je sais qu'ils s'appuient tous sur llvm mais en quoi sont-ils différents ?

Outre une compilation plus rapide, quel est l'avantage d'llvm sur gcc ?

194voto

Brian Campbell Points 101107

LLVM signifiait à l'origine "low-level virtual machine" (machine virtuelle de bas niveau), bien qu'il ne représente plus que lui-même, car il s'est développé pour devenir autre chose qu'une machine virtuelle traditionnelle. Il s'agit d'un ensemble de bibliothèques et d'outils, ainsi que d'une représentation intermédiaire standardisée, qui peuvent être utilisés pour aider à construire des compilateurs et des compilateurs juste à temps. Elle ne peut pas compiler elle-même autre chose que sa propre représentation intermédiaire ; elle a besoin d'une interface spécifique au langage pour le faire. Si les gens se réfèrent à LLVM, ils parlent probablement de la bibliothèque de bas niveau et des outils. Certaines personnes peuvent se référer à Clang ou à llvm-gcc de manière incorrecte en tant que "LLVM", ce qui peut entraîner une certaine confusion.

llvm-gcc est une version modifiée de GCC, qui utilise LLVM comme backend au lieu de GCC. Elle est maintenant obsolète, en faveur de DragonEgg, qui utilise le nouveau système de plugins de GCC pour faire la même chose sans forker GCC.

Clang est un tout nouveau compilateur C/C++/Objective-C, qui utilise son propre frontend et LLVM comme backend. Les avantages qu'il apporte sont de meilleurs messages d'erreur, un temps de compilation plus rapide, et un moyen plus facile pour d'autres outils de s'accrocher au processus de compilation (comme l'application Débogueur LLDB y Analyseur statique Clang ). Il est également raisonnablement modulaire et peut donc être utilisé comme bibliothèque pour d'autres logiciels qui ont besoin d'analyser du code C, C++ ou Objective-C.

Chacune de ces approches (GCC simple, GCC + LLVM et Clang) présente des avantages et des inconvénients. Les dernières séries de tests que j'ai vues ont montré que GCC produisait un code légèrement plus rapide dans la plupart des cas (bien que LLVM ait un léger avantage dans quelques cas), tandis que LLVM et Clang donnaient des temps de compilation significativement meilleurs. GCC et les combinaisons GCC/LLVM ont l'avantage que beaucoup plus de code a été testé et fonctionne sur la saveur GCC du C ; il y a certaines extensions spécifiques au compilateur que seul GCC possède, et certains endroits où le standard permet à l'implémentation de varier mais où le code dépend d'une implémentation particulière. Il est beaucoup plus probable, si vous avez une grande quantité de code C hérité, qu'il fonctionne avec GCC qu'avec Clang, bien que cela s'améliore avec le temps.

50voto

Matthieu M. Points 101624

Il s'agit de deux choses différentes.

LLVM est un compilateur dorsal destiné à construire des compilateurs au-dessus de lui. Il s'occupe des optimisations et de la production de code adapté à l'architecture cible.

CLang est une interface qui analyse le code C, C++ et Objective C et le traduit dans une représentation adaptée à LLVM.

llvm gcc était une version initiale d'un compilateur C++ basé sur llvm et basé sur gcc 4.2, qui est maintenant obsolète depuis que CLang peut analyser tout ce qu'il pouvait analyser, et plus encore.

Enfin, la principale différence entre CLang et gcc ne réside pas dans le code produit mais dans l'approche. Alors que gcc est monolithique, CLang a été conçu comme une suite de bibliothèques. Cette conception modulaire offre de grandes possibilités de réutilisation pour les IDE ou les outils de complétion par exemple.

Actuellement, le code produit par gcc 4.6 est généralement un peu plus rapide, mais CLang est en train de combler l'écart.

5voto

Stephen Canon Points 58003

Llvm-gcc-4.2 utilise l'interface GCC pour analyser votre code, puis génère la sortie compilée en utilisant LLVM.

Le "compilateur llvm 2.0" utilise l'interface clang pour analyser votre code, et génère la sortie compilée en utilisant LLVM. "clang" est en fait juste le nom de ce front-end, mais il est souvent utilisé comme nom pour le compilateur dans son ensemble.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X