Концепция метакруглого оценщика

Я пытаюсь понять концепцию мета-циклического оценщика. Согласно Википедии

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

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

В более общем смысле, я бы сказал, что реализация интерпретатора использует парадигму синтаксиса для интерпретации синтаксиса. Кроме того, это не имеет никакого отношения к интерпретатору, реализуемому на интерпретируемом языке (интерпретатор Lisp обычно пишется на C). Только эквивалентность парадигмы имеет значение.

Давайте рассмотрим виртуальную машину Java Maxine, мета-циркулярную JVM. Maxine JVM написана на Java. Это JVM, работающая внутри JVM. Опять же, переводчик использует ту же парадигму, что и интерпретируемый язык. Исполняемый код, выраженный объектами Java, управляется исполняемым кодом, выраженным объектами Java. Конечно, фактический исполняемый файл - это байт-код, но важна абстрактная концепция. Таким образом, я полагаю, что Maxine, возможно, был написан на любом языке и все еще рассматривается как мета-циркуляр, если реализация соответствует концепциям ООП и правилам Java. Наиболее очевидно, что таким языком является сама Java. И все же вот один интересный конфликт, который я описываю в последнем абзаце, он действительно ранит мою голову!

Вот как я понимаю, что подразумевается под метакруглым оценщиком в теории. Но я не совсем понимаю практический аспект. Согласно Википедии

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

Что это на самом деле означает? Как это происходит или может быть применено на практике с виртуальной машиной Maxine, например? Как это отличается от функции, такой как eval?

И если мы пойдем более философски, имея две предпосылки для мета-циркулярного интерпретатора

  • Язык реализации интерпретатора не имеет значения, эквивалентность парадигмы имеет значение
  • На уровне исполнения концепция парадигмы перестает существовать, все только байты

Каковы окончательные границы мета-круглости? Где на самом деле реализуется эта характеристика? Я, наверное, слишком обдумываю это, но нахожу это интересной темой.

1 ответ

Ваш анализ на основе Java отключен, потому что

  • Ява не является JVM.

  • Ява aped после Лисп. Lisps компилируются в нативный код или виртуальную машину, похожую на JVM.

Итак, предположим, что мета-циклический интерпретатор Lisp интерпретирует вызов функции. Конечно, этот вызов функции представлен с использованием синтаксиса списка. Интерпретатор просматривает список, оценивает функцию и аргументы (использует себя рекурсивно), а затем выполняет вызов функции. Как это сделать: используя apply на функцию и список аргументов. Вот что якобы означает "мета-циркуляр". Программисту переводчика не нужно было писать приложение-функцию, он просто позаимствовал его у основного языка.

Однако интерпретатор не обязательно состоит из списков; это может быть скомпилированный код на Лиспе. Это не буквально генерирует (apply ...) сформировать и передать его на eval; он содержит скомпилированный вызов apply,

Метациклический интерпретатор Lisp неявно использует язык хоста различными способами. Во-первых, у него нет собственного читателя; Читатель хоста Lisp используется, а интерпретатор работает над готовым синтаксисом. Не нужно переопределять интернирование символов. Если необходимо проверить, соответствует ли ссылка на переменную в программе определению, она просто использует хост eq функция для сравнения символов.

"Meta-циркуляр", вероятно, вдохновлен идеей, что переводчик может точно обрабатывать каждую из специальных форм языка-носителя и, следовательно, может полностью ее реализовать. В этот момент он прошел "полный круг": он может интерпретировать свою собственную реализацию.

Метациклическая интерпретация используется в образовании, потому что она позволяет выразить модель оценки языка в самом языке. Ну, не режим оценки; просто модель оценки, и, как правило, очень неэффективная. Например, он может предложить модель лексической среды, которая является assoc список. (Принимая во внимание, что скомпилированный Лисп-код, который запускает интерпретатор, не использует такую ​​вещь для своих собственных лексических переменных; он фактически помещает переменные в стековые фреймы или векторы закрытия.)

Другие вопросы по тегам