simultaneo - ¿Cuál es la definición exacta de un intérprete metacircular?
traduccion simultanea carrera (4)
¿Es legal llamar a un compilador de C escrito en C o a un intérprete de PHP escrito en PHP metacircular? ¿Es esta definición válida solo para idiomas de un tipo específico, como Lisp? En resumen, ¿cuáles son las condiciones que debe cumplir un intérprete para ser llamado Metacircular?
Aquí hay una definición de la página de wikipedia para metacircular :
Un evaluador meta-circular es un caso especial de un auto-intérprete en el que las instalaciones existentes del intérprete principal se aplican directamente al código fuente que se está interpretando, sin necesidad de implementación adicional.
Entonces la respuesta es no en ambos casos:
- El compilador de CA no es un intérprete (evaluador). Traduce un programa de una forma a otra sin ejecutarlo.
- Un intérprete de PHP (hipotético) escrito en PHP sería un auto intérprete, pero no necesariamente metacircular.
Como yo lo entiendo, un intérprete metacircular es un intérprete que puede interpretarse a sí mismo.
Un compilador solo traduce el código y no lo ejecuta.
Cualquier lenguaje de Turing-complete es matemáticamente capaz de emular cualquier cálculo lógico, así que aquí hay un ejemplo que usa Python . En lugar de usar CPython para traducir este código a las instrucciones de la CPU y ejecutarlo, también puede usar PyPy . El último es bootstrapped , por lo que cumple con un criterio arbitrario que algunas personas usan para definir un intérprete 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 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)
Para complementar las respuestas anteriores: http://www.c2.com/cgi/wiki?MetaCircularEvaluator
Un intérprete metacircular es un intérprete escrito en una implementación (posiblemente más básica) del mismo lenguaje. Esto generalmente se hace para experimentar con agregar nuevas funciones a un idioma o crear un dialecto diferente.
La razón por la que este proceso está asociado con Lisp es por el papel altamente lúcido "El arte del intérprete" , que muestra varios intérpretes metacirculares basados en el Esquema. (El documento es el núcleo del libro SICP, y su cuarto capítulo funciona a través de otros que crean, por ejemplo, un esquema evaluado perezosamente).
Esto también es mucho más fácil de hacer en un lenguaje "homoicónico" (un lenguaje cuyo código puede ser manipulado como datos en tiempo de ejecución), como Lisp, Prolog y Forth.
En cuanto a su pregunta directa, el compilador de C no sería un intérprete. Un compilador escrito en su propio idioma es ''self-hosting'', que es una propiedad similar, pero más relacionada con el bootstrapping. Un intérprete de PHP en PHP probablemente no contaría, ya que es probable que esté reimplementando una cantidad no trivial del lenguaje en el proceso. El principal beneficio de un intérprete metacircular convencional es que no es necesario hacerlo ; puede conectar el analizador existente, la recolección de basura (si corresponde), etc., y simplemente escribir un evaluador de nivel superior con diferentes semánticas. En Esquema o Prólogo, a menudo es menos que una página de código.