Interpreter

Aus C64-Wiki
Zur Navigation springenZur Suche springen

Ein Interpreter ist ein Programm, das einen Datenstrom abarbeitet, als Arbeitsanweisungen interpretiert und ausführt. Bei diesem Datenstrom handelt es sich typischerweise um ein anderes in einer Interpretersprache bzw. Skriptsprache geschriebenes Programm, sei es in textueller oder bereits in einer aufbereiteten (tokenized) Form. Der Datenstrom wird Schritt für Schritt durchgegangen und im Interpreter für die jeweilige gefundene Anweisung ein entsprechendes ausführendes Unterprogramm aufgerufen. Es erfolgt keine Umwandlung in ein direkt ausführbares Programm, sondern das Programm benötigt stets den Interpreter zwecks Ausführung.

Da der Programm-Quellcode von einem Interpreter für jeden Schritt der Ausführung immer wieder gelesen, die Daten aufbereitet und dann das jeweilige den Befehl ausführende Unterprogramm des Interpreters aufgerufen werden muss, ist die Ausführung einer Interpretersprache langsamer als entsprechende Maschinenspracheprogramme bzw. Programme einer Compilersprache. Weitere Details dazu gibt es im Artikel Compiler.

Ein wesentlicher Vorteil von Interpretern ist, dass sie im Gegensatz zu Compiler-basierten Ansätzen einen Direktmodus sehr leicht umsetzen können.

Der CBM-BASIC-Interpreter[Bearbeiten | Quelltext bearbeiten]

Beim C64/128 oder VC20 erledigt der eingebaute BASIC-Interpreter die Ausführung von BASIC-Programmen sowie die Umsetzung des Direktmodus. Programme liegen dabei dem Interpreter nicht als reine Textdateien vor, sondern werden bei der Eingabe im Direktmodus automatisch tokenisiert, d.h. in eine etwas leichter für den Interpreter zu handhabende Form gebracht. Würden BASIC-Programme als reine Textdateien vorliegen, müsste z.B. bei GOTO-Sprüngen eine sehr aufwendige Volltextsuche im Programmtext durchgeführt werden. In der vorinterpretierten Version muss immer noch gesucht werden, jedoch kann schnell von Zeilenanfang zu Zeilenanfang gesprungen werden.

Der BASIC-Interpreter besteht im Wesentlichen aus einer Anzahl Unterroutinen, die jeweils den Maschinencode enthalten, der einen BASIC-Befehl (bzw. Token) umsetzt. Diese Unterroutinen werden von der Interpreterschleife aufgerufen, die den Direkt- bzw. Programmmodus implementiert. Außerdem finden sich im Interpreter noch weitere Routinen z.B. zur Speicherverwaltung von Variablen oder auch Umsetzung der Garbage Collection, zur Darstellung von Fehlermeldungen und so weiter.

Bis auf wenige BASIC-Befehle wie POKE, SYS oder USR ist die Ausführung von BASIC-Programmen sicher vor Programmabstürzen, die das Programm selbst überschreiben oder den Rechner hart zum Hängen bringen können. Werden diese Befehle nicht benutzt, reicht ein Warmstart via RUN/STOP +RESTORE , um wieder ein Prompt zu bekommen. Werden aber die "unsicheren" Befehle benutzt, ist bei einem ein Hänger unter Umständen ein Reset nötig; schlägt dann ein UNNEW fehl, ist das Programm verloren. Daher ist es generell sinnvoll, vor der Ausführung von gerade geschriebenen Programmen diese zunächst abzuspeichern.

Technische Details zum BASIC-Interpreter des C64 finden sich im Abschnitt "Technische Realisierung" im Artikel BASIC.

Andere Interpreter[Bearbeiten | Quelltext bearbeiten]

Auch an anderen Stellen werden Interpreter eingesetzt, der einen Zwischen-Programmcode (der bereits teilweise übersetzt oder aufbereitet ist) abarbeitet und nicht direkt mit dem Quelltext umgeht.

  • Die Pascal-Variante UCSD-Pascal mit dem P-Code-Interpreter
  • Diverse Forth-Implementierungen mit einem Threaded-Code-Interpreter.
  • Blitz! sowie einige andere Compiler kompilieren BASIC V2 in einen effizienteren Zwischencode als es CBM-BASIC macht und erreichen u.a. dadurch deutliche Geschwindigkeitsgewinne; der effizientere Zwischencode wird aber weiterhin von einem kleinen Interpreter ausgeführt.

Einordnung[Bearbeiten | Quelltext bearbeiten]

Zwar werden häufiger "Interpretersprachen" von "kompilierten Sprachen" abgegrenzt, jedoch kann diese harte Trennung nicht in dieser Form gemacht werden. So kann die "Interpretersprache" BASIC durchaus auch in reine Maschinensprache kompiliert werden (wie es z.B. Basic-Boss macht); ähnliches gibt es auch bei JavaScript zu beobachten, das als reine interpretierte Sprache ersonnen wurde, inzwischen jedoch die meisten Umsetzungen auf Just-in-time-Kompilierung setzen.

Gleichzeitig wird auch Maschinensprache von modernen Prozessoren in mehreren Transformationsschritten verarbeitet (siehe z.B. Mikrocode).

Links[Bearbeiten | Quelltext bearbeiten]

WP-W11.png Wikipedia: Interpreter