Я помню, как однажды прочитал, что было по крайней мере две другие альтернативы, изобретенные примерно одновременно с WAM. Любые указатели?
Альтернативы WAM
Ответ 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. Если это не то, что вы имеете в виду, вы можете найти его в этом документе или его ссылках.