Verständnis g++ vs clang vs llvm
Kann mir jemand helfen zu verstehen, die Beziehung zwischen einigen der neueren compiler-Technologien? Was genau sind LLVM und clang, und wie stehen Sie in Verbindung mit gcc/g++?
- Sie sind back - und front-ends der jeweiligen Systeme, und Sie haben keinen Bezug zu einander.
- das war nicht sehr hilfreich. Was ist ein backend (ich nehme an, das bedeutet, dass code-Generierung und Anbindung), das ist ein frontend (ich nehme an, das bedeutet, dass compiler-Treiber), und was ist die motivation für diese im Vergleich zu bestehender front - und backends? Ich würde auch meinen, dass, während die gcc ausführbare Datei ist streng genommen nur ein frontend ist es auch üblich ist, die ganze toolchain von der Quelle zum ausführbaren Datei "gcc". Wäre das nicht der Fall sein, die mit anderen Compilern zu?
Du musst angemeldet sein, um einen Kommentar abzugeben.
GCC ist eine große Tasche von software. Der typische Prozess, so wie ich es verstehe, ist für ein GCC-frontend zu lex und analysieren den code, konvertieren zu einer GCC-internal Register-Transfer-Sprache, und dann für ein backend zu schreiben, die nativen code.
So eine typische Strömung ist: C-code ---> GCC-C-frontend ---> RTL ---> GCC-x86-backend ---> x86-Maschinencode.
GCC unterstützt mehrere frontends: C, C++, Java, Objective-C, Go, und Fortran.
GCC unterstützt mehrere backends: 32-bit x86, 64-bit-x86 little endian ARM, big endian ARM, MIPS, SPARC, PowerPC, etc.
Frontends konvertieren von text zu RTL, backends konvertieren der RTL-Computer-code von einigen Sortieren.
LLVM ist ein Mitte-Ebene-Maschine-Agnostiker-Berechnung, Darstellung, ähnlich wie im Konzept der GCC-RTL. Es ist seine eigene Art-system und Befehlssatz namens LLVM Intermediate Representation (IR). Wenn ich das richtig verstehe, LLVM-IR-reicher, ausdrucksstärker und viel flexibler als GCC ist RTL, das Ihnen viele Vorteile. Compiler-frontends für LLVM für viele verschiedene Sprachen können alle kompilieren nach unten zu LLVM IR. Dies kann verwendet werden, für die 'konventionellen' Programmiersprachen wie C, C++, Java, etc., aber es kann auch verwendet werden, für die "unkonventionelle" Programmier-Aufgaben wie GPU-Shadern oder sql-Abfragen
LLVM ist, vielleicht, zwei Sachen dann. LLVM-die-Maschine, die das Typ-system und Befehlssatz, die wohl besser bezeichnet als "LLVM-IR"; und LLVM-der-API, die software für die Manipulation von code für die LLVM IR, wie die LLVM-JIT-compiler, oder vielleicht die LLVM-x86-Maschinencode-backend.
Clang ist ein Frontend für LLVM, dass die Prozesse der C-Familie von Sprachen: C, C++, Objective C, Objective C++. Das Geräusch wandelt C/C++/etc zu LLVM-IR, LLVM führt Optimierungen auf der IR, und die LLVM-x86-backend schreibt x86-Maschinencode für die Ausführung.
Trotz des namens LLVM ist keine Virtuelle Maschine im herkömmlichen Sinne - es ist ein Berechnungs-Modell und die Darstellung, dass sich besonders gut auf die Aufgabe der Manipulation code.
Teil des LLVM Popularität kommt von der Tatsache, dass es sich um eine voll vergegenständlicht compiler-API. Es kann verwendet werden für das durchführen einer statischen Analyse von code ("dieser code jemals versehentlich einen nicht-initialisierten Speicher?"), Optimierung, code-Analyse (z.B. für Gebäude, IDEs). GCC-Interna sind sehr stark gekoppelt ist, und so mit dem GCC Compiler in dieser Art und Weise ist unglaublich schwierig. Ein Beispiel dafür ist, dass der GCC-frontends führen einige Optimierungen während der Analyse, so ist es nicht möglich, immer eine perfekte Darstellung von code-als-eingegeben, für zB das melden von Fehlern und durchführen von kringel-line-syntax-Hervorhebung, da einige Informationen möglicherweise verloren gewesen.
Als ich verstehen es, das Geräusch und bewahrt den nicht optimierten analysiert syntax, die es möglich machen, die für 3rd-party-tools zu verwenden, dessen Ausgang gleichsetzen und Transformationen zurück zu den ursprünglichen text, vor allem, Klammerten sich die Fehler-Meldungen sind viel hilfreicher, denn Sie können markieren Sie die genaue Teil der Zeile, in Frage stellen.