È legale chiamare un compilatore C scritto in C o un interprete PHP scritto in PHP metacircolare? Questa definizione è valida solo per le lingue di un tipo specifico, come il Lisp? In breve, quali sono le condizioni che un interprete dovrebbe soddisfare per essere chiamato Metacircolare?Qual è la definizione esatta di un interprete Metacircolare?
risposta
Un interprete metacircolare è un interprete scritto in un'implementazione (possibilmente più basilare) della stessa lingua. Questo di solito viene fatto per sperimentare l'aggiunta di nuove funzionalità a una lingua o la creazione di un dialetto diverso.
Il motivo per cui questo processo è associato a Lisp è dovuto alla carta molto lucida "The Art of the Interpreter", che mostra diversi interpreti metacolari basati su Schema. (La carta è il kernel per il libro SICP, e il suo quarto capitolo funziona attraverso gli altri che creano ad esempio, uno schema di pigramente-valutato.)
Questo è anche enormemente più facile da fare in una lingua "homoiconic" (una lingua il cui codice può essere manipolato come dati in fase di esecuzione), come Lisp, Prolog e Forth.
Per quanto riguarda la tua domanda diretta, il compilatore C non sarebbe affatto un interprete. Un compilatore scritto nella sua lingua è 'self-hosting', che è una proprietà simile, ma più legata al bootstrap. Un interprete PHP in PHP probabilmente non conterebbe, dal momento che probabilmente si sta ri-implementando una quantità non banale della lingua nel processo. Il principale vantaggio di un interprete metacircolare convenzionale è che non è necessario - è possibile collegare il parser esistente, la garbage collection (se presente), ecc. E scrivere semplicemente un valutatore di primo livello con semantica diversa. In Scheme o Prolog, è spesso inferiore a una pagina di codice.
il motivo per cui questo è associato a Lisp è che McCarthy (potresti aver sentito parlare di lui) ha fornito una descrizione della valutazione Lisp in Lisp. –
Mentre il Lisp originale era definito in termini di se stesso su carta (prima che fosse mai implementato, che è una storia interessante a sé stante), AotI/SICP hanno probabilmente fatto di più per diffondere direttamente l'idea e (in particolare) il termine , qual è la domanda. Inoltre, ho sentito parlare di lui. Era davvero necessario? – silentbicycle
dire quello che vuoi, il termine è associato a Lisp tramite il famoso articolo di McCarthy. Bello che un documento Scheme e alcuni libri riprendono l'idea 17 anni dopo. –
Ecco una definizione dalla pagina di Wikipedia per metacircular:
Un valutatore meta-circolare è una speciale caso di un auto-interprete in cui le strutture esistenti della controllante interprete vengono applicate direttamente a il codice sorgente interpretato, senza necessità di implementazione aggiuntiva .
Quindi la risposta è no in entrambi i casi:
- Un compilatore C non è un interprete (valutatore). Traduce un programma da una forma all'altra senza eseguirlo.
- Un (ipotetico) interprete PHP scritto in PHP sarebbe un autointerprete, ma non necessariamente metacircolare.
per integrare le risposte di cui sopra: http://www.c2.com/cgi/wiki?MetaCircularEvaluator
se ho capito bene, un interprete metacircular è un interprete in grado di interpretare se stessa.
Un compilatore traduce solo il codice e non lo esegue.
Qualsiasi Turing-complete language è matematicamente in grado di emulare qualsiasi calcolo logico, quindi ecco un esempio utilizzando Python. Invece di usare CPython per tradurre questo codice in istruzioni della CPU ed eseguirlo, potresti anche usare PyPy.Quest'ultimo è bootstrapped, quindi soddisfa alcuni criteri arbitrari che alcune persone usano per definire uno 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)
Perché il downvote? –
Questo non è un interprete Meta-circolare. Non è nemmeno un interprete, è un prerprocessore. :) – Tobias
@Tobias Questa è una meta funzione di esempio. Che dire di 'exec (oggetto [, globals [, locals]]) - [Questa funzione supporta l'esecuzione dinamica del codice Python.] (Https://docs.python.org/3/library/functions.html#exec) –
JFYI, questo è uno dei temi trattati nel manuale di PLAI (vedere www.plai.org). Leggendo che probabilmente funzionerà meglio di leggere wikipedia. –