Interpreter (computing)

W3sdesign Interpreter Design Muster UML

Im Informatik, ein Dolmetscher ist ein Computer Programm das direkt ausgeführt Anweisungen in a Programmierung oder Skriptsprache, ohne dass sie zuvor gewesen sein müssen zusammengestellt in ein Maschinensprache Programm. Ein Dolmetscher verwendet im Allgemeinen eine der folgenden Strategien für die Programmausführung:

  1. Analysieren das Quellcode und sein Verhalten direkt durchführen;
  2. Übersetzen Quellcode in eine effiziente Zwischendarstellung oder Objektcode und das sofort ausführen;
  3. Explizit gespeicherte vorkompilierte ausführen Bytecode[1] gemacht von a Compiler und mit dem Dolmetscher abgestimmt Virtuelle Maschine.

Frühe Versionen von Lisp -Programmiersprache und Minicomputer- und Mikrocomputer -Grunddialekte Wäre Beispiele für den ersten Typ. Perl, Raku, Python, Matlab, und Rubin sind Beispiele für die zweite UCSD Pascal ist ein Beispiel für den dritten Typ. Quellprogramme werden im Voraus zusammengestellt und als maschinell unabhängiger Code gespeichert, was damals ist verknüpft zur Laufzeit und von einem Dolmetscher und/oder Compiler ausgeführt (für Jit Systeme). Einige Systeme wie z. Smalltalk und zeitgenössische Versionen von BASIC und Java kann auch zwei und drei kombinieren.[2] Dolmetscher verschiedener Typen wurden auch für viele Sprachen konstruiert, die traditionell mit der Zusammenstellung verbunden sind, wie z. Algol, Forran, Cobol, C und C ++.

Während Interpretation und Zusammenstellung die beiden Hauptmittel sind, mit denen Programmiersprachen implementiert werden, sind sie nicht gegenseitig ausschließt, da die meisten Interpretationssysteme auch wie Compiler einige Übersetzungsarbeiten ausführen. Die Begriffe "Interpretierte Sprache" oder "kompilierte Sprache"Sehen Sie sich an, dass die kanonische Implementierung dieser Sprache ein Dolmetscher bzw. ein Compiler ist. A. hochrangige Sprache ist idealerweise ein Abstraktion unabhängig von bestimmten Implementierungen.

Geschichte

Die Dolmetscher wurden bereits 1952 verwendet, um die Programmierung innerhalb der zu diesem Zeitpunkt eingefrorenen Computer zu erleichtern (z. Dolmetscher wurden auch verwendet, um zwischen maschinellen Sprachen auf niedriger Ebene zu übersetzen, sodass Code für Maschinen geschrieben werden konnte, die noch im Konstruktion waren und auf bereits existierenden Computern getestet wurden.[3] Die erste interpretierte Sprache auf hoher Ebene war Lispeln. Lisp wurde erstmals 1958 von implementiert Steve Russell auf an IBM 704 Computer. Russell hatte gelesen John McCarthyPapier und erkannte (zu McCarthys Überraschung), dass das Lisp bewerten Die Funktion könnte im Maschinencode implementiert werden.[4] Das Ergebnis war ein funktionierender LISP -Dolmetscher, mit dem LISP -Programme ausgeführt oder ordnungsgemäß "Lisp -Ausdrücke bewerten" werden konnten.

Allgemeiner Betrieb

Ein Dolmetscher besteht normalerweise aus einer Reihe von Bekannten Befehle es kann ausführenund eine Liste dieser Befehle in der Reihenfolge, in der ein Programmierer sie ausführen möchte. Jeder Befehl (auch als ein bekannt als ein Anweisung) Enthält die Daten, die der Programmierer mutieren möchte, und Informationen darüber, wie die Daten mutiert werden. Zum Beispiel könnte ein Dolmetscher lesen Fügen Sie Wikipedia_Users hinzu, 5 und interpretieren Es als Anfrage, fünf zu fünf hinzuzufügen Wikipedia_users Variable.

Dolmetscher haben eine Vielzahl von Anweisungen, die für verschiedene Aufgaben spezialisiert sind. Sie werden jedoch häufig Interpreter -Anweisungen für Basic finden mathematische Operationen, Verzweigung, und Speicherverwaltungdie meisten Dolmetscher machen Turing vollständig. Viele Dolmetscher sind auch eng mit a integriert Müllsammler und Debugger.

Compiler gegen Dolmetscher

Eine Illustration des Verknüpfungsprozesses. Objektdateien und Statische Bibliotheken werden zu einer neuen Bibliothek oder ausführbar zusammengestellt

Programme in a hochrangige Sprache werden entweder direkt von einer Art Interpreter ausgeführt oder in konvertiert in Maschinensprache von einem Compiler (und Assembler und Linker) für die Zentralprozessor ausführen.

Während Compiler (und Assembler) im Allgemeinen direkt ausführbare Maschinencode produzieren, die von Computerhardware ausführbar sind, können sie häufig (optional) eine Zwischenform erzeugen, die genannt wird Objektcode. Dies ist im Grunde der gleiche maschinenspezifische Code, wurde jedoch mit a erweitert Symboltabelle mit Namen und Tags, um ausführbare Blöcke (oder Module) zu erstellen, identifizierbar und verlängerbar. Kompilierte Programme verwenden normalerweise Bausteine ​​(Funktionen), die in einer Bibliothek solcher Objektcode -Module aufbewahrt werden. EIN Linker wird verwendet, um Bibliotheksdateien (vorgefertigte) Bibliotheksdateien mit den Objektdateien der Anwendung zu kombinieren, um eine einzelne ausführbare Datei zu bilden. Die Objektdateien, mit denen eine ausführbare Datei generiert wird, werden daher häufig zu unterschiedlichen Zeiten und manchmal sogar durch verschiedene Sprachen (in der Lage, dasselbe Objektformat zu generieren) erstellt.

Ein einfacher Dolmetscher in einer Sprache auf niedriger Ebene (z. Montage) Möglicherweise haben ähnliche Maschinencodeblöcke, die Funktionen der auf hohen Sprachen gespeicherten Sprache implementieren und ausgeführt werden, wenn der Eintritt einer Funktion in einer Look-Up-Tabelle auf diesen Code zeigt. Ein Dolmetscher, der in einer hochrangigen Sprache geschrieben wurde Baum analysieren, oder durch Generieren und Ausführen von intermediierten softwaredefinierten Anweisungen oder beides.

So verwandeln sowohl Compiler als auch Dolmetscher im Allgemeinen Quellcode (Textdateien) in Token, beide können (oder nicht) einen Parse -Baum erzeugen und beide können sofortige Anweisungen erzeugen (für a Stapelmaschine, Vierfachcode, oder auf andere Weise). Der grundlegende Unterschied besteht darin, dass ein Compiler-System, einschließlich eines (eingebauten oder separaten) Linkers, eine eigenständige Erzeugung erzeugt Maschinensprache Programm, während stattdessen ein Interpreter -System führt aus Die im hochrangigen Programm beschriebenen Aktionen.

Ein Compiler kann somit fast alle Conversions von Quellcode -Semantik auf die Maschinenebene ein für alle Mal herstellen (d. H. Bis das Programm geändert werden muss), während ein Dolmetscher dies tun muss etwas Von dieser Konvertierungsarbeit jedes Mal, wenn eine Anweisung oder Funktion ausgeführt wird. In einem effizienten Dolmetscher wird jedoch ein Großteil der Übersetzungsarbeiten (einschließlich der Analyse von Typen und ähnlichem) berücksichtigt und nur beim ersten Mal ausgeführt, das ein Programm, ein Modul, eine Funktion oder sogar eine Aussage ausgeführt wird, wodurch ein ziemlich ähnlich ist, wie a Compiler funktioniert. Ein kompiliertes Programm läuft jedoch unter den meisten Umständen immer noch viel schneller, auch weil Compiler so konzipiert sind, dass sie den Code optimieren, und kann dafür genügend Zeit erhalten. Dies gilt insbesondere für einfachere Sprachen auf hoher Ebene ohne (viele) dynamische Datenstrukturen, Überprüfungen oder Geben Sie die Überprüfung ein.

In der traditionellen Zusammenstellung die ausführbare Ausgabe der Linker (.exe -Dateien oder .dll -Dateien oder eine Bibliothek, siehe Bild) ist in der Regel verlängert, wenn sie unter einem allgemeinen Betriebssystem ausgeführt werden, ähnlich wie die Objektcode -Module, aber mit dem Unterschied, dass dieser Umzug zur Laufzeit dynamisch durchgeführt wird, d. H. Wenn die Das Programm wird für die Ausführung geladen. Andererseits kompilierte und verknüpfte Programme für kleine Seite eingebettete Systeme werden typischerweise statisch zugeordnet, oft hart in a Noch Blitz Speicher, da es in diesem Sinne oft keinen sekundären Speicher und kein Betriebssystem gibt.

Historisch gesehen haben die meisten Dolmetschersysteme einen in sich geschlossenen Redakteur eingebaut. Dies wird auch für Compiler immer häufiger (dann oft als ein bezeichnet Ide), obwohl einige Programmierer lieber einen Editor ihrer Wahl verwenden und den Compiler, Linker und andere Tools manuell ausführen. In der Vergangenheit sind Compiler vor Dolmetscher, weil Hardware zu diesem Zeitpunkt sowohl den Interpreter als auch den interpretierten Code und die typische Batch -Umgebung der Zeit nicht unterstützen konnten, die die Vorteile der Interpretation beschränkten.[5]

Entwicklungszyklus

Während der SoftwareentwicklungszyklusProgrammierer nehmen häufig Änderungen des Quellcodes vor. Bei der Verwendung eines Compilers müssen jedes Mal, wenn eine Änderung am Quellcode vorgenommen wird, darauf warten, dass der Compiler die geänderten Quelldateien übersetzt und Verknüpfung Alle Binärcodedateien zusammen, bevor das Programm ausgeführt werden kann. Je größer das Programm, desto länger das Warten. Im Gegensatz dazu wartet ein Programmierer, der einen Dolmetscher verwendet geprüft. Effekte sind beim Speichern des Quellcode und des Nachladens des Programms erkennbar. Kompilierter Code ist im Allgemeinen weniger leicht als Bearbeitung, Kompilieren und Verknüpfung debugiert und sind sequentielle Prozesse, die in der richtigen Reihenfolge mit einem ordnungsgemäßen Satz von Befehlen durchgeführt werden müssen. Aus diesem Grund haben viele Compiler auch eine Executive Aid, die als a bekannt ist Makefile und Programm. Das MakeFile listet den Befehlszeilen und die Programmquellcode -Dateien von Compiler und Linker auf, kann jedoch eine einfache Eingabe des Befehlszeilenmenüs (z. Füttern der angegebenen Quellcodedateien.

Verteilung

A Compiler Konvertiert den Quellcode in den Binäranweis für die Architektur eines bestimmten Prozessors, wodurch er weniger wird tragbar. Diese Konvertierung erfolgt nur einmal in der Umgebung des Entwicklers, und danach kann die gleiche Binärdatei an die Maschinen des Benutzers verteilt werden, wo sie ohne weitere Übersetzung ausgeführt werden kann. EIN Cross Compiler Kann Binärcode für den Benutzergerät generieren, auch wenn er einen anderen Prozessor hat als der Computer, auf dem der Code zusammengestellt wird.

Ein interpretiertes Programm kann als Quellcode verteilt werden. Es muss in jeder endgültigen Maschine übersetzt werden, was mehr Zeit in Anspruch nimmt, die Programmverteilung jedoch unabhängig von der Architektur der Maschine macht. Die Portabilität des interpretierten Quellcodes hängt jedoch davon ab, dass die Zielmaschine tatsächlich einen geeigneten Dolmetscher aufweist. Wenn der Dolmetscher zusammen mit der Quelle geliefert werden muss, ist der Gesamtinstallationsprozess komplexer als die Lieferung einer monolithischen ausführbaren Datei, da der Dolmetscher selbst Teil der Installation ist.

Die Tatsache, dass interpretierter Code leicht von Menschen gelesen und kopiert werden kann Urheberrechte ©. Jedoch verschiedene Systeme von Verschlüsselung und Verschleierung existieren. Die Lieferung von Zwischencode wie Bytecode hat einen ähnlichen Einfluss wie Dekompiler oder Disassembler.

Effizienz

Der Hauptnachteil von Dolmetschern ist, dass ein interpretiertes Programm normalerweise langsamer läuft als wenn es gewesen wäre zusammengestellt. Der Geschwindigkeitsunterschied könnte winzig oder großartig sein; Oft eine Größenordnung und manchmal mehr. Es dauert im Allgemeinen länger, ein Programm unter einem Dolmetscher auszuführen, als den kompilierten Code auszuführen. Es kann jedoch weniger Zeit dauern, es zu interpretieren als die Gesamtzeit, die zum Kompilieren und Ausführen erforderlich ist. Dies ist besonders wichtig, wenn Prototyping und Testcode bei einem Zyklus für Bearbeitungsinterpret-Debug oft viel kürzer sein kann als ein Zyklus für Bearbeitungskompilen-Run-Debug.

Der Interpretationscode ist langsamer als das Ausführen des kompilierten Codes, da der Interpreter jeweils analysieren muss Aussage Im Programm wird jedes Mal, wenn es ausgeführt wird, und führt dann die gewünschte Aktion aus, während der kompilierte Code die Aktion in einem durch die Kompilierung festgelegten festen Kontext ausführt. Dies Laufzeit Die Analyse wird als "interpretierender Overhead" bezeichnet. Der Zugriff auf Variablen ist auch in einem Dolmetscher langsamer, da die Zuordnung von Kennungen an Speicherorte wiederholt zur Laufzeit statt bei der Laufzeit durchgeführt werden muss, anstatt bei Zeit kompilieren.

Bei der Verwendung eines Interpreters und der Ausführungsgeschwindigkeit gibt es verschiedene Kompromisse zwischen der Entwicklungsgeschwindigkeit und bei der Verwendung eines Compilers. Einige Systeme (wie einige andere LISPs) Erlauben Sie interpretierte und kompilierte Code, sich gegenseitig anzurufen und Variablen zu teilen. Dies bedeutet, dass eine Routine, sobald sie unter dem Dolmetscher getestet und debuggen wurde, erstellt werden und somit von einer schnelleren Ausführung profitieren kann, während andere Routinen entwickelt werden. Viele Dolmetscher führen den Quellcode nicht so aus, wie er aussteht, sondern konvertieren ihn in eine kompaktere interne Form. Viele BASIC Dolmetscher ersetzen Schlüsselwörter mit Single Byte Token mit der verwendet werden kann, um die Anweisung in a zu finden Sprungtisch. Ein paar Dolmetscher wie die PBASIC Interpreter, eine noch höhere Programmverdichtung erzielen, indem sie eine bit-orientierte als eine byte-orientierte Programmspeicherstruktur verwenden, bei der Befehle-Token vielleicht 5 Bit belegen, nominell "16-Bit" -Konstanten in einem gespeichert werden Code variabler Länge Das Erfordernis von 3, 6, 10 oder 18 Bits und Adressoperanden umfasst einen "Bitversatz". Viele grundlegende Dolmetscher können ihre eigene interne Darstellung speichern und zurücklesen.

Ein Dolmetscher könnte das gleiche verwenden Lexikalanalysator und Parser als Compiler und dann die resultierenden interpretieren Zusammenfassung Syntaxbaum. Beispieldatentypdefinitionen für letztere und ein Spielzeugdolmetscher für Syntaxbäume von C Ausdrücke werden in der Box gezeigt.

Regression

Interpretation kann nicht als alleinige Ausführungsmethode verwendet werden Der Maschinencode, den die CPU ausführen kann.[6][7]

Variationen

Bytecode -Dolmetscher

Es gibt ein Spektrum an Möglichkeiten zwischen Interpretation und Kompilieren, abhängig von der Ausführung der Analyse, die vor dem Programm ausgeführt wird. Zum Beispiel, EMACS Lisp wird zusammengestellt Bytecode, das ist eine stark komprimierte und optimierte Darstellung der Lisp -Quelle, ist jedoch kein Maschinencode (und daher nicht an eine bestimmte Hardware gebunden). Dieser "kompilierte" Code wird dann von einem Bytecode -Interpreter interpretiert (selbst geschrieben in C). Der kompilierte Code in diesem Fall ist Maschinencode für a virtuelle Maschine, was nicht in Hardware implementiert ist, sondern im Bytecode -Interpreter. Solche zusammenstellenden Dolmetscher werden manchmal auch genannt Kompreten.[8][9] In einem Bytecode -Interpreter beginnt jeder Befehl mit einem Byte, und daher haben Bytecode -Dolmetscher bis zu 256 Anweisungen, obwohl nicht alle verwendet werden können. Einige Bytecodes können mehrere Bytes annehmen und möglicherweise willkürlich kompliziert sein.

Steuertabellen - Das muss nicht unbedingt eine Kompilienphase durchlaufen - diktieren geeignete algorithmische Steuerfluss über individuelle Dolmetscher in ähnlicher Weise wie Bytecode -Dolmetscher.

Thread -Code -Dolmetscher

Thread -Code -Dolmetscher ähneln den Bytecode -Dolmetschern, aber anstelle von Bytes verwenden sie Zeiger. Jede "Anweisung" ist ein Wort, das auf eine Funktion oder eine Anweisungssequenz verweist, möglicherweise gefolgt von einem Parameter. Der Thread -Code -Interpreter holt entweder Anweisungen ab und ruft die Funktionen auf, auf die sie verweisen, oder holt die erste Anweisung ab und springt dazu, und jede Befehlssequenz endet mit einem Abruf und springt zum nächsten Anweisungen. Im Gegensatz zu Bytecode gibt es keine wirksame Grenze für die Anzahl verschiedener Anweisungen als verfügbare Speicher- und Adressraum. Das klassische Beispiel für Thread -Code ist das Weiter Code verwendet in Offene Firmware Systeme: Die Quellsprache wird in "F -Code" (ein Bytecode) zusammengestellt, das dann von a interpretiert wird virtuelle Maschine.

Abstrakte Syntax -Bauminterpretspieler

Im Spektrum zwischen Interpretation und Kompilieren besteht ein anderer Ansatz darin, den Quellcode in einen optimierten abstrakten Syntaxbaum (AST) umzuwandeln, dann das Programm nach dieser Baumstruktur auszuführen oder native Code zu generieren, um native Code zu generieren gerade rechtzeitig.[10] Bei diesem Ansatz muss jeder Satz nur einmal analysiert werden. Als Vorteil gegenüber Bytecode hält der AST die globale Programmstruktur und die Beziehungen zwischen Aussagen (die in einer Bytecode -Darstellung verloren gehen) und bietet bei Komprimierung eine kompaktere Darstellung.[11] Daher wurde die Verwendung von AST als besseres Zwischenformat für Just-in-Time-Compiler als Bytecode vorgeschlagen. Außerdem kann das System während der Laufzeit eine bessere Analyse durchführen.

Für Dolmetscher verursacht ein AST jedoch mehr Overhead als ein Bytecode -Interpreter, da die Knoten in Bezug auf Syntax keine nützlichen Arbeiten ausführen, eine weniger sequentielle Darstellung (die einen Durchqueren von mehr Zeigern erfordern) und von Overhead den Baum besucht.[12]

Just-in-Time-Zusammenstellung

Weitere verwischen die Unterscheidung zwischen Dolmetschern, Bytecode-Dolmetschern und Zusammenstellung ist Just-in-Time (JIT) -Kompilation, eine Technik, bei der die Zwischendarstellung in native zusammengestellt wird Maschinensprache zur Laufzeit. Dies verleiht den Effizienz des laufenden nativen Codes auf Kosten der Startzeit und erhöhten Speicherverbrauch, wenn der Bytecode oder AST zum ersten Mal kompiliert wird. Der früheste veröffentlichte JIT -Compiler wird im Allgemeinen auf Arbeiten zugeschrieben LISPELN durch John McCarthy 1960.[13] Adaptive Optimierung ist eine komplementäre Technik, bei der das Interpreter das laufende Programm profiliert und seine am häufigsten ausgeführten Teile in nativen Code zusammenstellt. Die letztere Technik ist ein paar Jahrzehnte alt und erscheint in Sprachen wie Smalltalk in den 1980er Jahren.[14]

Die Just-in-Time-Zusammenstellung hat in den letzten Jahren bei den Sprachimplementierern die Aufmerksamkeit der Sprachkompetenz erlangt, mit Java, das .NET Framework, am modernsten JavaScript Implementierungen und Matlab Jetzt einschließlich JIT -Compiler.

Template Interpreter

Die Unterscheidung zwischen Compilern und Dolmetschern ist noch einmal vage ein spezielles Dolmetscherdesign, das als Template -Dolmetscher bekannt ist. Anstatt die Ausführung des Codes aufgrund einer großen Switch -Anweisung mit jedem möglichen Bytecode zu implementieren, während ein Software -Stapel oder einen Baumwanderung betrieben wird, behält ein Template -Interpreter ein großes Array von Bytecode (oder effizient Anweisungen für native Maschinen, die auf der Hosthardware als Schlüsselwertpaare ausgeführt werden können (oder in effizienteren Designs, direkte Adressen der nativen Anweisungen),[15][16] bekannt als "Vorlage". Wenn das bestimmte Codesegment ausgeführt wird, lädt der Interpreter einfach die Opcode -Zuordnung in der Vorlage und führt sie direkt auf der Hardware aus.[17][18] Aufgrund seines Designs ähnelt der Interpreter der Vorlage sehr stark einem Just-in-Time-Compiler und nicht einem herkömmlichen Interpreter Zeit, anstatt optimierte Sequenzen von CPU -ausführbaren Anweisungen aus dem gesamten Codesegment zu erstellen. Aufgrund des einfachen Designs des Dolmetschers, einfach direkt an die Hardware zu übergeben, anstatt sie direkt zu implementieren, ist es viel schneller als jeder andere Typ, sogar Bytecode -Dolmetscher, und in einem Ausmaß, das weniger anfällig für Fehlern ist, ist aber als Kompromiss schwieriger zu werden. Pflegen Sie aufgrund des Dolmetschers, die Übersetzung auf mehrere verschiedene Architekturen anstelle einer plattformunabhängigen virtuellen Maschine/Stack unterstützen muss. Bisher ist die einzige Vorlage -Interpreter -Implementierung einer Sprache der Interpreter in der Implementierung von Hotspot/OpenJDK Java Virtual Machine.[15]

Selbstinterpreter

Ein Eigeninterpreter ist ein Programmiersprache Interpreter in einer Programmiersprache, die sich selbst interpretieren kann; Ein Beispiel ist a BASIC Interpreter in Basic geschrieben. Selbstinterpretatoren sind miteinander verbunden mit Selbsthost-Compiler.

Wenn nein Compiler existiert für die zu interpretierende Sprache und erfordert die Implementierung der Sprache in einer Hostsprache (die möglicherweise eine andere Programmiersprache sein kann oder Assembler). Durch einen ersten Dolmetscher wie diesen ist das System Bootstraße und neue Versionen des Dolmetschers können in der Sprache selbst entwickelt werden. Auf diese Weise war das Donald Knuth entwickelte den Tangle -Dolmetscher für die Sprache NETZ des industriellen Standards Tex Typensatzsystem.

Das Definieren einer Computersprache erfolgt normalerweise in Bezug auf eine abstrakte Maschine (sogenannte Betriebssemantik) oder als mathematische Funktion (Denotationssemantik). Eine Sprache kann auch durch einen Dolmetscher definiert werden, bei dem die Semantik der Wirtssprache angegeben wird. Die Definition einer Sprache durch einen Selbstinterpreter ist nicht begründet (sie kann keine Sprache definieren), aber ein Selbstinterpreter erzählt einem Leser über die Ausdruckskraft und Eleganz einer Sprache. Es ermöglicht dem Dolmetscher auch den Quellcode, den ersten Schritt in Richtung Reflexionsinterpretation.

Eine wichtige Designdimension bei der Implementierung eines Selbstinterpreters ist, ob ein Merkmal der interpretierten Sprache mit demselben Merkmal in der Hostsprache des Dolmetschers implementiert wird. Ein Beispiel ist, ob a Schließung in einem Lispeln-Die ähnliche Sprache wird unter Verwendung von Verschlüssen in der Interpret -Sprache implementiert oder "manuell" mit einer Datenstruktur implementiert, die die Umgebung explizit speichert. Je mehr Funktionen durch dieselbe Funktion in der Hostsprache implementiert sind, desto weniger steuern der Programmierer des Dolmetschers. Ein anderes Verhalten für den Umgang mit Zahlenüberläufen kann nicht realisiert werden, wenn die arithmetischen Operationen an entsprechende Operationen in der Hostsprache delegiert werden.

Einige Sprachen wie z. Lispeln und Prolog habe elegante Selbstinterpretatoren.[19] Es wurde viel Forschung zu Selbstinterpretern (insbesondere reflektierende Dolmetscher) durchgeführt, in der Programmiersprache Schema, ein Dialekt von Lisp. Im Allgemeinen jedoch alle Turing-Complete Die Sprache ermöglicht das Schreiben eines eigenen Interpreters. LISP ist eine solche Sprache, da Lisp -Programme Listen von Symbolen und anderen Listen sind. XSLT ist eine solche Sprache, da XSLT -Programme in XML geschrieben sind. Eine Unterdomäne von Metaprogrammierung ist das Schreiben von Domänenspezifische Sprachen (DSLS).

Clive Gifford stellte vor[20] Eine Maßqualität des Selbstinterpreter N Selbstinterpretierer und Zeit, um einen Stapel von zu betreiben N - 1 Selbstinterpretatoren als N geht in unendlich. Dieser Wert hängt nicht vom ausgeführten Programm ab.

Das Buch Struktur und Interpretation von Computerprogrammen präsentiert Beispiele von Meta-kreisförmige Interpretation für Schema und seine Dialekte. Andere Beispiele für Sprachen mit einem Selbstinterpreter sind Weiter und Pascal.

Mikrocode

Mikrocode ist eine sehr häufig verwendete Technik, "die einen Dolmetscher zwischen der Hardware und der architektonischen Ebene eines Computers auferlegt".[21] Als solches ist der Mikrocode eine Ebene von Anweisungen auf Hardware-Ebene, die höhere Ebene implementieren Maschinensprache Anweisungen oder intern Zustandsmaschine Sequenzierung in vielen Digitale Verarbeitung Elemente. Mikrocode wird im Allgemeinen verwendet Zentrale Verarbeitungseinheitensowie in spezialisierteren Prozessoren wie z. Mikrocontroller, Digitale Signalprozessoren, Kanalcontroller, Festplattencontroller, Netzwerkschnittstellencontroller, Netzwerkprozessoren, Grafikverarbeitungseinheitenund in anderen Hardware.

Der Mikrocode befindet sich typischerweise im speziellen Hochgeschwindigkeitsspeicher und übersetzt Maschinenanweisungen. Zustandsmaschine Daten oder andere Eingaben in Sequenzen detaillierter Operationen auf Schaltungsebene. Es trennt die Maschinenanweisungen von den zugrunde liegenden Elektronik so dass Anweisungen freier und verändert werden können. Es erleichtert auch das Aufbau komplexer mehrstufiger Anweisungen und reduziert gleichzeitig die Komplexität von Computerschaltungen. Das Schreiben von Mikrocode wird oft genannt Mikroprogrammierung und der Mikrocode in einer bestimmten Prozessorimplementierung wird manchmal als a genannt Mikroprogramm.

Umfangreichere Mikrokodierung ermöglicht kleine und einfache Mikroarchitekturen zu emulieren, nacheifern leistungsfähigere Architekturen mit breiteren Wortlänge, mehr Ausführungseinheiten und so weiter, was eine relativ einfache Möglichkeit ist, Softwarekompatibilität zwischen verschiedenen Produkten in einer Prozessorfamilie zu erreichen.

Computerprozessor

Sogar ein nicht mikrokodierender Computerprozessor selbst kann als eine sofortige Ausführungsinterpreter angesehen werden, die in einer allgemeinen Hardware -Beschreibungssprache wie z. B. geschrieben ist VHDL So erstellen Sie ein System, das die Anweisungen für Maschinencode analysiert und sofort ausführt.

Anwendungen

  • Dolmetscher werden häufig zur Ausführung verwendet Befehlssprachen, und Klebersprachen Da jeder in der Befehlssprache ausgeführte Bediener in der Regel ein Aufruf einer komplexen Routine wie Editor oder Compiler ist.
  • Selbstmodifizierender Code kann leicht in einer interpretierten Sprache implementiert werden. Dies bezieht sich auf die Ursprünge der Interpretation in Lisp und künstliche Intelligenz Forschung.
  • Virtualisierung. Der für eine Hardwarearchitektur vorgesehene Maschinencode kann mit a ausgeführt werden virtuelle Maschine. Dies wird häufig verwendet, wenn die beabsichtigte Architektur nicht verfügbar ist, oder unter anderem, um mehrere Kopien auszuführen.
  • Sandboxing: Während einige Arten von Sandkästen auf den Schutz des Betriebssystems angewiesen sind, wird häufig ein Dolmetscher oder eine virtuelle Maschine verwendet. Die tatsächliche Hardware -Architektur und die ursprünglich beabsichtigte Hardwarearchitektur können dieselbe sein oder nicht. Dies mag sinnlos erscheinen, außer dass Sandboxen nicht gezwungen sind, alle Anweisungen des von ihm verarbeitenden Quellcodes auszuführen. Insbesondere kann es sich weigern, Code auszuführen, der gegen jeden verstößt Sicherheit Einschränkungen, unter denen es operiert.
  • Emulatoren Für das Ausführen von Computersoftware für veraltete und nicht verfügbare Hardware für modernere Geräte.

Siehe auch

Verweise

  1. ^ In diesem Sinne die Zentralprozessor ist auch ein Dolmetscher von Maschinenanweisungen.
  2. ^ Obwohl dieses Schema (Kombination von Strategie 2 und 3) verwendet wurde, um bestimmte grundlegende Dolmetscher bereits in den 1970er Jahren zu implementieren, wie z. B. den effizienten grundlegenden Dolmetscher der ABC 80, zum Beispiel.
  3. ^ Bennett, J. M.; Prinz, D. G.; Woods, M. L. (1952). "Interpretative Unterroutinen". Verfahren der ACM National Conference, Toronto.
  4. ^ Nach dem, was berichtet von Paul Graham in Hacker & Maler, p. 185, sagte McCarthy: "Steve Russell sagte, schau, warum programme ich das nicht programme bewerten..., und ich sagte zu ihm, ho, ho, du verwirrt die Theorie mit der Praxis, das bewerten ist zum Lesen vorgesehen, nicht zum Computer. Aber er ging weiter und tat es. Das heißt, er hat das zusammengestellt bewerten in meinem Papier in IBM 704 Maschinencode, Behebung Insektund dann als Lisp -Dolmetscher beworben, was es sicherlich war. Zu diesem Zeitpunkt hatte Lisp im Wesentlichen die Form, die es heute hat ... "
  5. ^ "Warum wurde der erste Compiler vor dem ersten Dolmetscher geschrieben?". ARS Technica. 8. November 2014. Abgerufen 9. November 2014.
  6. ^ Theodore H. Romer, Dennis Lee, Geoffrey M. Voelker, Alec Wolman, Wayne A. Wong, Jean-Loup Baer, ​​Brian N. Bershad und Henry M. Levy. Die Struktur und Leistung von Dolmetschern
  7. ^ Terence Parr, Johannes Luber, Der Unterschied zwischen Compilern und Dolmetschern Archiviert 2014-01-06 am Wayback -Maschine
  8. ^ Kühnel, Claus (1987) [1986]. "4. KLEINCOMPUTER - Eigenschacht und Möglichkitzen" [4. Mikrocomputer - Eigenschaften und Möglichkeiten]. In Erlekampf, Rainer; Mönk, Hans-Joachim (Hrsg.). Mikroelektronik in der Amateurpraxis [Mikroelektronik für den praktischen Amateur] (auf Deutsch) (3 ed.). Berlin: Militärverlag der Deutschen Demokratischen Republik[DE], Leipzig. p. 222. ISBN 3-327-00357-2. 7469332.
  9. ^ Heyne, R. (1984). "Basic-Kompreter für U880" [Grundkompreter für U880 (Z80)]. Radio-Fernsehn-Elektronik[DE] (auf Deutsch). 1984 (3): 150–152.
  10. ^ AST -Zwischendarstellungen, Lambda das ultimative Forum
  11. ^ Kistler, Thomas; Franz, Michael (Februar 1999). "Eine baumbasierte Alternative zu Java-Byte-Codes" (PDF). Internationales Journal of Parallel Programing. 27 (1): 21–33. Citeseerx 10.1.1.87.2257. doi:10.1023/a: 1018740018601. ISSN 0885-7458. S2CID 14330985. Abgerufen 2020-12-20.
  12. ^ Surfin 'Safari - Blog -Archiv »Ankündigung von Squirrelfish. Webkit.org (2008-06-02). Abgerufen am 2013-08-10.
  13. ^ Aycock 2003, 2. JIT -Kompilierungstechniken, 2.1 Genesis, p. 98.
  14. ^ L. Deutsch, A. Schiffman, Effiziente Implementierung des SmallTalk-80-Systems, Proceedings of 11. Popl Symposium, 1984.
  15. ^ a b "OpenJDK/JDK". GitHub. 18. November 2021.
  16. ^ https://openjdk.java.net/groups/hotspot/docs/runtimeoverview.html#interPreter
  17. ^ "Entmystifizierung der JVM: JVM -Varianten, CPPInterPreter und TemplateInterPreter". metbalci.com.
  18. ^ "JVM -Template Interpreter". Programmierer.
  19. ^ Bondorf, Anders. "Logimix: Ein selbstantragbarer partieller Bewerter für Prolog. "Synthese und Transformation der Logikprogramme. Springer, London, 1993. 214-227.
  20. ^ Gifford, Clive. "Eigenratios von Selbstinterpretieren". Blogger. Abgerufen 10. November 2019.
  21. ^ Kent, Allen;Williams, James G. (5. April 1993). Enzyklopädie der Informatik und Technologie: Band 28 - Ergänzung 13. New York: Marcel Dekker, Inc. ISBN 0-8247-2281-7. Abgerufen 17. Januar, 2016.

Externe Links