Wenn clang das Front-End eines Compilers ist, warum kann dann eine ausführbare Datei erzeugt werden?

8

Eine Sache, die ich wirklich nicht verstehe, ist die Funktion von clang, wenn clang der Front-End-Teil des Compilers ist, sollte es einfach den Parser für den Quellcode arbeiten lassen, die verbleibende Arbeit wird von LLVM erledigt . Aber clang kann auch eine ausführbare Datei erzeugen. Also, wie versteht man das? Was ist die Beziehung zwischen clang und llvm?

    
storen 19.12.2014, 14:26
quelle

3 Antworten

14

Wenn Sie sehr spezifisch sind: Die ausführbare Datei clang ist ein Compiler-Treiber. Es ruft alle Teile auf, die benötigt werden, um eine ausführbare Datei zu erzeugen. Es ruft libclang auf, das die Front-End-Jobs ausführt: Parser / Lexer, die semantische Analyse, das Erstellen der AST- und Codegenerierung. Wenn der AST auf LLVM IR abgesenkt wird, werden die Front-End-Jobs ausgeführt, und der Optimierer und LLVM treten ein. Nach der Optimierung des Codes ruft der Compilertreiber das vom Ziel angegebene LLVM-Backend auf und schließlich den Linker, der die ausführbare Datei erstellt. Und deshalb kann der clang-Compiler-Treiber ausführbare Dateien erstellen.

    
Michael Haidl 19.12.2014, 15:42
quelle
2

LLVM ist ein Compiler-Backend, das vor dem clang geschrieben wurde und ursprünglich das Frontend von gcc in einem Tool namens 'llvm-gcc' verwendet hat. Clang ist der Name des Front-End-Codes, aber clang ist auch der Name eines Tools, das das clang-Frontend enthält, aber auch die gesamte Kompilierung für Sie ausführt. Spätere Phasen der Kompilierung sind entweder als Bibliotheken in das clang-Tool integriert, oder wenn sie separate ausführbare Dateien sind, weiß clang, wie sie aufgerufen werden. Mit den richtigen Befehlszeilenargumenten können Sie clang stoppen durch

  • -emit-ast führt gerade die Syntaxanalyse durch und erstellt den Abstract Syntax Tree
  • -emit-llvm erstellt die LLVM-Zwischenrepräsentation, wandelt sie jedoch nicht in Code für Ihren Computer um

Clang wird als Treiber für den gesamten Build fungieren, weil Programmierer das normalerweise wollen, die sourse analysiert, das Objekt erzeugt, die ausführbare Datei erstellt. Der abstrakte Syntaxbaum, der auf dich zurückgespuckt wird, ist ziemlich selten.

Offensichtlich ist dies die Quelle für alles LLVM Ссылка

Hier ist ein Video von Chriss Lattner, in dem erklärt wird, was LLVM Ссылка ist. Chandler Carruth hat einige Videos auf youtuble erklärt, Teile von Klängen, an denen er gearbeitet hat.

    
Christopher Ian Stern 20.12.2014 02:51
quelle
2

Es gibt 3 Bedeutungen von Clang:

  1. Das Frontend (libclang)
  2. Der Compiler Treiber (ausführbare Datei)
  3. Der traditionelle Compiler . Dazu gehört nicht nur das Front-End, sondern auch die Verwendung von Middle- und Back-End oder sogar der integrierte Assembler, um die Kompilierung zu vervollständigen. (Der Treiber besteht hauptsächlich aus Compilation und Link)
Thomson 21.12.2014 16:08
quelle