LLVM vs Clang unter OS X.

133

Ich habe eine Frage zu llvm, clang und gcc unter OS X.

Was ist der Unterschied zwischen llvm-gcc 4.2, llvm 2.0 und clang? Ich weiß, dass sie alle auf llvm aufbauen, aber wie unterscheiden sie sich?

Was ist neben dem schnelleren Kompilieren der Vorteil von llvm gegenüber gcc?

dominik
quelle
9
llvm ist nur ein Backend, es kann keinen eigenständigen llvm-Compiler geben ... es gibt nur verschiedene Frontends dafür, wie gcc und clang.
smerlin
4
@smerlin: "llvm compiler" ist Apples Handelsname für clang + llvm: developer.apple.com/technologies/tools/…
Stephen Canon
Weitere Details hier: stackoverflow.com/a/26724886/1938163
Marco A.

Antworten:

201

LLVM stand ursprünglich für "Low-Level Virtual Machine", obwohl es jetzt nur für sich selbst steht, da es sich zu etwas anderem als einer herkömmlichen virtuellen Maschine entwickelt hat. Es handelt sich um eine Reihe von Bibliotheken und Tools sowie eine standardisierte Zwischendarstellung, mit deren Hilfe Compiler und Just-in-Time-Compiler erstellt werden können. Es kann nichts anderes als seine eigene Zwischendarstellung selbst zusammenstellen; Dazu benötigt es ein sprachspezifisches Frontend. Wenn sich die Leute nur auf LLVM beziehen, meinen sie wahrscheinlich nur die Bibliothek und die Tools auf niedriger Ebene. Einige Leute bezeichnen Clang oder llvm-gcc möglicherweise fälschlicherweise als "LLVM", was zu Verwirrung führen kann.

llvm-gcc ist eine modifizierte Version von GCC, die LLVM als Backend anstelle von GCC verwendet. Es ist jetzt veraltet, zugunsten von DragonEgg, das das neue Plugin-System von GCC verwendet, um dasselbe zu tun, ohne GCC zu verzweigen.

Clang ist ein völlig neuer C / C ++ / Objective-C-Compiler, der sein eigenes Frontend und LLVM als Backend verwendet. Die Vorteile sind bessere Fehlermeldungen, eine schnellere Kompilierungszeit und eine einfachere Möglichkeit für andere Tools, sich in den Kompilierungsprozess einzubinden (wie den LLDB-Debugger und den statischen Clang-Analysator ). Es ist auch einigermaßen modular aufgebaut und kann daher als Bibliothek für andere Software verwendet werden, die C-, C ++ - oder Objective-C-Code analysieren muss.

Jeder dieser Ansätze (einfaches GCC, GCC + LLVM und Clang) hat seine Vor- und Nachteile. Die letzten Benchmarks, die ich gesehen habe, haben gezeigt, dass GCC in den meisten Testfällen etwas schnelleren Code erzeugt (obwohl LLVM in einigen Fällen einen leichten Vorteil hatte), während LLVM und Clang signifikant bessere Kompilierungszeiten lieferten. GCC- und GCC / LLVM-Kombinationen haben den Vorteil, dass viel mehr Code getestet wurde und mit der GCC-Variante von C arbeitet. Es gibt einige compilerspezifische Erweiterungen, die nur GCC hat, und einige Stellen, an denen der Standard die Implementierung der Implementierung zulässt, der Code jedoch von einer bestimmten Implementierung abhängt. Es ist viel wahrscheinlicher, dass es in GCC funktioniert, wenn Sie eine große Menge alten C-Codes erhalten, als in Clang, obwohl sich dies im Laufe der Zeit verbessert.

Brian Campbell
quelle
13
Um diese wunderbare Antwort zu ergänzen: clang ist auch eine Reihe von Bibliotheken (libclang genannt), die Sie für Dinge wie Codeanalyse, automatische Vervollständigung, Syntaxhervorhebung usw. verwenden können. Dies ist sehr praktisch für IDEs.
5
Berücksichtigen Sie beim Erstellen für MacOS X oder iOS, dass Clang die Software ist, mit der Apple die gesamte MacOS X- und iOS-Software einschließlich des Betriebssystems erstellt, und dass Clang das ist, was Sie automatisch, ohne Aufwand und für alle Benutzer erhalten um Hilfe bitten ist mit. Apple hat gcc nach gcc 4.2 noch nie unterstützt und liefert keine Version von gcc mehr aus.
Gnasher729
1
@ gnasher729 Ja, diese Antwort wurde vor 3 Jahren geschrieben, als Apple noch llvm-gcc und Clang mit llvm-gcc als Standard-Compiler auslieferte. Die Zeiten haben sich seitdem geändert.
Brian Campbell
54

Hier gibt es zwei verschiedene Dinge.

LLVM ist ein Backend-Compiler, der darauf aufbauen soll. Es befasst sich mit Optimierungen und der Erstellung von Code, der an die Zielarchitektur angepasst ist.

CLang ist ein Frontend, das C-, C ++ - und Objective C-Code analysiert und in eine für LLVM geeignete Darstellung übersetzt.

llvm gcc war eine erste Version eines llvm-basierten C ++ - Compilers auf Basis von gcc 4.2, der jetzt veraltet ist, da CLang alles analysieren kann, was es analysieren kann, und vieles mehr.

Schließlich liegt der Hauptunterschied zwischen CLang und gcc nicht im erzeugten Code, sondern im Ansatz. Während gcc monolithisch ist, wurde CLang als Suite von Bibliotheken erstellt. Dieser modulare Aufbau bietet beispielsweise große Wiederverwendungsmöglichkeiten für IDE- oder Vervollständigungstools.

Im Moment ist der von gcc 4.6 erzeugte Code im Allgemeinen etwas schneller, aber CLang schließt die Lücke.

Matthieu M.
quelle
5

llvm-gcc-4.2 verwendet das GCC-Frontend, um Ihren Code zu analysieren, und generiert dann die kompilierte Ausgabe mit LLVM.

Der "llvm compiler 2.0" verwendet das Clang-Frontend, um Ihren Code zu analysieren, und generiert die kompilierte Ausgabe mit LLVM. "clang" ist eigentlich nur der Name für dieses Frontend, wird aber häufig beiläufig als Name für den gesamten Compiler verwendet.

Stephen Canon
quelle