Каково точное определение метациркулярного интерпретатора?

StackOverflow https://stackoverflow.com/questions/1481053

Вопрос

Законно ли называть компилятор C, написанный в C или PHP -интерпретаторе, написанном в PHP Metacircular? Действительно ли это определение только для языков определенного типа, например LISP? Короче говоря, какие условия должен удовлетворить переводчик за то, что его называют метациркулярным?

Это было полезно?

Решение

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

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

Это тоже значительно Легче сделать на «гомоконическом» языке (языке, код которого можно манипулировать как данные во время выполнения), такими как LISP, Prolog и Forth.

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

Другие советы

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

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

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

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

Чтобы дополнить вышеуказанные ответы: http://www.c2.com/cgi/wiki?metacircularevaluator

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

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

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

"""
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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top