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?

È stato utile?

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top