JIT-Compiler (Just-in-Time)
Kurz: Ein JIT-Compiler übersetzt Bytecode oder Quelltext erst während der Ausführung in Maschinencode – und zwar bevorzugt die Programmstellen, die besonders oft laufen („Hot Spots“).
Genauer: So verbinden virtuelle Maschinen die Portabilität von Bytecode mit der Geschwindigkeit nativen Codes. Das Programm startet interpretiert, die VM misst, welche Funktionen oft aufgerufen werden, und kompiliert diese in optimierten Maschinencode. Das Gegenstück ist die AOT-Kompilierung (ahead of time), die vor dem Start übersetzt.
Im Detail
Wo kommt JIT vor?
- Java (HotSpot-JVM), C# (CLR), JavaScript (V8, SpiderMonkey), PyPy (Python), LuaJIT, Julia (kompiliert jede Funktion beim ersten Aufruf über LLVM), PHP 8 (optional) und Dart (Entwicklungsmodus).
Warmlaufen
Ein JIT-Programm ist beim Start langsamer und erreicht erst nach dem Warmlaufen seine Spitzenleistung. Deshalb sind Benchmarks, die nur einmal laufen, irreführend. Julia-Nutzer kennen das als „Time to first plot“.
Optimierungen
JIT-Compiler nutzen Wissen aus der Laufzeit, das ein vorab arbeitender Compiler nicht hat: tatsächliche Typen, häufige Verzweigungen, Aufrufziele. Sie fügen Funktionen ein (Inlining), entfernen unnötige Prüfungen und machen ihre Annahmen rückgängig (Deoptimierung), falls sie sich als falsch herausstellen.
JIT oder AOT?
| JIT | AOT | |
|---|---|---|
| Start | langsamer | schnell |
| Spitzenleistung | sehr hoch (Laufzeitwissen) | hoch |
| Speicher | höher | niedriger |
| Beispiele | HotSpot, V8, PyPy | C/C++/Rust, GraalVM Native Image, .NET Native AOT, Dart-Release |
Siehe auch Compiler und Interpreter.
Siehe auch: Bytecode, Compiler, Interpreter, Garbage Collector