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.
Im Detail
Die vier typischen Wege
- 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.
- 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.
- 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.
- Ü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 ausVor- und Nachteile
| Merkmal | Kompiliert | Interpretiert |
|---|---|---|
| Startzeit | schnell (fertiges Programm) | meist langsamer |
| Laufzeit | oft am schnellsten | langsamer, JIT hilft |
| Fehler | viele schon beim Übersetzen | oft erst beim Lauf |
| Entwicklung | Build-Schritt nötig | sofort ausführbar, REPL |
| Verteilen | Binärdatei je Plattform | Quelltext 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