2009-09-26 9 views
18

Ist es legal, einen C-Compiler in C geschrieben oder einen PHP-Interpreter in PHP metacircular zu nennen? Ist diese Definition nur für Sprachen eines bestimmten Typs wie Lisp gültig? Kurz gesagt, unter welchen Bedingungen sollte ein Dolmetscher die Bezeichnung "metacircular" erfüllen? HierWas ist die genaue Definition eines Metacircular Interpreter?

+1

JFYI, dies ist eines der Themen, die im PLAI-Lehrbuch behandelt werden (siehe www.plai.org). Das Lesen wird wahrscheinlich besser funktionieren als das Lesen von Wikipedia. –

Antwort

21

Ein metakreisförmiger Interpreter ist ein Interpreter, der in einer (möglicherweise mehr grundlegenden) Implementierung derselben Sprache geschrieben wurde. Dies geschieht normalerweise, um mit dem Hinzufügen neuer Features zu einer Sprache oder dem Erstellen eines anderen Dialekts zu experimentieren.

Der Grund, dass dieser Prozess mit Lisp verbunden ist, ist wegen der sehr klaren Papier "The Art of the Interpreter", die mehrere metacircular Interpreter basierend auf Scheme zeigt. (Das Papier ist der Kern für das Buch SICP und seine vierte Kapitel arbeitet durch andere, zB eine träge bewertet Schema erstellen.)

Dies ist auch erheblich einfacher, in einer „homoiconic“ Sprache zu tun (eine Sprache deren Code zur Laufzeit als Daten manipuliert werden kann, wie zB Lisp, Prolog und Forth.

Zu Ihrer direkten Frage - der C-Compiler wäre überhaupt kein Interpreter. Ein Compiler, der in seiner eigenen Sprache geschrieben wurde, ist "self-hosting", was eine ähnliche Eigenschaft ist, aber mehr mit Bootstrapping zusammenhängt. Ein PHP-Interpreter in PHP würde wahrscheinlich nicht zählen, da Sie wahrscheinlich eine nichttriviale Menge der Sprache in diesem Prozess wieder implementieren würden. Der Hauptvorteil eines konventionellen metacircular Interpreters ist, dass dies nicht notwendig ist - Sie können den vorhandenen Parser, Garbage Collection (falls vorhanden), etc., und schreiben Sie einfach eine Top-Level-Evaluator mit unterschiedlicher Semantik. In Scheme oder Prolog ist es oft weniger als eine Code-Seite.

+3

Der Grund, warum dies mit Lisp verbunden ist, ist, dass McCarthy (Sie haben vielleicht schon von ihm gehört) eine Beschreibung der Lisp-Auswertung in Lisp gegeben hat. –

+4

Während das ursprüngliche Lisp in sich selbst auf Papier definiert wurde (bevor es jemals umgesetzt wurde, was eine interessante Geschichte für sich ist), haben AotI/SICP wahrscheinlich mehr getan, um die Idee und (insbesondere) den Begriff direkt zu popularisieren Worum geht es in der Frage? Auch ich habe tatsächlich von ihm gehört. War das wirklich nötig? – silentbicycle

+2

sagen, was Sie wollen, ist der Begriff mit Lisp über McCarthy's berühmten Papier verbunden. Schön, dass ein Scheme-Papier und einige Bücher die Idee 17 Jahre später aufgreifen. –

5

ist eine Definition aus der Wikipedia-Seite für metacircular:

Ein Meta-Kreis Evaluator ist ein spezieller Fall eines Selbst Dolmetscher, in der die bestehenden Einrichtungen der Mutter Interpreter direkt angewandt zu der Quellcode interpretiert wird, ohne zusätzliche Implementierung erforderlich.

Die Antwort ist also nicht in beiden Fällen:

  • Ein C-Compiler nicht ein Dolmetscher ist (Auswerter). Es übersetzt ein Programm von einem Formular in ein anderes, ohne es auszuführen.
  • Ein (hypothetischer) in PHP geschriebener PHP-Interpreter wäre ein eigener Interpreter, aber nicht unbedingt metakristallin.
-1

wie ich es verstehe, ein metacircular Interpreter ist ein Interpreter, der selbst interpretieren kann.

Ein Compiler übersetzt nur Code und führt ihn nicht aus.

Beliebig Turing-complete language ist mathematisch in der Lage, jede logische Berechnung zu emulieren, also hier ein Beispiel mit Python. Anstatt CPython zu verwenden, um diesen Code in CPU-Anweisungen zu übersetzen und auszuführen, können Sie auch verwenden.Letzteres ist bootstrapped, erfüllt also ein beliebiges Kriterium, das manche Leute verwenden, um ein metacircular interpreter zu definieren.

""" 
Metacircular Python interpreter with macro feature. 
By Cees Timmerman, 14aug13. 
""" 

import re 

def meta_python_exec(code): 
    # Optional meta feature. 
    re_macros = re.compile("^#define (\S+) ([^\r\n]+)", re.MULTILINE) 
    macros = re_macros.findall(code) 
    code = re_macros.sub("", code) 
    for m in macros: 
     code = code.replace(m[0], m[1]) 

    # Run the code. 
    exec(code) 

if __name__ == "__main__": 
    #code = open("metacircular_overflow.py", "r").read() # Causes a stack overflow in Python 3.2.3, but simply raises "RuntimeError: maximum recursion depth exceeded while calling a Python object" in Python 2.7.3. 
    code = "#define 1 2\r\nprint(1 + 1)" 
    meta_python_exec(code) 
+0

Warum der Downvote? –

+0

Dies ist kein Meta-Zirkular-Interpreter. Es ist nicht einmal ein Interpreter, es ist ein Preroprozessor. :) – Tobias

+0

@Tobias Das ist eine Beispiel-Meta-Funktion. Was ist mit 'exec (object [, globals [, local]])' - [Diese Funktion unterstützt die dynamische Ausführung von Python-Code.] (Https://docs.python.org/3/library/functions.html#exec) –

Verwandte Themen