Когда выполняются инструкции программы Уоррена "Абстрактная машина"?
Я читаю книгу Хасана Айт-Качи "Абстрактная машина Уоррена: реконструкция учебника".
В главе 2 компиляция программ L0 представлена после компиляции запросов L0. Раздел компиляции программы (2.3) начинается с:
Составить программный термин p немного сложнее, хотя и ненамного. Обратите внимание, что предполагается, что запрос
?-
q построит термин в куче и установит регистр X1 для хранения его адреса. Таким образом, объединение q в p можно продолжить, следуя структуре терминов, уже присутствующей в X1, если она соответствует функтору для функтора структуре p.
Таким образом, компиляция программы производится после выполнения инструкций, полученных при компиляции запросов? Это вообще имеет смысл? Я не совсем понимаю...
Что имеет для меня смысл: WAM-код, сгенерированный из аннотированного синтаксического дерева программы, сохраняется интерпретатором. Для каждой процедуры (определенной в программе) хранится блок кода WAM. Когда запрос сделан, его инструкции генерируются и выполняются. Если запрос вызывает определенную процедуру, выполните его блок кода. Это что-то подобное?
2 ответа
Обратите внимание, что вы цитируете с самого начала серии все более сложных виртуальных машин, которые представлены в этом тексте:
Здесь мы рассматриваем ℒ0, действительно очень простой язык. На этом языке можно указать только два вида объектов: программный термин и термин запроса. И программа, и запрос являются терминами первого порядка, но не переменными. Семантика ℒ0 просто равносильна вычислению наиболее общего унификатора программы и запроса.
Этот простой язык интерпретируется как вы описываете.
В последующих разделах книги проектирование и исполнение более сложных машин пропорционально усложняется, и уже через несколько страниц мы находим, например:
В §1 скомпилированный код хранится в области кода (
CODE
), адресуемый массив слов данных, каждое из которых содержит возможно помеченную инструкцию над одним или несколькими словами памяти, состоящими из кода операции, за которым следуют операнды.
Это уже тот дизайн, который вы описываете в конце своего поста, и, конечно, именно так на самом деле код Prolog компилируется на практике.
Таким образом, компиляция программы производится после выполнения инструкций, полученных при компиляции запросов? Это вообще имеет смысл? Я не совсем понимаю...
В начале это уточняется (2, последний абзац):
Идея довольно проста: определив программный термин p, можно отправить любой запрос
?-
q и выполнение либо завершается неудачно, если p и q не объединяются, либо успешно связывается с переменными в q, полученными путем объединения его с p.
Как @mat уже заявляет: это пошаговый подход. Начиная с очень простых программ. Только один факт и запрос.