Подтвердить что ты не робот

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

Можно ли назвать C-компилятор написан на C или PHP-интерпретаторе, написанном на PHP metacircular? Является ли это определение допустимым только для языков определенного типа, например Lisp? Короче говоря, каковы условия, которые должен интерпретировать интерпретатор для вызова Metacircular?

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Вот определение со страницы wikipedia для metacircular:

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

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

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

Ответ 4

Как я понимаю, метациркулярный интерпретатор является интерпретатором, который может интерпретировать себя.

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

Любой язык Turing-complete > математически способен эмулировать любые логические вычисления, поэтому здесь пример с использованием Python. Вместо использования CPython для перевода этого кода в инструкции CPU и его выполнения вы также можете использовать PyPy. Последнее загружается, поэтому выполняется какой-то произвольный критерий, который некоторые люди используют для определения 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 Qaru 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)