Interpretierte Sprachen führen den Quellcode zur Laufzeit aus: Ein Interpreter liest das Programm Anweisung für Anweisung und setzt jede davon direkt um. Im Gegensatz zu einer kompilierten Sprache entsteht dabei keine separate Maschinensprache-Datei, die vor der Ausführung erzeugt werden müsste.
So arbeitet ein Interpreter
Bei einem kompilierten Programm übersetzt ein Compiler den gesamten Quellcode in einem Durchgang in Assembler- beziehungsweise Maschinencode. Ein Interpreter dagegen analysiert den Quellcode erst während der Ausführung: Er erkennt die nächste Anweisung, prüft ihre Syntax und führt sie unmittelbar aus. Dadurch ist der Einstieg einfacher: Man schreibt Code, startet das Programm und sieht sofort das Ergebnis — ohne Zwischenschritt.
Bekannte Beispiele
- Python — die populärste interpretierte Allzwecksprache (Praxis: Python-Befehle)
- JavaScript — läuft interpretiert im Browser (Praxis: JavaScript-Befehle)
- Bash und andere Shell-Skripte (Praxis: Bash-Befehle)
- PHP für Webserver, Ruby und Lua
Vorteile und Nachteile
Vorteile: schnelle Entwicklung ohne Kompilier-Schritt, gute Portabilität (der Quellcode läuft überall, wo ein Interpreter existiert) und hilfreiche Fehlermeldungen zur Laufzeit. Nachteile: Die Ausführung ist meist langsamer als bei nativem Maschinencode, und Fehler wie Tippfehler in Variablennamen fallen erst beim Ausführen auf, nicht schon beim Übersetzen.
Die Grauzone: JIT und Bytecode
Viele moderne Laufzeitumgebungen mischen beide Welten. Java kompiliert zuerst in Bytecode, den die JVM zur Laufzeit interpretiert oder per Just-in-Time-Compiler (JIT) in Maschinencode übersetzt. Auch die Abgrenzung zur Skriptsprache ist fließend: Skriptsprachen sind praktisch immer interpretierte Sprachen, die für Automatisierung und schnelle Aufgaben gedacht sind.
Den Unterschied zwischen dem Werkzeug und der Sprach-Familie erklärt der Begriff Interpreter: Er ist das Programm, das interpretierte Sprachen ausführt (siehe auch Programmiersprache).