Compiler vs. Interpreter vs. JIT: Unterschiede erklärt

Quellcode lässt sich auf drei Hauptwegen ausführen. Ein Compiler (Ahead-of-Time, AOT) übersetzt das gesamte Programm in Maschinencode, bevor es läuft. Ein Interpreter liest und führt das Programm während des Ablaufs aus, ohne eine separate Maschinencode-Datei zu erzeugen. Ein Just-in-Time-Compiler (JIT) beginnt mit dem Interpretieren und kompiliert dann häufig genutzte Teile zur Laufzeit in Maschinencode. Viele Sprachen mischen diese Ansätze.

AspektCompiler (AOT)InterpreterJIT-Compiler
Zeitpunkt der ÜbersetzungVor der Ausführung: Das ganze Programm wird zu MaschinencodeWährend der Ausführung: Das Programm wird Schritt für Schritt gelesen und ausgeführtWährend der Ausführung: Häufig genutzter Code wird in Maschinencode kompiliert
StartSchneller Start (aber vorher ist ein Build-Schritt nötig)Schneller Start, ohne Build-SchrittAnfangs langsamer, bis der Code aufgewärmt ist
AusführungsgeschwindigkeitAm schnellsten und am besten vorhersagbarAm langsamsten, oft um ein Vielfaches langsamer als kompilierter CodeNach dem Aufwärmen nahe an kompilierter Geschwindigkeit, durch Laufzeitinformationen manchmal schneller
PortabilitätEine Binärdatei pro PlattformPortabel: läuft überall, wo es den Interpreter gibtPortabler Bytecode, mit plattformspezifischer Laufzeitumgebung
FehlererkennungViele Fehler werden zur Kompilierzeit gefundenFehler treten auf, wenn die fehlerhafte Zeile ausgeführt wirdHängt von der Sprache ab
SpeicherbedarfGeringer Laufzeit-OverheadDer Interpreter selbst bleibt im SpeicherZusätzlicher Speicher für den Compiler und den Cache für kompilierten Code
EntwicklungszyklusBearbeiten, bauen, ausführenBearbeiten und sofort ausführenMeist bearbeiten und ausführen, oder zu Bytecode bauen
BeispielsprachenC, C++, Rust, GoKlassisches Python (CPython), Ruby, Shell-SkripteJava (HotSpot), JavaScript (V8), C# (.NET), PyPy

Die Zahlenangaben sind typische Größenordnungen und variieren je nach Prozessgeneration und Produkt.

Wann welches einsetzen

Compiler
Wenn Leistung, geringe Größe und vorhersagbares Verhalten zählen: Betriebssysteme, Spiele, eingebettete Firmware.
Interpreter
Für schnelle Experimente, Skripting und Lernen, wo schnelle Entwicklung wichtiger ist als Geschwindigkeit.
JIT
Für lang laufende Programme auf einer portablen Plattform, die Geschwindigkeit brauchen, etwa Webbrowser und Serveranwendungen.

FAQ

Wird Python kompiliert oder interpretiert?

Die Standardimplementierung CPython kompiliert den Quellcode zu Bytecode und interpretiert diesen dann. Andere Implementierungen wie PyPy fügen für mehr Geschwindigkeit einen JIT-Compiler hinzu.

Wird Java kompiliert oder interpretiert?

Beides. Java wird vorab zu Bytecode kompiliert, den die JVM dann interpretiert und zur Laufzeit per JIT in Maschinencode übersetzt.

Warum ist kompilierter Code schneller?

Das gesamte Programm wird vor der Ausführung in optimierten Maschinencode übersetzt, sodass zur Laufzeit nichts mehr interpretiert werden muss.

Was ist das Aufwärmen (Warm-up) eines JIT-Compilers?

Zunächst läuft das Programm im Interpreter, und der JIT kompiliert den „heißen“ Code, sobald er gesehen hat, dass dieser oft ausgeführt wird. Bis dahin ist die Geschwindigkeit geringer.

Wichtige Begriffe erklärt

Just-in-Time-Kompilierung (JIT)
Übersetzung häufig ausgeführter Programmteile in Maschinencode zur Laufzeit, was Optimierungen auf Grundlage von Laufzeitinformationen ermöglicht. Wird in Laufzeitumgebungen für Java, JavaScript und andere genutzt.

Weitere Vergleiche