Концепция метакруглого оценщика
Я пытаюсь понять концепцию мета-циклического оценщика. Согласно Википедии
В вычислениях мета-циклический оценщик или мета-циклический интерпретатор является интерпретатором, который определяет каждую особенность интерпретируемого языка с использованием аналогичного средства основного языка интерпретатора. Например, интерпретация лямбда-приложения может быть реализована с использованием функции 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
список. (Принимая во внимание, что скомпилированный Лисп-код, который запускает интерпретатор, не использует такую вещь для своих собственных лексических переменных; он фактически помещает переменные в стековые фреймы или векторы закрытия.)