GCC vs clang / LLVM - Für und Wider von jedem [geschlossen]

20

Was sind die Vor- und Nachteile von GCC gegenüber Clang / LLVM?

Jodie
quelle
3
Vor- / Nachteile für wen? LLVM ist als Backend für Compiler eindeutig überlegen, es sei denn, Sie benötigen eine lächerliche Menge unterstützter Architekturen. Aber ich nehme an, Sie sprechen über Endbenutzer.

Antworten:

19

gcc ist sehr ausgereift, einfach zu installieren (zumindest für die meisten Systeme) und der Standard-Compiler für viele Systeme. In vielen Fällen wird es also fast unbemerkt installiert. Es wurde auf eine Unmenge von Architekturen portiert, sodass es viel wahrscheinlicher ist, dass es sofort funktioniert, wenn Sie auf obskure Hardware zugreifen müssen.

Klirren ist viel neuer. Insbesondere für C ++ - Vorlagen werden häufig viel bessere Fehlermeldungen ausgegeben. In vielen Fällen läuft es viel schneller. Da es sich in erster Linie um eine Reihe von Bibliotheken handelt, gibt es eine Reihe weiterer Projekte (z. B. Code-Analysatoren), die dasselbe Front-End verwenden, dieselben Eingaben verstehen usw. Die Verwendung von llvm als Back-End bietet zusätzliche Flexibilität wie Sie daraus Code generieren.

Jerry Sarg
quelle
17
  1. Clang hat eine viel bessere Fehlerberichterstattung. Wenn Sie beispielsweise in einem Funktionsnamen, den Sie aufrufen, einen Tippfehler machen, meldet Clang, dass dies wahrscheinlich ein Tippfehler ist (und schlägt den richtigen Namen vor), während GCC sich über einen unbekannten Funktionsnamen beschwert.

  2. GCC erzeugt normalerweise schnelleren Code, wenn Sie auf x86 / x86-64 abzielen. Für ARM ist die Situation nicht eindeutig, oft optimiert Clang besser. Außerdem unterstützt AFAIK Clang keine Optimierung der Codegröße.

  3. GCC verwendet viele Heuristiken. Dies ist gut für die Leistung (in einem typischen Fall), aber schrecklich, wenn Sie eine Optimierung auf Quellenebene durchführen möchten (z. B. Loop-Unrolling). Selbst kleine Änderungen am Quellcode können dazu führen, dass GCC eine völlig andere Ausgabe generiert. Clang ist vorhersehbarer und generiert normalerweise den erwarteten Code.

  4. Im Gegensatz zu Jerry Coffin finde ich es viel schwieriger als Clang, GCC von der Quelle aus zu bauen. Das Verfahren von Clangs Getting Started- Seite funktionierte immer für mich. Ein ähnliches Handbuch für GCC hat im ersten Versuch noch nie funktioniert. GCC hat Abhängigkeiten von bestimmten Versionen von GMP, MPFR, MPC, Parma Polyhedra Library und CLooG, und ich brauchte mehrere Iterationen, um die Versionen zu finden, die für eine bestimmte GCC-Version funktionieren würden (ja, die Verwendung der neuesten Versionen dieser Bibliotheken funktioniert nicht) ).

  5. Ich habe das Gefühl, dass Clang besser getestet ist als GCC. Obwohl ich nur offizielle Releases von GCC verwende, wurde manchmal fehlerhafter Code erzeugt. Für Clang verwende ich normalerweise die Trunk-Version (wieder, weil sie einfach zu bauen ist), aber ich habe nie gesehen, dass sie eine falsche Ausgabe erzeugt.

  6. GCC ist in der Linux-Welt nahezu Standard und bietet eine Vielzahl von Sonderfunktionen, die in Linux-Software weit verbreitet sind. Clang versucht, mit GCC kompatibel zu sein, aber manchmal ignoriert es sie einfach leise. Vor allem unterstützt Clang OpenMP nicht. Es hat jedoch auch Erweiterungen, die von GCC nicht unterstützt werden, aber nützlich sein können (z. B. Add-with-Carry-Funktionen __buildin_addc).

  7. Wenn Sie nach Compilern suchen möchten oder nur neugierig sind, wie sie funktionieren, finden Sie den Clang / LLVM-Quellcode besser zugänglich. Clang / LLVM-Code ist nicht nur vom Compiler lesbar, sondern auch von Menschen lesbar.

  8. (Es gilt der AINAL-Haftungsausschluss.) Die Clang / LLVM-Lizenz gibt Ihnen mehr Freiheit darüber, was Sie mit dem Code tun können, z. B. zur Verwendung in kommerziellen oder Closed-Source-Produkten. Die Lizenz für GCC-Laufzeitbibliotheken fügt eine weitere Einschränkungsebene hinzu, während die Clang-Compiler-Laufzeit (compiler-rt library) unter der MIT-Lizenz steht.

Zusammenfassung: Kompilieren Sie mit Clang, wenn Sie das Programm entwickeln, und mit GCC für den endgültigen Build (stellen Sie jedoch sicher, dass es schneller ist und nicht kaputt geht). Bleiben Sie bei Clang / LLVM, wenn Sie nach Compilern suchen.

Marat Dukhan
quelle
Interessant, ich habe noch nie gewusst, dass Clang eine eigene Add-with-Carry-Funktion hat. Aber es sollte __builtin_addnicht sein __buildin_addc. Auf jeden Fall ist Clang intelligent genug , um zu erzeugen , addcwenn es eine große Add Verwendung Vergleichs als Hand begegnen
phuclv
Ich meine __builtin_addcnicht__buildin_addc
phuclv
Leistungsvergleiche sind hier nicht mehr aktuell. Neueren Benchmarks zufolge ist Clang in etwas mehr als der Hälfte der Tests auf x86 / 64 schneller als gcc (z. B. openbenchmarking.org/result/1605071-HA-GCCCLANG568 )
Jules
3

Wenn Sie eine neue CPU-Architektur oder neue Optimierungen haben und diese unter der GPL öffnen möchten, können Sie sie an gcc weitergeben. Da gcc jedoch weniger modular aufgebaut ist, ist möglicherweise mehr Arbeit erforderlich, um eigene Modifikationen / Ergänzungen hinzuzufügen. Wenn Sie neue Architekturen oder Optimierungen in ein Open Source-Projekt einbringen möchten, jedoch unter einer Nicht-GPL-Lizenz, können Sie diese in LLVM / clang einbringen. Es gibt Gesellschaften, deren Rechtsabteilungen nur letztere zulassen.

hotpaw2
quelle
-3

Heute (11.08.2011) unterstützt GCC wesentlich mehr C ++ 0x-Funktionen als Clang. Wenn Sie diese Funktionen möchten, ist dies ein Kinderspiel. GCC ist Ihre Wahl.

Sean McMillan
quelle
Diese Antwort ist korrekt und informativ innerhalb des Zeitrahmens, der gemäß meiner Forschung angegeben wurde.
8
Dies ist jedoch keine besonders gute Antwort, da sie ab heute (28.07.2012) nicht mehr gültig ist. Clang unterstützt mehr als GCC, wenn überhaupt.
DeadMG