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?
Antworten:
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.
quelle
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.
quelle
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.
quelle