GCC vs clang / LLVM - avantages et inconvénients de chacun [fermé]

20

Quels sont les avantages et les inconvénients de GCC vs clang / LLVM?

yodie
la source
3
Avantages / inconvénients pour qui? LLVM est clairement supérieur en tant que backend pour les compilateurs, sauf si vous avez besoin d'une quantité ridicule d'architectures prises en charge. Mais je suppose que vous parlez d'utilisateurs finaux.

Réponses:

19

gcc est très mature, facile à installer (au moins pour la plupart des systèmes), et est le compilateur par défaut pour de nombreux systèmes, donc dans de nombreux cas, les gens l'ont installé presque sans même s'en rendre compte. Il a été porté sur une multitude d'architectures, il est donc beaucoup plus probable qu'il fonctionne immédiatement si vous devez cibler du matériel obscur.

clang est beaucoup plus récent. Il produit souvent de bien meilleurs messages d'erreur, en particulier pour les modèles C ++. Dans de nombreux cas, il s'exécute beaucoup plus rapidement. Il est construit principalement comme un ensemble de bibliothèques, donc il existe de nombreux autres projets (par exemple, des analyseurs de code) qui utilisent le même front-end, comprennent les mêmes entrées, etc. L'utilisation de llvm comme back-end lui donne une flexibilité supplémentaire dans comment vous générez du code.

Jerry Coffin
la source
17
  1. Clang a un bien meilleur rapport d'erreurs. Par exemple, si vous faites une faute de frappe dans un nom de fonction que vous appelez, Clang signalera qu'il s'agit probablement d'une faute de frappe (et suggérera le nom correct), tandis que GCC se plaindra du nom de fonction inconnu.

  2. GCC produit généralement du code plus rapide si vous ciblez x86 / x86-64. Pour ARM, la situation est ambiguë, souvent Clang optimise mieux. De plus, AFAIK Clang ne prend pas en charge l'optimisation de la taille du code.

  3. GCC utilise beaucoup d'heuristiques. C'est bon pour les performances (dans un cas typique), mais horrible si vous voulez faire une optimisation au niveau de la source (par exemple, le déroulement de la boucle). Même de petites modifications du code source peuvent faire en sorte que GCC génère une sortie complètement différente. Clang est plus prévisible et génère généralement le code que vous attendez.

  4. Contrairement à Jerry Coffin, je trouve la construction de GCC à partir de sources beaucoup plus difficile que Clang. La procédure de la page Mise en route de Clang a toujours fonctionné pour moi. Un manuel similaire pour GCC n'a jamais fonctionné du premier coup. GCC a des dépendances sur des versions particulières de GMP, MPFR, MPC, Parma Polyhedra Library et CLooG, et j'ai eu besoin de plusieurs itérations pour trouver les versions qui fonctionneraient pour une version particulière de GCC (oui, l'utilisation des dernières versions de ces bibliothèques ne fonctionne pas ).

  5. J'ai le sentiment que Clang est mieux testé que GCC. Même si je n'utilise que les versions officielles de GCC, il a parfois produit un code défectueux. Pour Clang, j'utilise généralement la version trunk (encore une fois, car elle est facile à construire), mais je ne l'ai jamais vue générer une sortie incorrecte.

  6. GCC est presque standard dans le monde Linux, et il ajoute de nombreuses fonctionnalités non standard qui sont largement utilisées dans les logiciels Linux. Clang essaie d'être compatible avec GCC, mais parfois il les ignore discrètement. Plus important encore, Clang ne prend pas en charge OpenMP. Cependant, il a également des extensions qui ne sont pas prises en charge par GCC, mais peuvent être utiles (par exemple, ajouter des fonctions intrinsèques avec carry __buildin_addc).

  7. Si vous voulez faire des recherches sur le compilateur, ou tout simplement curieux de savoir comment cela fonctionne, vous trouverez le code source Clang / LLVM plus accessible. Le code Clang / LLVM est lisible par l'homme, pas seulement lisible par le compilateur.

  8. (La clause de non-responsabilité AINAL s'applique) La licence Clang / LLVM vous donne plus de liberté sur ce que vous pouvez faire avec le code, par exemple l'utilisation dans un produit commercial ou de source fermée. La licence pour les bibliothèques d'exécution GCC ajoute une autre couche de restrictions tandis que l'exécution du compilateur Clang (bibliothèque compiler-rt) est sous licence MIT permissive.

Résumé: compilez avec Clang lorsque vous développez le programme, et avec GCC pour la version finale (mais assurez-vous qu'il est plus rapide et ne casse pas). Restez avec Clang / LLVM si vous effectuez des recherches sur le compilateur.

Marat Dukhan
la source
Intéressant, je n'ai jamais su que Clang a un add-with-carry intrinsèque. Mais ça devrait l'être __builtin_add, non __buildin_addc. Quoi qu'il en soit, Clang est suffisamment intelligent pour générer addclorsqu'il rencontre un large ajout en utilisant la comparaison comme report
phuclv
Je veux dire __builtin_addcpas__buildin_addc
phuclv
Les comparaisons de performances ici sont obsolètes. Selon des benchmarks plus récents, clang est plus rapide que gcc sur x86 / 64 dans un peu plus de la moitié des tests (par exemple openbenchmarking.org/result/1605071-HA-GCCCLANG568 )
Jules
3

Si vous avez une nouvelle architecture CPU ou de nouvelles optimisations, et que vous souhaitez les ouvrir sous GPL, vous pouvez les contribuer à gcc. Cependant, gcc est moins modulaire, donc cela peut impliquer plus de travail pour ajouter ses modifications / ajouts. Si vous souhaitez contribuer de nouvelles architectures ou optimisations à un projet open source, mais sous une licence non GPL, vous pouvez les contribuer à LLVM / clang. Il existe des sociétés dont les services juridiques n'autorisent que ces derniers.

hotpaw2
la source
-3

Aujourd'hui (8/11/2011), GCC prend en charge beaucoup plus de fonctionnalités C ++ 0x que Clang. Si vous voulez ces fonctionnalités, c'est une évidence; GCC est votre option.

Sean McMillan
la source
Cette réponse est précise et informative dans le délai spécifié selon mes recherches.
8
Mais ce n'est vraiment pas une très bonne réponse, car à partir d'aujourd'hui (28/07/2012) ce point n'est plus valable. Clang prend en charge plus que GCC, le cas échéant.
DeadMG