web-dev-qa-db-fra.com

LLVM vs clang sur OS X

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

Quelle est la différence entre le llvm-gcc 4.2, le llvm 2.0 et le 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 sur gcc?

127
dominik

LLVM était à l'origine synonyme de "machine virtuelle de bas niveau", bien qu'il se contente désormais de lui-même car il est devenu 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 normalisée, qui peuvent être utilisés pour aider à créer 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 à la langue pour ce faire. Si les gens se réfèrent simplement à LLVM, cela signifie probablement uniquement la bibliothèque et les outils de bas niveau. Certaines personnes peuvent se référer à Clang ou llvm-gcc de manière incorrecte comme "LLVM", ce qui peut provoquer une certaine confusion.

llvm-gcc est une version modifiée de GCC, qui utilise LLVM comme backend au lieu 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 bifurquer 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 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 ordinaire, GCC + LLVM et Clang) a ses avantages et ses inconvénients. Les derniers ensembles de benchmarks que j'ai vus ont montré que GCC produisait du code légèrement plus rapide dans la plupart des cas de test (bien que LLVM ait un léger Edge 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 y a des extensions spécifiques au compilateur que seul GCC a, 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 si vous obtenez une grande quantité de code C hérité que cela fonctionnera dans GCC que cela ne fonctionnera dans Clang, bien que cela s'améliore avec le temps.

189
Brian Campbell

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 appropriée pour LLVM.

llvm gcc était une version initiale d'un compilateur C++ basé sur llvm basé sur gcc 4.2, qui est maintenant déconseillé car CLang peut analyser tout ce qu'il peut 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 permet de grandes possibilités de réutilisation pour IDE ou des 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 le vide.

49
Matthieu M.

llvm-gcc-4.2 utilise le frontal GCC pour analyser votre code, puis génère la sortie compilée à l'aide de LLVM.

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

5
Stephen Canon