Qual è la definizione esatta di un Metacircular interprete?
-
18-09-2019 - |
Domanda
E 'legale per chiamare un compilatore C scritto in C o di un interprete PHP scritto in PHP metacircular? È questa definizione vale solo per le lingue di un tipo specifico, come Lisp? In breve, quali sono le condizioni che un interprete dovrebbe soddisfare per essere chiamato Metacircular?
Soluzione
Un interprete metacircular è un interprete scritto in un (forse più di base) l'attuazione della stessa lingua. Questo è solitamente fatto a sperimentare con l'aggiunta di nuove funzionalità per una lingua, o la creazione di un dialetto diverso.
Il motivo per cui questo processo è associato con Lisp è a causa della carta altamente lucida "L'arte della Interprete" , che mostra diversi interpreti metacircular basati su Scheme. (La carta è il kernel per il libro SICP, e il suo quarto capitolo funziona attraverso gli altri che creano ad esempio uno schema pigramente-valutato.)
Questo è anche enormemente più facile da fare in una lingua "homoiconic" (un linguaggio il cui codice può essere manipolata come dati in fase di esecuzione), come Lisp, Prolog, e indietro.
Per quanto riguarda la tua domanda diretta - il compilatore C non sarebbe in un interprete a tutti. Un compilatore scritta nella propria lingua è 'self-hosting', che è una proprietà simile, ma più legato al bootstrapping. Un interprete PHP in PHP probabilmente non sarebbe contare, dal momento che si sarebbe probabilmente ri-attuazione di un importo non banale del linguaggio nel processo. Il principale vantaggio di un interprete metacircular convenzionale è che questo modo non è necessario - è possibile collegare il parser esistente, raccolta dei rifiuti (se presente), ecc, e solo scrivere un valutatore di livello superiore con differenti semantica. Nello Schema o Prolog, è spesso meno di una pagina di codice.
Altri suggerimenti
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 sono direttamente applicato a il codice sorgente interpretato, senza alcuna necessità di ulteriori implementazione.
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.
- A (ipotetica) interprete PHP scritto in PHP sarebbe un auto interprete, ma non necessariamente metacircular.
Per completare le risposte di cui sopra: http://www.c2.com/cgi/wiki ? MetaCircularEvaluator
A quanto ho capito, un interprete metacircular è un interprete in grado di interpretare se stessa.
Un compilatore traduce solo il codice, e non esegue esso.
Turing-complete lingua è matematicamente in grado di emulare qualsiasi calcolo logico, quindi ecco un esempio utilizzando Python . Invece di usare CPython a tradurre questo codice per istruzioni della CPU ed eseguirlo, si potrebbe anche usare PyPy . Quest'ultimo è bootstrap , così soddisfa un criterio arbitrario che alcune persone usano per definire un < a href = "http://c2.com/cgi/wiki?MetaCircularEvaluator" rel = "nofollow"> metacircular interprete .
"""
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)