Есть ли в WAM Prolog таблица символов?

#prolog #symbol-table #warren-abstract-machine

#пролог #таблица символов #уоррен-абстрактная машина

Вопрос:

Я пытаюсь запрограммировать WAM-реализацию Prolog на C. Я заметил, что типы данных Prolog описаны только в четырех типах токенов: REF, STR, CON и LIS.

Каждая ячейка в куче выполнения содержит тип токена и его позицию в куче.

введите описание изображения здесь

Обратите внимание, что нет никакой ссылки на его фактическое имя (т.Е. Z, W). Разве куча не должна указывать на символ и его значение в таблице символов? Есть ли таблица символов в чистой реализации prolog? Мой анализатор создает таблицу символов или создает кучу? В учебной реализации WAM A ничего из этого не упоминается.

Комментарии:

1. Z и W являются логическими переменными. WAM не нужно отслеживать имена переменных. В этом примере Z была назначена ячейка 2, а W — ячейка 3, поэтому должна быть согласована ячейка, назначенная им, как показано на рисунке, который вы опубликовали. Должна быть какая-то таблица атомов для отслеживания атомов (в примере p , h и f ).

Ответ №1:

Думайте о WAM как о своего рода машинном коде — в машинном коде нет таблиц символов, хотя в исполняемом файле может быть отдельный раздел, предоставляющий информацию, которую отладчик или другие инструменты1 могут использовать для отображения значений по имени. Многие реализации Prolog также могут отображать имена локальных переменных, но это выходит за рамки WAM.

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

Рассмотрим следующее (используя SWI-Prolog):

 1 ?- [user].
|: foo(Char) --> [Char], {check(Char)}, bar(Char). 
|: 
% user://1 compiled 0.03 sec, 1 clauses
true.

2 ?- listing(foo).
foo(A, [A|B], C) :-
    check(A),
    D=B,
    bar(A, D, C).
  

Умная реализация может отображаться listing(foo) как:

 foo(Char, [Char|B], C) :-
    check(Char),
    bar(Char, B, C).
  

но внутренне это точно то же самое. У дополнительных переменных для расширения DCG никогда не было имен, поэтому им просто присваиваются произвольные имена, такие как B и C в списке.

Комментарии:

1. Итак, после того, как я проанализирую свой язык, я должен использовать синтаксическое дерево для непосредственного создания моей кучи?

2. Я не понимаю вашего вопроса. Вы имеете в виду использование синтаксиса для определения, какую инструкцию выдавать? Если да, то это немного похоже на компиляцию C или Python: некоторый код приводит к выделению в стеке, а другой код выделяется в куче — синтаксическое дерево не требуется при выполнении машинного кода (для C ) или байтового кода (для Python) (я не смотрел на WAMбуквально десятилетиями, так что, возможно, кто-то, кто работал над этим совсем недавно, может помочь вам лучше.)