2009-09-26 12 views
18

Czy można legalnie nazywać kompilatorem C napisanym w języku C lub interpreerem PHP napisanym w metakirkularnym języku PHP? Czy ta definicja jest ważna tylko dla języków określonego typu, takich jak Lisp? Krótko mówiąc, jakie są warunki, które tłumacz powinien spełnić, by nazywać się Metakircular?Jaka jest dokładna definicja interpretera metakirycznego?

+1

JFYI, jest to jedno z zagadnień omawianych w podręczniku PLAI (patrz www.plai.org). Czytanie, które prawdopodobnie lepiej się sprawdzi niż czytanie wikipedii. –

Odpowiedz

21

Interpreter metakrylowy jest tłumaczem napisanym w (prawdopodobnie bardziej podstawowym) wykonaniu tego samego języka. Zazwyczaj robi się to w celu eksperymentowania z dodawaniem nowych funkcji do języka lub tworzenia innego dialektu.

Powodem, dla którego proces ten jest związany z Lisp, jest bardzo przejrzysty papier "The Art of the Interpreter", który pokazuje kilku tłumaczy metakirycznych opartych na Schemacie. (Papier jest jądra dla książki SICP, a jej czwarty rozdział działa poprzez innych, które tworzą np leniwie-ocenianego Scheme).

Jest również znacznie łatwiej zrobić w „homoiconic” języka (język którego kod można manipulować jako dane w czasie wykonywania), takich jak Lisp, Prolog i Forth.

Co do twojego bezpośredniego pytania - kompilator języka C wcale nie byłby tłumaczem. Kompilator napisany w swoim własnym języku to "samo-hosting", który jest podobną własnością, ale bardziej związany z ładowaniem. Tłumacz PHP w PHP prawdopodobnie by się nie liczył, ponieważ prawdopodobnie ponownie wdrożysz nietrywialną ilość języka w procesie. Główną zaletą konwencjonalnego interpretera metakomórkowego jest to, że nie jest konieczne - można podłączyć istniejący parser, wyrzucanie elementów do pamięci (jeśli istnieje) itp. I po prostu napisać ewaluator najwyższego poziomu z inną semantyką. W Scheme lub Prolog często jest to mniej niż strona kodu.

+3

powodem, dla którego jest to związane z Lispem jest to, że McCarthy (być może słyszałeś o nim) podał opis oceny Lispa w Lisp. –

+4

Podczas gdy oryginalny Lisp został zdefiniowany sam w sobie na papierze (zanim został kiedykolwiek zaimplementowany, co jest ciekawą historią samą w sobie), AotI/SICP prawdopodobnie zrobili więcej, aby bezpośrednio popularyzować ideę i (w szczególności) termin , o to właśnie chodzi. Co więcej, faktycznie o nim słyszałem. Czy to naprawdę było potrzebne? – silentbicycle

+2

mówią, co chcesz, termin jest związany z Lisp za pośrednictwem słynnego papieru McCarthy'ego. Fajnie, że papier Scheme i niektóre książki wychwytują ten pomysł 17 lat później. –

5

Oto definicja ze strony wikipedia dla metacircular:

Metaanaliza okrągły oceniający jest specjalnym przypadek samodzielnego tłumacza w którym istniejących obiektów rodzica tłumacza są bezpośrednio stosowane do kodu źródłowego, który jest interpretowany, bez potrzeby dodatkowej implementacji .

Więc odpowiedź brzmi: nie, w obu przypadkach jest:

  • A C kompilator nie jest interpreter (oceniający). Przekłada program z jednej formy na inną bez jej wykonywania.
  • A (hipotetyczny) PHP interpreter napisany w PHP byłby tłumaczem, ale niekoniecznie metakirycznym.
-1

jak rozumiem, metacircular interpreter jest interpreter, które można zinterpretować sam.

Kompilator tylko tłumaczy kod i nie wykonuje go.

Dowolnie Turing-complete language jest matematycznie w stanie emulować dowolne obliczenia logiczne, więc oto przykład przy użyciu Python. Zamiast używać CPython do przetłumaczenia tego kodu na instrukcje CPU i jego wykonania, można również użyć PyPy.Ta ostatnia jest bootstrapped, więc spełnia pewne arbitralne kryterium, które niektórzy ludzie używają do zdefiniowania 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

Dlaczego upadek? –

+0

To nie jest interpreter meta-kolisty. Nie jest nawet tłumaczem, jest preprocesorem. :) – Tobias

+0

@Tobias To jest przykładowa funkcja meta. A co z 'exec (object [, globals [, locals]])' - [Ta funkcja obsługuje dynamiczne wykonywanie kodu Pythona.] (Https://docs.python.org/3/library/functions.html#exec) –

Powiązane problemy