Какое точное определение Metacircular Interpreter?

Законно ли вызывать компилятор C, написанный на C, или интерпретатор PHP, написанный на метациркулере PHP? Это определение действительно только для языков определенного типа, таких как Lisp? Короче говоря, каким условиям должен удовлетворять переводчик, чтобы его называли метациркуляторным?

4 ответа

Решение

Метациклический интерпретатор - это интерпретатор, написанный в (возможно, более базовой) реализации того же языка. Обычно это делается для экспериментов с добавлением новых функций в язык или созданием другого диалекта.

Причина, по которой этот процесс связан с Лиспом, заключается в том, что статья "Искусство переводчика" очень ясна и показывает несколько метациркулярных интерпретаторов, основанных на Схеме. (Этот документ является ядром книги SICP, а его четвертая глава работает с другими, которые создают, например, лениво оцененную схему.)

Это также намного проще сделать на "гомо-звуковом" языке (языке, чей код можно манипулировать как данные во время выполнения), таком как Lisp, Prolog и Forth.

Что касается вашего прямого вопроса - компилятор C вообще не будет интерпретатором. Компилятор, написанный на его собственном языке, является "self-hosting", что является аналогичным свойством, но больше относится к начальной загрузке. Интерпретатор PHP в PHP, вероятно, не будет учитываться, так как вы, вероятно, будете повторно реализовывать нетривиальное количество языка в процессе. Основное преимущество обычного мета-кругового интерпретатора состоит в том, что в этом нет необходимости - вы можете подключить существующий синтаксический анализатор, сборщик мусора (если есть) и т. Д. И просто написать оценщик верхнего уровня с другой семантикой. В Схеме или Прологе это часто меньше, чем страница кода.

Вот определение на странице википедии для метациркуляра:

Метакруглый оценщик - это особый случай самоинтерпретатора, в котором существующие возможности родительского интерпретатора напрямую применяются к интерпретируемому исходному коду без какой-либо дополнительной реализации.

Так что ответ нет в обоих случаях:

  • Компилятор A C не является интерпретатором (оценщиком). Он переводит программу из одной формы в другую, не выполняя ее.
  • (Гипотетический) интерпретатор PHP, написанный на PHP, должен быть самоинтерпретатором, но не обязательно мета-круговым.

Чтобы дополнить приведенные выше ответы: http://www.c2.com/cgi/wiki?MetaCircularEvaluator

Насколько я понимаю, метациклический интерпретатор - это интерпретатор, который может интерпретировать себя.

Компилятор только переводит код и не выполняет его.

Любой язык, полный по Тьюрингу, математически способен эмулировать любые логические вычисления, поэтому вот пример использования Python. Вместо того чтобы использовать CPython для перевода этого кода в инструкции процессора и выполнения его, вы также можете использовать PyPy. Последний загружается, так что удовлетворяет некоторому произвольному критерию, который некоторые люди используют для определения метациркулярного интерпретатора.

"""
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)
Другие вопросы по тегам