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?
Odpowiedz
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.
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. –
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
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. –
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.
celu uzupełnienia powyższych odpowiedzi: http://www.c2.com/cgi/wiki?MetaCircularEvaluator
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)
Dlaczego upadek? –
To nie jest interpreter meta-kolisty. Nie jest nawet tłumaczem, jest preprocesorem. :) – Tobias
@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) –
- 1. Jaka jest definicja HTTP_X_PURPOSE?
- 2. Perl: Jaka jest definicja testu?
- 3. Jaka jest definicja "starszego kodu"?
- 4. Jaka jest definicja _Rb_tree_increment w bits/stl_tree.h?
- 5. Jaka jest definicja komórki Lisp Cons?
- 6. Three.js: Jaka jest dokładna różnica między Lambertem i Phongiem?
- 7. Jaka jest dokładna różnica między "reflectToAttribute" Polymer i "notify"?
- 8. Jaka jest dokładna różnica pomiędzy stanami MEM_RESERVE i MEM_COMMIT?
- 9. jaka jest dokładna kolejność wykonania dla try, catch i wreszcie?
- 10. Jak dokładna jest dokładność CLLocation?
- 11. jaka jest definicja typu NU dla ogólnej procedury?
- 12. jaka jest definicja parametru "verbose" w scikit learn klastry kmeans
- 13. Definicja obiektu na 2 sposoby - jaka jest różnica?
- 14. Dlaczego wzorzec interpretera jest zasysany?
- 15. Co to jest definicja ([, funkcja]) w JavaScript?
- 16. Co to jest definicja "widoku" na CSS?
- 17. Dokładna klasyfikacja obrazu binarnego
- 18. Czy Python GIL jest naprawdę dla interpretera?
- 19. Jaki jest cel API interpretera w CPython?
- 20. Gdzie jest definicja struktury _TP_POOL?
- 21. Definicja funkcji lub definicja zmiennej?
- 22. Dynamiczne tablice kontra wektory STL dokładna różnica?
- 23. Dokładna arytmetyka dziesiętna w Julia
- 24. Dokładna fraza wyszukiwania używając Lucene.net
- 25. Dokładna kontrola kolejności wykreślania w Gadfly?
- 26. Jaka jest różnica między getch() i getchar()?
- 27. Automatyzacja konfiguracji interpretera PyDev
- 28. Jaka jest różnica między XHTML i HTML?
- 29. Wysokość zawartości UIWebView nie jest dokładna w scrollview.contentsize
- 30. Definicja końca strony a definicja końca strony
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. –