¿Es legal llamar a un compilador de C escrito en C o un intérprete de PHP escrito en PHP metacircular? ¿Es válida esta definición solo para idiomas de un tipo específico, como Lisp? En resumen, ¿cuáles son las condiciones que debe cumplir un intérprete para llamarse Metacircular?¿Cuál es la definición exacta de un intérprete metacircular?
Respuesta
Un intérprete metacircular es un intérprete escrito en una implementación (posiblemente más básica) del mismo idioma. Esto generalmente se hace para experimentar con agregar nuevas características a un idioma o crear un dialecto diferente.
La razón por la que este proceso está asociado con Lisp es debido al papel altamente lúcido "The Art of the Interpreter", que muestra varios intérpretes metacirculares basados en Scheme. (El papel es el núcleo para el libro SICP, y su cuarto capítulo trabaja a través de otras personas que crean por ejemplo, un sistema a la evaluación perezosa.)
Ésta es también enormemente más fácil de hacer en un lenguaje "homoiconic" (una lengua cuyo código se puede manipular 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 en absoluto. Un compilador escrito en su propio idioma es 'self-hosting', que es una propiedad similar, pero está más relacionado con el bootstrapping. Es probable que un intérprete PHP en PHP no cuente, ya que es probable que vuelva a implementar una cantidad no trivial del idioma en el proceso. El principal beneficio de un intérprete metacircular convencional es que no es necesario - puede conectar el analizador existente, la recolección de elementos no utilizados (si corresponde), etc., y simplemente escribir un evaluador de nivel superior con semántica diferente. En Scheme o Prolog, a menudo es menos que una página de código.
la razón por la que esto se asocia con Lisp es que McCarthy (es posible que haya oído hablar de él) dio una descripción de la evaluación de Lisp en Lisp. –
Si bien el Lisp original se definió en términos de sí mismo en el papel (antes de su implementación, lo cual es una historia interesante en sí misma), AotI/SICP probablemente haya hecho más para popularizar directamente la idea y (en particular) el término De eso se trata la pregunta. También, de hecho he oído hablar de él. ¿Era esto realmente necesario? – silentbicycle
di lo que quieras, el término está asociado con Lisp a través del famoso artículo de McCarthy. Es bueno que un documento de Scheme y algunos libros recojan la idea 17 años después. –
Aquí es una definición de la página de Wikipedia para metacircular:
Un evaluador meta-circular es una caso especial de un auto-intérprete en el que las instalaciones existentes de la intérprete padres se aplican directamente a el código fuente interpretado, sin necesidad de implementación adicional .
Así que la respuesta es no, en ambos casos:
- Un compilador de C no es un intérprete (evaluador). Traduce un programa de una forma a otra sin ejecutarlo.
- Un intérprete PHP (hipotético) escrito en PHP sería un autor intérprete, pero no necesariamente metacircular.
Para complementar las respuestas anteriores: http://www.c2.com/cgi/wiki?MetaCircularEvaluator
como yo lo entiendo, un intérprete de metacircular es un intérprete que puede interpretarse a sí misma.
Un compilador solo traduce el código y no lo ejecuta.
Cualquiera Turing-complete language matemáticamente es capaz de emular cualquier cálculo lógico, así que aquí hay un ejemplo usando Python. En lugar de usar CPython para traducir este código a las instrucciones de la CPU y ejecutarlo, también puede usar PyPy.Este último es bootstrapped, por lo que cumple con algunos criterios arbitrarios que algunas personas utilizan para definir un 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)
¿Por qué el voto a favor? –
Este no es un intérprete Meta-circular. Ni siquiera es un intérprete, es un preprocesador. :) – Tobias
@Tobias Esa es una meta característica de muestra. ¿Qué pasa con 'exec (object [, globals [, locals]])' - [Esta función admite la ejecución dinámica del código de Python.] (Https://docs.python.org/3/library/functions.html#exec) –
- 1. ¿Cuál es la definición exacta de "Token?"
- 2. ¿Cuál es la definición exacta de un cierre?
- 3. Cómo incrustar fuentes en un archivo EPS - y cuál es la definición exacta de "incrustación"?
- 4. ¿Cuál es la definición exacta del patrón de diseño de la estrategia?
- 5. ¿Cuál es la definición de un detalle de implementación?
- 6. ¿Cuál es la diferencia entre un REPL y un intérprete?
- 7. ¿Cuál es la definición de la altura de un árbol?
- 8. Cuál es la definición de proxy-aware
- 9. ¿Diferencia exacta entre el compilador y el intérprete?
- 10. ¿Cuál es la definición de HTTP_X_PURPOSE?
- 11. ¿Cuál es la definición de "código heredado"?
- 12. ¿Cuál es la definición de dormido para un dispositivo Android?
- 13. ¿Cuál es la definición precisa de un set lookahead?
- 14. ¿Es la JVM un compilador o un intérprete?
- 15. ¿El INTÉRPRETE es un antipatrón?
- 16. ¿Cuál es la definición de una celda de Lisp Cons?
- 17. ¿Cuál es la definición de objeto de servicio?
- 18. Cobertura básica de bloque: ¿cuál es la definición precisa?
- 19. ¿Cuál es el "mejor" intérprete de lolcode de código abierto?
- 20. CPython es un intérprete de bytecode?
- 21. ¿Cuál es la diferencia exacta entre la propiedad currentTarget y la propiedad de destino en javascript
- 22. ¿Cuál es el mejor (y gratis) intérprete de APL?
- 23. Cómo ejecutar el Evaluador Metacircular en DrRacket
- 24. ¿Cuál es la estructura de respuesta exacta para el código de estado HTTP 300 (opciones múltiples)?
- 25. ¿Googles GOLANG es un intérprete o compilador?
- 26. ¿Es un typedef una definición?
- 27. ¿Qué es un framework PHP y cuál es bueno?
- 28. condicionales de definición de objeto JavaScript - ¿cuál es mejor?
- 29. cuál es la forma exacta de usar el directorio Endorsed en jdk1.6
- 30. ¿Cuál es el propósito de un doble negativo en la definición de macro, como (!! (expr))?
JFYI, este es uno de los temas que se tratan en el libro de texto de PLAI (ver www.plai.org). Leer eso probablemente funcionará mejor que leer wikipedia. –