LLVM vs clang sur OS X

133

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

Quelle est la différence entre les 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 de llvm par rapport à gcc?

dominik
la source
9
llvm n'est qu'un backend, il ne peut pas y avoir de compilateur llvm autonome ... il n'y a que des frontends différents, comme gcc et clang.
smerlin
4
@smerlin: "llvm compiler" est le nom commercial d'Apple pour clang + llvm: developer.apple.com/technologies/tools/…
Stephen Canon
Autres détails ici: stackoverflow.com/a/26724886/1938163
Marco A.

Réponses:

201

LLVM était à l'origine synonyme de «machine virtuelle de bas niveau», bien qu'il ne se présente plus qu'à lui-même car il est devenu autre chose qu'une machine virtuelle traditionnelle. C'est un ensemble de bibliothèques et d'outils, ainsi qu'une représentation intermédiaire standardisée, qui peuvent être utilisés pour aider à construire des compilateurs et des compilateurs juste à temps. Il ne peut pas compiler autre chose que sa propre représentation intermédiaire; il a besoin d'une interface spécifique au langage pour ce faire. Si les gens se réfèrent simplement à LLVM, ils ne parlent probablement que de la bibliothèque et des outils de bas niveau. Certaines personnes peuvent appeler à tort Clang ou llvm-gcc «LLVM», ce qui peut prêter à confusion.

llvm-gcc est une version modifiée de GCC, qui utilise LLVM comme backend au lieu de celui de GCC. Il est désormais obsolète, au profit de DragonEgg, qui utilise le nouveau système de plugins de GCC pour faire la même chose sans forcer GCC.

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

Chacune de ces approches (GCC simple, GCC + LLVM et Clang) a ses avantages et ses inconvénients. Les derniers ensembles de tests que j'ai vus ont montré que GCC produisait un code légèrement plus rapide dans la plupart des cas de test (bien que LLVM ait eu un léger avantage dans quelques-uns), tandis que LLVM et Clang donnaient des temps de compilation nettement meilleurs. GCC et les combos GCC / LLVM ont l'avantage que beaucoup plus de code a été testé et fonctionne sur la saveur GCC de C; il existe des extensions spécifiques au compilateur que seul GCC possède, et certains endroits où la norme permet à l'implémentation de varier mais le code dépend d'une implémentation particulière. Il est beaucoup plus probable que si vous obtenez une grande quantité de code C hérité, cela fonctionnera dans GCC que cela fonctionnera dans Clang, bien que cela s'améliore avec le temps.

Brian Campbell
la source
13
Pour ajouter à cette merveilleuse réponse: clang est aussi un ensemble de bibliothèques (appelé libclang) que vous pouvez utiliser pour des choses comme l'analyse de code, l'auto-complétion, la coloration syntaxique, etc… C'est très pratique pour les IDE.
5
Lors de la construction pour MacOS X ou iOS, considérez que Clang est le logiciel qu'Apple utilise pour créer tous ses logiciels MacOS X et iOS, y compris le système d'exploitation, et que Clang est ce que vous obtenez automatiquement, sans effort, et ce que tout le monde vous demander de l'aide utilise. Apple n'a jamais pris en charge gcc après gcc 4.2, et ne livre plus aucune version de gcc.
gnasher729
1
@ gnasher729 Oui, cette réponse a été écrite il y a 3 ans, alors qu'Apple livrait toujours llvm-gcc et Clang, avec llvm-gcc comme compilateur par défaut. Les temps ont changé depuis.
Brian Campbell
54

Il y a 2 choses différentes ici.

LLVM est un compilateur backend destiné à construire des compilateurs dessus. Il traite des optimisations et de la production de code adapté à l'architecture cible.

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

llvm gcc était une version initiale d'un compilateur C ++ basé sur llvm basé sur gcc 4.2, qui est maintenant obsolète car 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. Bien que gcc soit monolithique, CLang a été construit comme une suite de bibliothèques. Cette conception modulaire offre de grandes opportunités de réutilisation pour les IDE ou les outils de complétion par exemple.

Pour le moment, le code produit par gcc 4.6 est généralement un peu plus rapide, mais CLang comble l'écart.

Matthieu M.
la source
5

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 le frontal clang pour analyser votre code et génère la sortie compilée à l'aide de LLVM. "clang" est en fait juste le nom de ce front-end, mais il est souvent utilisé avec désinvolture comme nom pour le compilateur dans son ensemble.

Stephen Canon
la source