Подтвердить что ты не робот

Альтернативы WAM

Я помню, как однажды прочитал, что было по крайней мере две другие альтернативы, изобретенные примерно одновременно с WAM. Любые указатели?

4b9b3361

Ответ 1

До WAM был ZIP файл Clocksin. Его дизайн по-прежнему очень интересный. SWI-Prolog использует его. А также B-Prolog медленно мигрировал из WAM-дизайна в сторону ZIP. Конечно, таким образом было разработано много новых инноваций. Другой альтернативой является VAM.

Сравнение с 1993 года:

http://www.complang.tuwien.ac.at/ulrich/papers/PDF/binwam-nov93.pdf

Тем временем наиболее интересные архитектурные разработки связаны с B-Prolog.

WAM против ZIP

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

Рассмотрим минимальный пример:

p(R1,R2,R3,L1,L2,L3) :-  % WAM                % ZIP
                         % store L1...L3      % nothing
                         % nothing            % push R1..R3
                         % init X1..X3        % push X1..X3
   q(R1,R2,R3,X1,X2,X3),
                         % put unsafe X1..X3  % push X1..X3
                         % load       L1..L3  % push L1..L3
   r(X1,X2,X3,L1,L2,L3).

До вызова q:

WAM не нужно делать никаких действий для аргументов, которые передаются в первый гол в тех же позициях (R1..R3). Это особенно интересно для двоичных предложений, т.е. Предложений с ровно одной регулярной целью в конце. Здесь WAM превосходит.

Другие аргументы L1..L3 должны храниться локально. Поэтому для этих аргументов интерфейс регистра ничего хорошего не сделал.

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

Как недостаток, ZIP должен снова нажать R1..R3.

Оба должны инициализировать X1..X3 и хранить их в стеке.

Вызов q:

При вызове q WAM должен выделять пространство стека для X1..X3 и L1..L3, таким образом, 6 ячеек, тогда как ZIP нуждается в R1..R3,L1..L3,X1..X3. Итак, здесь WAM более эффективен в пространстве. Кроме того, WAM разрешает обрезку окружения (для более сложных ситуаций), которая является почти невозможной для ZIP.

До вызова r:

Этот r является последним вызовом, и системы пытаются освободить пространство для этого предложения, если нет точки выбора.

Для WAM необходимо проверить экстенсивные переменные X1..X3 для того, чтобы быть еще неинсталлированными локальными переменными (put_unsafe), и если они перемещаются на куча - это дорого, но встречается редко. L1..L3 просто загружены. В этом случае WAM теперь может безопасно освободить локальный фрейм. Таким образом, последняя оптимизация вызовов - дешевая цена.

Для ZIP файла все должно быть нажато, как обычно. Тогда только, дополнительное сканирование должно проверять все значения в стеке и соответственно перемещать их. Это довольно дорого. Возможны некоторые оптимизации, но по-прежнему гораздо больше того, что делает WAM. ((Возможное улучшение было бы в том, чтобы вставлять аргументы в обратном порядке, тогда переменные L1..L3 могут быть оставлены в их местоположении. Таким образом, эти переменные не нуждаются в обработке. Я не видел такой реализации (пока).))

Ответ 2

В технической заметке, озаглавленной Набор абстрактных инструкций Prolog, Уоррен также ссылается на другой компилятор Боуэн, Берд и Часов. Однако он говорит, что две архитектуры имеют много общего, поэтому я не знаю, действительно ли этот компилятор можно рассматривать как альтернативу.

Ответ 3

Не уверен, что это то, что вы имеете в виду, но первые две реализации Prolog были интерпретатором, написанным в Fortran Colmerauer et al. и собственный компилятор DEC PDP-10 от Warren et al.

Уоррен упоминает это в своем предисловии к Ait-Kaci Tutorial Reconstruction WAM. Если это не то, что вы имеете в виду, вы можете найти его в этом документе или его ссылках.