Question

Est-il légal d'appeler un compilateur C écrit en C ou un interpréteur PHP écrit en PHP metacircular? Cette définition est valable uniquement pour les langues d'un type particulier, comme Lisp? En bref, quelles sont les conditions qu'un interprète doit satisfaire pour être appelé Metacircular?

Était-ce utile?

La solution

Un interprète metacircular est un interprète écrit dans un (peut-être plus basique) mise en œuvre de la même langue. Cela se fait généralement à expérimenter avec l'ajout de nouvelles fonctionnalités à une langue, ou la création d'un dialecte différent.

La raison pour laquelle ce processus est associé à Lisp est à cause du papier très lucide « L'art de l'interprète » , qui montre plusieurs interprètes metacircular fondé sur un schéma. (Le document est le noyau pour le SICP du livre, et son quatrième chapitre fonctionne à travers d'autres qui créent par exemple un schéma paresseusement-évalué.)

est largement plus facile à faire dans une langue "homoiconic" (une langue dont le code peut être manipulé en tant que données lors de l'exécution), comme Lisp, Prolog et Forth.

Quant à votre question directe - le compilateur C ne serait pas un interprète du tout. Un compilateur écrit dans sa propre langue est « auto-hébergement », qui est une propriété similaire, mais plus liée à bootstrapping. Un interpréteur PHP en PHP ne compterait pas sans doute, puisque vous serait probablement réimplémenter une quantité non négligeable de la langue dans le processus. Le principal avantage d'un interprète metacircular classique est que Le faire est pas nécessaire - vous pouvez brancher l'analyseur existant, la collecte des ordures (le cas échéant), etc., et il suffit d'écrire un évaluateur de niveau supérieur avec une sémantique différente. Dans le schéma ou Prolog, il est souvent moins d'une page de code.

Autres conseils

Voici une définition de la page wikipedia pour metacircular :

  

Un évaluateur de méta-circulaire est un spécial   cas d'une auto-interprète dans laquelle   les installations existantes de la société mère   interprète sont appliqués directement sur   le code source étant interprété,   sans avoir besoin de plus   la mise en œuvre.

Alors la réponse est non dans les deux cas:

  • Un compilateur C est pas un interprète (évaluateur). Il se traduit par un programme d'une forme à une autre sans l'exécuter.
  • A (hypothétique) interpréteur PHP écrit en PHP serait un interprète auto, mais pas nécessairement metacircular.

Pour compléter les réponses ci-dessus: http://www.c2.com/cgi/wiki ? MetaCircularEvaluator

Si je comprends bien, un interprète metacircular est un interprète qui peut s'interpréter.

Un compilateur de code traduit uniquement, et ne l'exécute pas.

Tous langue Turing-complet est mathématiquement en mesure d'imiter tout calcul logique, donc voici un exemple en utilisant Python . Au lieu d'utiliser CPython pour traduire ce code aux instructions CPU et l'exécuter, vous pouvez aussi utiliser PyPy . Ce dernier est bootstrappés, donc un critère arbitraire répond que certaines personnes utilisent pour définir une < a href = "http://c2.com/cgi/wiki?MetaCircularEvaluator" rel = "nofollow"> interprète metacircular .

"""
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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top