Frage

Ist es legal, einen C -Compiler anzurufen, der in C oder einem PHP -Dolmetscher in PHP -MetaCircular geschrieben wurde? Ist diese Definition nur für Sprachen eines bestimmten Typs gültig, wie LISP? Kurz gesagt, welche Bedingungen sollten ein Dolmetscher befriedigen, wenn er als Metaccircular bezeichnet wird?

War es hilfreich?

Lösung

Ein MetaCircular -Dolmetscher ist ein Dolmetscher, der in einer (möglicherweise grundlegenden) Implementierung derselben Sprache geschrieben wurde. Dies wird normalerweise durchgeführt, um mit dem Hinzufügen neuer Funktionen zu einer Sprache oder dem Erstellen eines anderen Dialekts zu experimentieren.

Der Grund, warum dieser Prozess mit LISP verbunden ist "Die Kunst des Dolmetschers", was mehrere metaccircular -Dolmetscher auf der Grundlage des Schemas zeigt. (Das Papier ist der Kernel für das Buch SICP, und sein viertes Kapitel funktioniert durch andere, die z. B. ein faul evaluiertes Schema schaffen.)

Das ist auch erheblich Einfacher in einer "homoikonischen" Sprache (einer Sprache, deren Code zur Laufzeit als Daten manipuliert werden kann) wie Lisp, Prolog und Forth.

In Bezug auf Ihre direkte Frage wäre der C -Compiler überhaupt kein Dolmetscher. Ein Compiler, der in einer eigenen Sprache geschrieben wurde, ist "Selbsthosting", was eine ähnliche Eigenschaft ist, aber eher mit Bootstrapping zusammenhängt. Ein PHP-Dolmetscher in PHP würde wahrscheinlich nicht zählen, da Sie wahrscheinlich eine nicht triviale Menge der Sprache im Prozess neu implementieren würden. Der Hauptvorteil eines herkömmlichen Metaccircular -Dolmetschers ist das, dass Dies ist nicht notwendig - Sie können den vorhandenen Parser, die Müllsammlung (falls vorhanden) usw. anschließen und einfach einen Bewerter auf der Top-Ebene mit unterschiedlichen Semantik schreiben. In Schema oder Prolog ist es oft weniger als eine Codeseite.

Andere Tipps

Hier ist eine Definition von der Wikipedia -Seite für metaCircular:

Ein Meta-kreisförmiger Bewerter ist ein Sonderfall eines Selbstinterpreters, in dem die vorhandenen Einrichtungen des übergeordneten Dolmetschers direkt auf den zu interpretierenden Quellcode angewendet werden, ohne dass eine zusätzliche Implementierung erforderlich ist.

Die Antwort ist also in beiden Fällen Nein:

  • Wechselstrom Compiler ist kein Dolmetscher (Bewerter). Es übersetzt ein Programm von einer Form in eine andere, ohne es auszuführen.
  • Ein (hypothetischer) PHP -Interpreter, der in PHP geschrieben wurde, wäre ein Selbstdolmetscher, aber nicht unbedingt metaCircular.

Um die obigen Antworten zu ergänzen: http://www.c2.com/cgi/wiki?metacircularevaluator

So wie ich es verstehe, Ein MetaCircular -Dolmetscher ist ein Dolmetscher, der sich selbst interpretieren kann.

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

Irgendein Turing-Complete-Sprache ist mathematisch in der Lage, jede logische Berechnung zu emulieren. Hier finden Sie ein Beispiel verwendet Python. Anstatt CPython zu verwenden, um diesen Code in CPU -Anweisungen zu übersetzen und ihn auszuführen, können Sie auch verwenden Pypy. Letzteres ist Bootstraße, erfüllt also ein willkürliches Kriterium, mit dem manche Menschen a definieren können MetaCircular Interpreter.

"""
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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top