archetype | title | author | readings | outcomes | attachments | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
lecture-bc |
LLVM als IR |
BC George (HSBI) |
|
|
|
::: slides
:::
Es ist ein neuer Prozessor entwickelt worden mit einem neuen Befehlssatz, und es sollen für zwei Programmiersprachen Compiler entwickelt werden, die diesen Befehlssatz als Ziel haben.
Was tun?
:::notes Hier entsteht ein Tafelbild. :::
- ursprünglich: Low Level Virtual Machine
- Open-Source-Framework
- zur modularen Entwicklung von Compilern u. ä.
- für Frontends für beliebige Programmiersprachen
- für Backends für beliebige Befehlssatzarchitekturen
"Macht aus dem Zwischencode LLVR IR automatisch Maschinencode oder eine VM."
- ein virtueller Befehlssatz
- ein virtuelle Maschine
- LLVM IR: eine streng typisierte Zwischensprache
- ein flexibel konfigurierbarer Optimierer
- ein Codegenerator für zahlreiche Architekturen
- LMIR: mit Dialekten des IR arbeiten
- Debugger
- JIT-Systeme (virtuelle Maschine)
- AOT-Compiler
- virtuelle Maschinen
- Optimierer
- Systeme zur statischen Analyse
- etc.
mit entkoppelten Komponenten, die über APIs kommunizieren (Modularität)
- (mit Generatoren) ein Frontend entwickeln, das Programme über einen AST in LLVM IR übersetzt
- mit LLVM den Zwischencode optimieren
- mit LLVM Maschinencode oder VM-Code generieren
n Sprachen für m Architekturen übersetzen:
- n Frontends entwickeln
- Optimierungen spezifizieren
- m Codegeneratoren spezifizieren
statt n x m Compiler zu schreiben.
Adobe\ \ \ AMD\ \ \ Apple\ \ \ ARM\ \ \ Google
IBM\ \ \ \ Intel\ \ \ \ Mozilla\ \ \ Nvidia\ \ \ Qualcomm
Samsung\ \ \ \ ...
Für folgende Sprachen gibt es Compiler oder Anbindungen an LLVM (neben Clang): \bigskip
Crack\ \ \ Go\ \ \ Haskell\ \ \ Java\ \ \ Julia\ \ \ Kotlin
Lua\ \ \ Numba\ \ \ Python\ \ \ Ruby\ \ \ Rust\ \ \ Swift\ \ \ ...
\bigskip
Für weitere Projekte siehe Projects built with LLVM
x86\ \ \ AMD64\ \ \ PowerPC\ \ \ PowerPC 64Bit\ \ \ Thumb
SPARC\ \ \ Alpha\ \ \ CellSPU\ \ \ PIC16\ \ \ MIPS
MSP430\ \ \ System z\ \ \ XMOS\ \ \ Xcore\ \ \ ...
- Der LLVM-Kern incl. Optimierer
- MLIR für IR-Dialekte
- Der Compiler Clang
- Die Compiler-Runtime-Bibliothek
LLVM Core: Optimierer und Codegenerator für viele CPU- und auch GPU-Architekturen
- Optimierer arbeitet unabhängig von der Zielarchitektur (nur auf der LLVM IR)
- sehr gut dokumentiert
- verwendete Optimierungspässe fein konfigurierbar
- Optimierer auch einzeln als Tool
opt
aufrufbar - wird für eigene Sprachen als Optimierer und Codegenerator eingesetzt
- zur Reduzierung der Codegröße
- zur Generierung von möglichst schnellem Code
- Zur Generierung von Code, der möglichst wenig Energie verbraucht
- Teil von LLVM Core
- kann zur Compilezeit, Linkzeit und Laufzeit eingesetzt werden
- nutzt auch Leerlaufzeit des Prozessors
- läuft in einzelnen unabhängig konfigurierbaren Pässen über den Code
- Dead Code Elimination
- Aggressive Dead Code Elimination
- Dead Argument Elimination
- Dead Type Elimination
- Dead Instruction Elimination
- Dead Store Elimination
- Dead Global Elimination
- Framework zur Definition eigener Zwischensprachendialekte
- zur high-level Darstellung spezieller Eigenschaften der zu übersetzenden Sprache
- erleichtert die Umsetzung des AST in Zwischencode
- z. B. für domänenspezifische Sprachen (DSLs)
- z. B. für bestimmte Hardware
- mehrere Abstraktionen gleichzeitig benutzbar
Clang: schneller C/C++/Objective-C - Compiler auf Basis von LLVM mit aussagekräftigen Fehlermeldungen und Warnungen
Sanitizer: Methoden zur Instrumentierung (Code der in das kompilierte Programm eingebettet wird) zur Erleichterung der Lokalisierung und Analyse verschiedenster Fehlerquellen, z. B.:
- Speicherfehler und Speicherlecks (z. B. use-after-free)
- Race Conditions
- undefiniertes Verhalten (Overflows, Benutzung von Null-Pointern)
- Benutzung von nicht-initialisierten Variablen
::: slides
:::
LLVM ist eine (fast) komplette Infrastruktur zur Entwicklung von Compilern und compilerähnlichen Programmen.
Die wichtigsten Bestandteile:
- der Zwischencode LLVM IR
- der LLVM Optimierer
- der Codegenarator mit Sanitizern
::: slides
Unless otherwise noted, this work is licensed under CC BY-SA 4.0. :::