EMZETT.
Login

Kurz: Ein Compiler übersetzt den gesamten Quelltext vor der Ausführung in Maschinencode oder Bytecode; ein Interpreter führt den Quelltext (oder Zwischencode) Schritt für Schritt aus. In der Praxis mischen die meisten Sprachen beides.

Genauer: Die Frage „kompiliert oder interpretiert?“ betrifft die Implementierung, nicht die Sprache selbst: Für C gibt es Interpreter, für Python Compiler. Entscheidend sind Startzeit, Geschwindigkeit, Portabilität und die Art der Fehlermeldungen.

Von Quelltext zu Programm: vier Wege

Im Detail

Die vier typischen Wege

  1. Nativ kompiliert (C, C++, Rust, Go, Zig, Fortran, Pascal, Ada): Der Compiler erzeugt Maschinencode für eine bestimmte CPU. Das Ergebnis läuft direkt, ohne Laufzeit-Übersetzung, und ist meist am schnellsten. Preis: eine Übersetzung pro Plattform.
  2. Bytecode auf einer virtuellen Maschine (Java, Kotlin, Scala, C#, F#, Erlang): Der Compiler erzeugt plattformneutralen Zwischencode; eine VM mit JIT-Compiler übersetzt heiße Stellen während des Laufs in Maschinencode. Vorteil: „einmal übersetzen, überall laufen“, gute Spitzenleistung nach dem Warmlaufen.
  3. Interpretiert (Python, Ruby, Perl, PHP, Bash, AWK, Tcl, Lua): Der Interpreter liest den Quelltext (meist zunächst in Bytecode umgewandelt) und führt ihn aus. Vorteil: sofortiges Ausprobieren in der REPL, kein Build-Schritt.
  4. Übersetzt in eine andere Sprache (TypeScript → JavaScript, Nim → C): Ein Transpiler erzeugt Quelltext einer anderen Sprache, die dann ihren eigenen Weg geht.

Ablauf in der Praxis

gcc hallo.c -o hallo      # Kompilieren: Quelltext -> ausführbare Datei
./hallo                   # Starten
 
python3 hallo.py          # Interpretieren: Quelltext -> sofort ausführen
 
javac Hallo.java          # Quelltext -> Bytecode (.class)
java Hallo                # JVM führt den Bytecode aus

Vor- und Nachteile

MerkmalKompiliertInterpretiert
Startzeitschnell (fertiges Programm)meist langsamer
Laufzeitoft am schnellstenlangsamer, JIT hilft
Fehlerviele schon beim Übersetzenoft erst beim Lauf
EntwicklungBuild-Schritt nötigsofort ausführbar, REPL
VerteilenBinärdatei je PlattformQuelltext plus Interpreter nötig

AOT, JIT und Hybride

AOT (ahead of time) übersetzt vor dem Start, JIT (just in time) während des Laufs. Moderne Systeme kombinieren beides: Dart nutzt JIT in der Entwicklung (Hot Reload) und AOT für Release-Apps; Julia kompiliert Funktionen beim ersten Aufruf über LLVM; Java und C# bieten inzwischen auch AOT-Varianten.

Siehe auch: Laufzeitumgebungen, Typsysteme, Programmiersprachen im Überblick