Was genau ist LLVM?


Antworten:


369

LLVM ist eine Bibliothek, die zum Erstellen, Optimieren und Produzieren von Zwischen- und / oder binärem Maschinencode verwendet wird.

LLVM kann als Compiler-Framework verwendet werden, in dem Sie das "Front-End" (Parser und Lexer) und das "Back-End" (Code, der die Darstellung von LLVM in tatsächlichen Maschinencode konvertiert) bereitstellen.

LLVM kann auch als JIT-Compiler fungieren - es unterstützt die Generierung von x86 / x86_64- und PPC / PPC64-Assemblys mit schnellen Codeoptimierungen, die auf die Kompilierungsgeschwindigkeit abzielen.

Wenn Sie interessiert sind, können Sie mit dem Maschinencode von LLVM spielen, der aus C- oder C ++ - Code auf der Demoseite generiert wird. Die Demoseite ist jedoch seit dem Jahr 2013 deaktiviert.


39
Wenn Sie damit spielen möchten, schauen Sie sich diesen erstaunlichen Artikel an: gnuu.org/2009/09/18/writing-your-own-toy-compiler
LiraNuna

29
Der in der Antwort angegebene Link lautet "Die LLVM-Demoseite ist derzeit deaktiviert."
EngrStudent

5
ellcc.org/demo/index.cgi ist eine weitere Möglichkeit, C / C ++ über LLVM zu verschiedenen Zielen zu kompilieren, einschließlich Zwischencode
Tom Goodfellow

1
Können Sie ein konkretes Beispiel dafür geben, was es bedeutet?
Migrate2Lazarus siehe mein Profil

112

Eine gute Zusammenfassung von LLVM lautet:

Geben Sie hier die Bildbeschreibung ein

Am Frontend haben Sie Perl und viele andere Hochsprachen. Im Backend befindet sich der native Code, der direkt auf dem Computer ausgeführt wird.

Im Zentrum steht Ihre Zwischencodedarstellung. Wenn jede Hochsprache in diesem LLVM-IR-Format dargestellt werden kann, können auf dieser IR basierende Analysewerkzeuge leicht wiederverwendet werden - das ist die grundlegende Begründung.


39
Bild sagt mehr als tausend Worte 👍
ipatch

3
Es scheint also, dass LLVM für Compiler-Designer nützlich ist. Sollte es einem Programmierer etwas ausmachen, wenn er mit einem Standard-Compiler oder einem auf LLVM basierenden kompiliert und den generierten Code unabhängig vom Quellcode analysiert?
Jinawee

4
Wenn Sie mit LLVM zu seiner IR kompilieren können, stehen Ihnen möglicherweise viele Tools zur Analyse der IR zur Verfügung. Wenn Ihr Tool jedoch nur die nativen Binärdateien analysieren kann (z. B. x86), spielt es keine Rolle, ob es sich um LLVM-generierte Binärdateien oder gcc-generierte Binärdateien oder Intel-Compiler-generierte Binärdateien handelt.
Peter Teoh

73

LLVM (früher "Low Level Virtual Machine", aber nicht mehr) ist eine in C ++ geschriebene Compiler-Infrastruktur, die für die Optimierung von geschriebenen Programmen zur Kompilierungs-, Link-, Laufzeit- und Leerlaufzeitoptimierung ausgelegt ist in beliebigen Programmiersprachen. Ursprünglich für C / C ++ implementiert, hat das sprachunabhängige Design (und der Erfolg) von LLVM seitdem eine Vielzahl von Frontends hervorgebracht, darunter Objective C, Fortran, Ada, Haskell, Java-Bytecode, Python, Ruby, ActionScript und GLSL , und andere.

Lesen Sie dies für weitere Erklärungen. Schauen
Sie sich auch Unladen Swallow an


13
.. also was die Dokumente zu sagen versuchen; Während LLVM eine Abkürzung für Low Level Virtual Machine ist , heißt das Projekt einfach LLVM und nicht die vollständig geschriebenen Wörter.
Jochem Kuijpers

2
Früher hatte es über Abkürzung, aber später entfernt en.wikipedia.org/wiki/LLVM
VVB

2
Um die Kommentare zusammenzufassen. "Die Low Level Virtual Machine (LLVM)" sollte so etwas wie "LLVM (was" Low Level Virtual Machine "früher in der
Projektlaufzeit bedeutete

52

Gemäß dem Buch „Erste Schritte mit LLVM-Kernbibliotheken“ (c):

Tatsächlich kann sich der Name LLVM auf eine der folgenden Angaben beziehen:

  • Das LLVM-Projekt / die LLVM-Infrastruktur: Dies ist ein Dach für mehrere Projekte, die zusammen einen vollständigen Compiler bilden: Frontends, Backends, Optimierer, Assembler, Linker, libc ++, Compiler-RT und eine JIT-Engine. Das Wort "LLVM" hat diese Bedeutung beispielsweise im folgenden Satz: "LLVM besteht aus mehreren Projekten".

  • Ein LLVM-basierter Compiler: Dies ist ein Compiler, der teilweise oder vollständig mit der LLVM-Infrastruktur erstellt wurde. Beispielsweise kann ein Compiler LLVM für das Frontend und das Backend verwenden, jedoch GCC- und GNU-Systembibliotheken verwenden, um die endgültige Verknüpfung durchzuführen. LLVM hat diese Bedeutung im folgenden Satz, zum Beispiel: "Ich habe LLVM verwendet, um C-Programme auf einer MIPS-Plattform zu kompilieren".

  • LLVM-Bibliotheken: Dies ist der wiederverwendbare Codeteil der LLVM-Infrastruktur. Zum Beispiel hat LLVM diese Bedeutung im Satz: "Mein Projekt verwendet LLVM, um Code über sein Just-in-Time-Kompilierungsframework zu generieren."

  • LLVM-Kern: Die Optimierungen auf der Ebene der Zwischensprache und die Backend-Algorithmen bilden den LLVM-Kern, in dem das Projekt gestartet wurde. LLVM hat diese Bedeutung im folgenden Satz: "LLVM und Clang sind zwei verschiedene Projekte".

  • Das LLVM-IR: Dies ist die Zwischendarstellung des LLVM-Compilers. LLVM hat diese Bedeutung, wenn es in Sätzen wie "Ich habe ein Frontend erstellt, das meine eigene Sprache in LLVM übersetzt" verwendet wird.


35

LLVM ist im Grunde eine Bibliothek, die zum Erstellen von Compilern und / oder sprachorientierter Software verwendet wird. Das Wesentliche ist, dass Sie zwar gcc haben, die wahrscheinlich die häufigste Suite von Compilern ist, diese jedoch nicht für die Wiederverwendung entwickelt wurde, d. H. Es ist schwierig, Komponenten aus gcc zu entnehmen und damit eine eigene Anwendung zu erstellen. LLVM behebt dieses Problem gut, indem es eine Reihe von "modularen und wiederverwendbaren Compiler- und Toolchain-Technologien" erstellt, mit denen jeder Compiler und sprachorientierte Software erstellen kann.


6
LLVM ist also die Bibliothek und Clang ist der Compiler?
Abdul

11
Clang ist der C / C ++ - Frontend-Compiler von LLVM. Es konvertiert C-Code in LLVM-Bitcode, der von einem Backend-Compiler in eine Assemblersprache übersetzt wird.
Boris Mulder

6

Die LLVM-Compiler-Infrastruktur ist besonders nützlich, um Optimierungen und Transformationen für Code durchzuführen. Es besteht auch aus einer Reihe von Tools, die unterschiedliche Verwendungszwecke erfüllen. llvm-prof ist ein Profiling-Tool, mit dem Sie die Ausführung profilieren können, um Programm-Hotspots zu identifizieren. Opt ist ein Optimierungstool, das verschiedene Optimierungsdurchläufe bietet (z. B. Eliminierung von totem Code).

Wichtig ist, dass LLVM Ihnen die Bibliotheken zur Verfügung stellt, mit denen Sie Ihre eigenen Pässe schreiben können. Wenn Sie beispielsweise eine Bereichsprüfung für bestimmte Argumente hinzufügen müssen, die an bestimmte Funktionen eines Programms übergeben werden, reicht es aus, einen einfachen LLVM-Pass zu schreiben.

Weitere Informationen zum Schreiben Ihres eigenen Passes finden Sie unter http://llvm.org/docs/WritingAnLLVMPass.html

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.