Was ist ein Interpreter?
Ein Interpreter ist ein Programm, das Quellcode direkt ausführt und seine Anweisungen der Reihe nach abarbeitet, statt zuerst das ganze Programm in eine separate Datei mit Maschinencode zu übersetzen. Die Standardimplementierungen von Python und Ruby sind Interpreter.
Aktualisiert am 24. September 2026
- 1print("Hello")
- 2total = 2 + 3
- 3print(total)
- 4print("Done")
Jede Ausführung übersetzt die Zeilen erneut. Schalte den Tippfehler ein, und der Interpreter gibt trotzdem „Hello“ aus, bevor er Zeile 3 erreicht und stoppt.
Tippe python3 hello.py, und die Ausgabe erscheint, aber sieh danach in den Ordner: Es wurde keine neue Programmdatei angelegt. Das Programm, das tatsächlich lief, war python3 selbst, der Python-Interpreter. Er hat hello.py gelesen, herausgefunden, was jede Anweisung bedeutet, und sie ausgeführt. Führst du das Skript morgen wieder aus, liest der Interpreter den Quellcode erneut von vorn.
Wie ein Interpreter arbeitet
Ein Interpreter wiederholt einen Zyklus, bis das Programm endet: die nächste Anweisung holen, herausfinden, was sie bedeutet, sie ausführen, weitermachen. Während er arbeitet, hält er die Variablen des Programms in seinem eigenen Speicher. Deshalb kann total = price * 3 ein price verwenden, das ein paar Zeilen vorher gesetzt wurde.
Am deutlichsten siehst du das im interaktiven Modus, der REPL (read, evaluate, print, loop) heißt. Gib python3 ohne Dateinamen ein, und jede Zeile läuft in dem Moment, in dem du Enter drückst:
>>> price = 4
>>> price * 3
12
Echte Interpreter haben einen Vorbereitungsschritt. CPython, der Standard-Interpreter für Python, kompiliert zuerst deine ganze Datei zu Bytecode, einer kompakten Liste einfacher Anweisungen, und führt dann in einer Schleife diesen Bytecode Anweisung für Anweisung aus. Du kannst dir den Bytecode für eine Zeile ausgeben lassen:
Python 3.12 gibt Folgendes aus (andere Versionen unterscheiden sich im Detail):
0 0 RESUME 0
1 2 LOAD_NAME 0 (price)
4 LOAD_CONST 0 (3)
6 BINARY_OP 5 (*)
10 STORE_NAME 1 (total)
12 RETURN_CONST 1 (None)
Jede dieser Zeilen ist ein Schritt in der Schleife des Interpreters: den Wert von price holen, die Konstante 3 holen, beide multiplizieren, das Ergebnis in total speichern. Nichts davon ist Maschinencode; der Interpreter, selbst ein kompiliertes C-Programm, führt jeden Schritt aus.
Fehler zeigen sich, wenn die Zeile läuft
Weil ein Interpreter beim Ausführen voranschreitet, kann ein Programm echte Arbeit erledigen, bevor es auf einen Fehler trifft. Führ das hier aus, und die ersten beiden Zeilen werden vor dem Absturz ausgegeben:
Step 1: starting
Step 2: still fine
Traceback (most recent call last):
...
ZeroDivisionError: division by zero
Ein Syntaxfehler verhält sich anders, weil CPython die ganze Datei zu Bytecode kompiliert, bevor irgendetwas davon läuft. Ändere Zeile 3 zu print("Step 3:" 10) (das Komma fehlt), und es wird gar nichts ausgegeben, nicht einmal Step 1:
SyntaxError: invalid syntax. Perhaps you forgot a comma?
„Ein Interpreter führt Code Zeile für Zeile aus“ ist also nur die halbe Wahrheit. Die Grammatik wird zuerst für die ganze Datei geprüft; alles andere, etwa eine Division durch null oder ein Name, den es nicht gibt, fällt erst auf, wenn diese Zeile ausgeführt wird. Zur ersten Art siehe Syntaxfehler.
Compiler vs. Interpreter
Ein Compiler übersetzt das ganze Programm in eine separate Datei, bevor es läuft. Ein Interpreter führt das Programm selbst aus, jedes Mal. Daraus ergeben sich die praktischen Unterschiede:
| Compiler | Interpreter | |
|---|---|---|
| Wann die Arbeit passiert | Einmal, bevor das Programm läuft | Bei jeder Ausführung des Programms |
| Ausgabe | Eine separate Datei (ausführbare Datei oder Bytecode) | Keine separate Programmdatei |
| Was du an Nutzer weitergibst | Das kompilierte Programm | Den Quellcode und einen auf ihrem Rechner installierten Interpreter |
| Fehlerprüfung | Syntax und, in typisierten Sprachen, Typfehler für das ganze Programm, bevor es läuft | Die Syntax wird meist zuerst geprüft; andere Fehler zeigen sich, wenn die fehlerhafte Zeile läuft |
| Ändern und ausführen | Nach jeder Änderung neu kompilieren | Speichern und erneut ausführen |
| Geschwindigkeit | Schneller, die CPU führt Maschinencode direkt aus | Langsamer, jede Anweisung wird zur Laufzeit entschlüsselt |
| Portabilität | Für jede CPU und jedes Betriebssystem neu kompilieren | Derselbe Quellcode läuft überall, wo es den Interpreter gibt |
| Typische Sprachen | C, C++, Rust, Go | Python, Ruby, PHP, Bash |
Bei engen Rechenschleifen ist der Geschwindigkeitsunterschied real: Dieselbe Schleife kann als kompiliertes C um ein Vielfaches schneller laufen als in CPython. Bei Programmen, die vor allem auf das Netzwerk, die Festplatte oder den Nutzer warten, ist der Unterschied oft zu klein, um aufzufallen.
Kompiliert oder interpretiert ist keine Eigenschaft der Sprache
Eine Sprache ist ein Satz von Regeln; der Compiler oder Interpreter ist ein Programm, das sie umsetzt. Dieselbe Sprache kann auf beide Arten ausgeführt werden, und die meisten verbreiteten Sprachen mischen beides:
- Python. CPython kompiliert zu Bytecode und interpretiert ihn. PyPy, eine andere Implementierung, ergänzt einen Just-in-time-Compiler (JIT), der häufig ausgeführten Code während der Laufzeit in Maschinencode verwandelt.
- Java.
javackompiliert den Quellcode im Voraus zu Bytecode. Die Java Virtual Machine interpretiert dann diesen Bytecode und kompiliert die meistgenutzten Methoden per JIT zu Maschinencode. Seit Java 11 führtjava Main.javaeine einzelne Quelldatei direkt aus, indem es sie zuerst im Speicher kompiliert. - JavaScript. Browser und Node.js nutzen Engines wie V8, die den Code zuerst interpretieren und die heißen Stellen während der Laufzeit in Maschinencode kompilieren.
- C und C++. Werden fast immer im Voraus mit GCC, Clang oder MSVC kompiliert.
python3 app.py # Python: interpreter, bytecode behind the scenes
node app.js # JavaScript: V8 interprets, then JIT-compiles
javac Main.java # Java step 1: compile to Main.class
java Main # Java step 2: the JVM runs the bytecode
So oder so gehört der Interpreter oder die virtuelle Maschine zur Laufzeitumgebung des Programms: Er muss überall installiert sein, wo das Programm läuft.
Häufige Irrtümer
- „Ein Interpreter übersetzt jede Zeile in Maschinencode.“ Ein klassischer Interpreter erzeugt nie Maschinencode für dein Programm. Er liest eine Anweisung und führt sie mit Code aus, der bereits in den Interpreter hineinkompiliert ist. Maschinencode zur Laufzeit zu erzeugen, ist die Aufgabe eines JIT-Compilers.
- „Interpretierte Sprachen haben keinen Kompilierschritt.“ CPython, Rubys YARV und PHP kompilieren alle zuerst zu Bytecode. Der Schritt läuft automatisch und unsichtbar ab, deshalb übersieht man ihn leicht.
- „Interpretiert heißt langsam.“ JIT-Kompilierung hat einen Großteil des Abstands geschlossen. V8 führt JavaScript schnell genug für große Anwendungen wie VS Code aus, das auf Electron aufbaut.
- „Python ist der Interpreter.“ Python ist die Sprache. CPython, PyPy und MicroPython sind verschiedene Interpreter dafür, und sie können sich in der Geschwindigkeit und darin unterscheiden, welche Bibliotheken sie unterstützen.
Wie es weitergeht
Für die andere Hälfte des Vergleichs lies, was ein Compiler ist und wie er Quellcode in Maschinencode verwandelt. Die Seite Laufzeitumgebung erklärt, was der Interpreter sonst noch mitbringt. Um selbst einen Interpreter auszuprobieren, führ ein Python-Skript aus oder öffne den Python Playground.
Häufig gestellte Fragen
Ist Python ein Compiler oder ein Interpreter?
Wird C++ interpretiert oder kompiliert?
Was ist schneller, ein Interpreter oder ein Compiler?
Was ist eine REPL?
python3 oder node ohne Dateinamen eingibst, öffnet sich eine. Sie ist praktisch, um eine kleine Idee zu testen, ohne eine Datei anzulegen.Kann eine Sprache kompiliert und interpretiert werden?
javac zu Bytecode kompiliert und dann von der JVM interpretiert und per JIT kompiliert, und für Sprachen wie Python und JavaScript gibt es sowohl Interpreter als auch Compiler.