2009-09-26 19 views
18

¿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?

+1

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. –

Respuesta

21

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.

+3

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. –

+4

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

+2

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. –

5

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.
-1

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) 
+0

¿Por qué el voto a favor? –

+0

Este no es un intérprete Meta-circular. Ni siquiera es un intérprete, es un preprocesador. :) – Tobias

+0

@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) –

Cuestiones relacionadas