LLVM

Modulare Compiler-Unterbau-Architektur und virtuelle Maschine

LLVM(früherLow Level Virtual Machine) ist ein modularesCompiler-System mit einem virtuellenBefehlssatz,einem übergreifend optimierenden Übersetzungskonzept und einervirtuellen Maschine,die einenHauptprozessorvirtualisiert.[10]LLVM kann zur Entwicklung von Frontends für beliebigeProgrammiersprachenund Backends für beliebigeBefehlssatzarchitekturenverwendet werden.

The LLVM Compiler Infrastructure
Basisdaten

Hauptentwickler Chris Lattner[1]
Entwickler The LLVM Team[2]
Erscheinungsjahr 24. Oktober 2003[3]
AktuelleVersion 19.1.3[4]
(30. Oktober 2024)
Betriebssystem Plattformunabhängig,NetBSD,FreeBSD,OpenBSD,Linux,MINIX 3,Microsoft Windows,illumos
Programmier­sprache C++[5],C[6],Assemblersprache[7]
Kategorie Compiler
Lizenz University of Illinois/NCSA Open Source License[8],Apache License v2.0 with LLVM Exceptions[9]
deutschsprachig nein
www.llvm.org

Kennzeichnend für LLVM ist unter anderem, dass sämtliche Zeitphasen einesProgrammablaufsinklusive desLeerlaufprozesses[11]zur Optimierung herangezogen werden können.

LLVM ist alsfreie Softwareunter derUniversity of Illinois/NCSA Open Source Licenseverfügbar, die der 3-Klausel-BSD-Lizenzund derMIT-Lizenzähnelt.

Geschichte

Bearbeiten

Die Entwicklung von LLVM begann im Jahr 2000 unter der Leitung vonChris LattnerundVikram Advean derUniversität von Illinois.Das Projekt wurde ursprünglich als Forschungsarbeit zur Untersuchung dynamischer Kompilierung und Optimierungen entwickelt. Heute beheimatet es eine Vielzahl an Unterprojekten und Erweiterungen aus der aktuellen Compilerforschung und -entwicklung.[1][12][13]

„LLVM “ist heute der volle Name des Projekts und kein Akronym.[1]LLVM wurde früher als „Low Level Virtual Machine “übersetzt, was für Verwirrung sorgt. Mit der Zeit wurde LLVM ein Rahmenprojekt, in dem verschiedene Compiler- und Low-Level-Techniken enthalten sind. Inzwischen istLLVMdie Marke für das eigentliche Projekt, die LLVM-Zwischensprache (LLVM-IR), den LLVM-Debugger(LLDB), die LLVM-Standard-C++-Bibliothek (libc++) etc.

Arbeitsweise

Bearbeiten

HerkömmlicheCompilersystemeführen Optimierungsvorgänge meist beim Kompilieren durch und verbinden die kompilierten Module dann miteinander. Dieser zweite Vorgang wird Binden oder auchLinkengenannt und bietet ebenfalls Optimierungsmöglichkeiten, die bisher wenig genutzt wurden, da der Linker nur die einzelnen Module sieht und nicht das gesamte Programm. Hier setzt LLVM an, indem es einen nach Vorbild derRISC-Befehlssätze gestalteten virtuellenBytecodeerstellt, der während des Linkens mit dem eigenen Linkerlld[14]noch einmal optimiert werden kann.[10][15]

Ein Teil der Architektur von LLVM basiert auf einer virtuellen Maschine, die einen Prozessor virtualisiert. Ein Prozessor kann dabei nicht nur einHauptprozessor(CPU) sein, sondern auch einGrafikprozessor(GPU). Die virtuelle Maschine ist in der Lage, die intern generierte Sprache (sog.intermediate language) des Compilers (LLVM Assembly Language)[16]während der Ausführung für den Prozessor des aktuellen Systems zu übersetzen. Kennzeichnend ist hierbei, dass sie hocheffizient ist, was die Übersetzung auch Just-in-Time (also auf Anforderung, bei Bedarf) ermöglicht, und diese mit einer Größe von nur 20 kB extrem kompakt ist, wodurch die Ausführung auch auf einfachen Prozessoren, älteren Grafikprozessoren (GPUs) oder Embedded-CPUs, und insbesondere sogar direkt imCachemöglich ist.

Über ein flexibles LLVM-Backend ist es möglich, eine fast beliebige Vielzahl unterschiedlichster Prozessor-Architekturen zu unterstützen.[17]

Die LLVM-Bibliotheken können von Compilerprojekten, denen das Schreiben eines eigenen Codegenerators zu aufwendig wäre, eingesetzt werden, um auf einfache WeiseMaschinencode(Bitcode, Microcode) zu erzeugen. Zum Beispiel muss das Compiler-FrontendClang,welches Bestandteil von LLVM ist, nur den C- bzw. C++-Code parsen und in die LLVM-Zwischensprache (LLVM Intermediate Representation, LLVM IR) übersetzen. Das Erzeugen von effizientem Maschinencode kann dem LLVM-Backend überlassen werden. Bei diesem Beispiel kommt die virtuelle Maschine nicht zum Einsatz, da LLVM hier nur als Compiler-Backend für die jeweilige Architektur (x86, PowerPC, IA64,…) agiert.[18]

Der LLVM-Compiler verwendet ab Version 2.9 primärClangalsFrontend.Dabei eignet sich LLVM dazu, Programme, die in frei wählbaren Programmiersprachen geschrieben wurden, zu kompilieren. Derzeit kann Programmcode unter anderem in denProgrammiersprachenC,C++,Objective-C,Swift,Java,Delphi,Julia,D,Ada,Fortran,Haskell,Dylan,Gambas,Python,Ruby,Rust,ActionScript,Vala,Zig,Genie undGLSLkompiliert werden.

Mit LLVM lassen sichvirtuelle Maschinenfür Sprachen wie Java, plattformspezifische Codegeneratoren und von Sprache und Plattform unabhängige Optimierer erstellen. Die LLVM-Zwischenschicht (IR) liegt zwischen sprachspezifischen Modulen und den jeweiligen Codegeneratoren und kann als eine Art plattformunabhängige Assemblersprache betrachtet werden. LLVM unterstützt weiterhin dynamische,interprozeduraleOptimierung sowie statischeAhead-of-time-undJust-in-time-Kompilierung.[17]Ein Beispiel für LLVM-IR:

;String-Konstante als globale Konstante deklarieren
@.str=privateunnamed_addrconstant[13xi8]c"hello world\0A\00"

;Externe Deklaration der `puts()`-Funktion (enthalten in libc)
declarei32@puts(i8*nocapture)nounwind

;Definition der `main()`-Funktion
definei32@main(){;i32()*
;Konvertiere [13 x i8]* zu i8 *... (Pointer auf i8-Elemente)
%cast210=getelementptr[13xi8]*@.str,i640,i640

;Rufe `puts()`-Funktion auf, um Text auszugeben
calli32@puts(i8*%cast210)
reti320
}

;Metadaten
!1=metadata!{i3242}
!foo=!{!1,null}

Clang ist ein für LLVM entwickeltesFrontend,das fürC-ähnliche Sprachen optimiert ist. Es ermöglicht gegenüber demGCC-Oberbau vor allem schnellere Übersetzungsläufe mit geringerem Speicherverbrauch und als Ergebnis oft kleinereausführbare Dateien.Zudem verfügt es über umfangreichere und genauere statische Analysemethoden, die dem Entwickler z. B. die Fehlersuche erleichtern. Die Unterstützung der ProgrammierspracheC++gilt ab Version 2.7 als stabil.[19]

Seit September 2009 gilt Clang offiziell als stabil und produktiv verwendbar. Ab LLVM Version 2.6 befindet es sich als fester Bestandteil im LLVM-Compiler-Paket.[20]Clang lässt sich aber auch ohne LLVM als rein statisches Codeanalyse- und Debug-Werkzeug, zum Beispiel beim Einsatz mit anderen Compilern, verwenden.[21]Clang ist seit 2013 zurstatischen Code-Analysein die EntwicklungsumgebungXcodevon Apple für die Programmiersprachen C, Objective-C und C++ integriert.

LLDB ist ein auf Techniken des LLVM-Projektes aufbauender und für C-basierte Sprachen optimierter, modularer und hochdynamischerDebugger.Er soll besonders speichereffizient und zugleich extrem leistungsfähig und schnell sein. Er verfügt über eine Plug-In-Schnittstellezum Beispiel für die Unterstützung anderer Programmiersprachen. Zudem lassen sich Aufgaben mit Hilfe vonPythonautomatisieren. Zu den Zielsetzungen zählt eine umfassende Unterstützung für das Debuggen vonMultithreading-Code.[22][23]

DragonEgg

Bearbeiten

Bei DragonEgg handelt es sich um ein LLVM-Plugin für die GNU Compiler Collection (ab Version 4.5).[24]Dieses ermöglicht es, LLVM optional als Compiler-Backend einer ungepatchten GCC-Installation zu nutzen. DragonEgg wurde zu Beginn der Entwicklung nur als „the gcc plugin “bezeichnet. DragonEgg löst die bisher häufig verwendete LLVM-GCC-Mischkonfiguration ab.

Hierbei handelt es sich um einen modifizierten Zweig (Fork) der LLVM-VM, welche die direkte Ausführung von Java- undCIL-Bytecode(.Net-Framework/Mono) ermöglicht. Der Compiler beziehungsweise Linker kann das hochkompakte vmkit (ca. 20 kB) vor den Java- oder CIL-Bytecode packen und ausführen, wodurch die Ausführung auf beliebigen Prozessorarchitekturen und auf Systemen ohne vorherige Installation von Java oder.NET möglich ist. Das Projekt wird allerdings derzeit nicht mehr offiziell unterstützt.[25]

Mit KLEE kann man Programmeunüberwachtund automatisch auf Programmfehler untersuchen lassen. Dabei wird das Programm Schritt für Schritt ausgeführt. Statt konkreter Werte werden Eingabe und Zwischenresultatesymbolischverwendet und jeweils gespeichert, welche Werte diese haben könnten. Dabei wird bei „gefährlichen Operationen “(englisch: „dangerous operations “, zum Beispiel Divisionen oder Speicherzugriffe per Zeiger) geprüft, ob sie einen Fehler erzeugen könnten, zum Beispiel eine Division durch null oder einen Zugriff auf nicht reservierten Speicher. KLEE gibt dann aus, bei welcher Eingabe das Programm den Fehler erzeugt und welcher Pfad durch den Quellcode dabei genommen wird.[26]

Unterstützte Architekturen

Bearbeiten

LLVM unterstützt eine große Anzahl vonProzessorarchitekturen:

Jedoch gibt es noch einige Einschränkungen. Das Frontend (llvm-gcc) ist noch nicht für jede Plattform lauffähig. Dies kann umgangen werden, indem die LLVM alsCross-Compilerdient. Hier sollten eventuelle Abhängigkeiten, zum Beispiel dieProgrammbibliothek,berücksichtigt werden.[17]

Geschichte

Bearbeiten

Das Projekt startete 2000 an derUniversity of Illinois at Urbana–Champaignals Studienprojekt von Vikram Adve und Chris Lattner. Als die FirmaAppledarauf aufmerksam wurde, stellte sie 2005 ein festes Entwicklerteam für die Weiterentwicklung von LLVM zusammen und stellte Chris Lattner als dessen Projektleiter an.[27]LLVM ist seit Juli 2008 Standardcompiler in Apples EntwicklungsumgebungXcode.[28]Ab Version 2.6 vom Oktober 2009 ist das Compiler-FrontendClangintegraler Bestandteil von LLVM.[29][30]

2011 erhielt LLVM denProgramming Languages Software Awardvon ACM SIGPLAN.

Aktuelle Entwicklung

Bearbeiten

Viele weitere Komponenten befinden sich derzeit in intensiver Entwicklung, unter anderemFrontendsfür Java-Bytecode,OpenCL,MicrosoftsCIL,Python,Lua,PHP,Ruby,Mono[31]und AdobeActionScript.[13][32]Der LLVM-JIT-Compilerkann ungenutzte statische Zweige des Programms zur Laufzeit erkennen und anschließend entfernen. Dies optimiert Programme mit einem hohen Grad an Verzweigung. Aus diesem Grund nutzt Apple seitmacOS10.5[33]LLVM imOpenGL-Stack, um einerseits sich selten ändernde Verzweigungspfade zu verkürzen und andererseits Vertex-Shader optimieren zu lassen.

Bearbeiten

Einzelnachweise

Bearbeiten
  1. abcThe LLVM Compiler Infrastructure Project(englisch) – offizielle Webseite
  2. llvm.org
  3. Chris Lattner:The LLVM 1.0 Release is finally available!
  4. LLVM 19.1.3.30. Oktober 2024 (abgerufen am 30. Oktober 2024).
  5. The llvm Open Source Project on Open Hub: Languages Page.In:Open Hub.(abgerufen am 18. Juli 2018).
  6. The llvm Open Source Project on Open Hub: Languages Page.(englisch, abgerufen am 27. Juli 2018).
  7. The llvm Open Source Project on Open Hub: Languages Page.(englisch, abgerufen am 27. Juli 2017).
  8. License.(englisch, abgerufen am 27. Juli 2018).
  9. github.com.19. Januar 2019.
  10. abllvm.org
  11. llvm.org
  12. llvm.org
  13. abThe LLVM Users.llvm.org
  14. https://lld.llvm.org/LLD - The LLVM Linker
  15. Hans-Joachim Baader:LLVM 1.5 freigegeben.In:Pro-Linux.20. Mai 2005,abgerufen am 5. Dezember 2010(englisch).
  16. llvm.org
  17. abcLLVM Features.llvm.org
  18. LLVM.aosabook.org
  19. clang: a C language family frontend for LLVM.LLVM; Stand: 18. Oktober 2010
  20. LLVM 2.6 Release!.(Mementovom 11. Januar 2012 imInternet Archive) lists.cs.uiuc.edu, 23. Oktober 2009 (englisch)
  21. Expressive Diagnostics.LLVM; Stand: 27. November 2009 (englisch)
  22. The LLDB Debugger Goals.lldb.llvm.org
  23. Chris Lattner:New “lldb” Debugger.blog.llvm.org
  24. dragonegg.llvm.org
  25. vmkit.llvm.org
  26. Cristian Cadar, Daniel Dunbar, Dawson Engler:KLEE: Unassisted and Automatic Generation of High-Coverage Tests for Complex Systems Programs.Universität Stanford, 2008.
  27. Adam Treat:mkspecs and patches for LLVM compile of Qt4.In:Qt4-preview-feedback-Mailingliste.19. Februar 2005, archiviert vomOriginalam4. Oktober 2011;abgerufen am 5. Dezember 2010(englisch).
  28. developer.apple.com
  29. Chris Lattner:LLVM 2.6 Release!In:llvm-announce mailing list.23. Oktober 2009, archiviert vomOriginalam11. Januar 2012;abgerufen am 5. Dezember 2010(englisch).
  30. Hans-Joachim Baader:LLVM 2.6 freigegeben.In:Pro-Linux.26. Oktober 2009,abgerufen am 5. Dezember 2010.
  31. mono-project.com
  32. Developing for the Apple iPhone using Flash.(Mementovom 19. Dezember 2009 imInternet Archive) adobe.com
  33. [LLVMdev] A cool use of LLVM at Apple: the OpenGL stack.(Mementovom 4. November 2006 imInternet Archive)