Pregunta

¿Es legal para llamar a un compilador de C escrito en C o un intérprete de PHP escrito en PHP metacircular? Esta definición es válida sólo para los idiomas de un tipo específico, como Lisp? En pocas palabras, ¿cuáles son las condiciones que debe satisfacer un intérprete para ser llamado Metacircular?

¿Fue útil?

Solución

Un intérprete metacircular es un intérprete escrito en una aplicación (posiblemente más básica) del mismo idioma. Esto se hace generalmente a experimentar con la adición de nuevas características para una lengua, o la creación de un dialecto diferente.

La razón de este proceso está asociado con Lisp es debido al papel altamente lúcido "El arte de la intérprete" , que muestra varios intérpretes metacircular basado en el Esquema. (El papel es el núcleo de la SICP libro, y su cuarto capítulo trabaja a través de otras personas que crean por ejemplo, un sistema a la evaluación perezosa.)

Este es también muy más fácil de hacer en un lenguaje "homoiconic" (un lenguaje cuyo código puede ser manipulada como datos en tiempo de ejecución), tales como Lisp, Prolog, y adelante.

En cuanto a su pregunta directa - el compilador de C no sería un intérprete en absoluto. Un compilador escrito en su propio idioma es 'autoalojamiento', que es una propiedad similar, pero más relacionado con bootstrapping. Un intérprete de PHP en PHP probablemente no contaría, ya que es probable que sea re-implementando una cantidad no trivial de la lengua en el proceso. El mayor beneficio de un intérprete metacircular convencional es que hacerlo no es necesario - se puede conectar el analizador existente, la recolección de basura (si lo hay), etc., y acaba de escribir un evaluador de alto nivel con una semántica diferente. En el esquema o Prolog, que es a menudo menos de una página de código.

Otros consejos

Aquí es una definición de la página de Wikipedia para metacircular :

  

Un evaluador meta-circular es una especial   caso de una auto-intérprete en la que   las instalaciones existentes de la matriz   intérprete se aplican directamente a   el código fuente se interpreta,   sin necesidad de adicionales   aplicación.

Así que la respuesta es no, en ambos casos:

  • Un compilador C no es un intérprete (evaluador). Se traduce un programa de una forma a otra sin ejecutarlo.
  • A (hipotético) PHP intérprete escrito en PHP sería un intérprete de uno mismo, pero no necesariamente metacircular.

Para complementar las respuestas anteriores: http://www.c2.com/cgi/wiki ? MetaCircularEvaluator

Como lo entiendo, un intérprete de metacircular es un intérprete que puede interpretarse a sí misma.

Un compilador traduce el código solamente, y no lo ejecuta.

Turing completo lenguaje es matemáticamente capaz de emular cualquier cálculo lógico, por lo que aquí es un ejemplo utilizando Python . En lugar de utilizar CPython para traducir el código de instrucciones de la CPU y ejecutarlo, también se puede utilizar PyPy . Este último es bootstrapped, por lo que cumple algún criterio arbitrario que algunas personas usan para definir un < a href = "http://c2.com/cgi/wiki?MetaCircularEvaluator" rel = "nofollow"> metacircular intérprete .

"""
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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top