Книга WAM: Как генерируется код при работе с регистрами аргументов (L1)?
Я работаю над книгой Хасана Айт-Качи "Абстрактная машина Уоррена - Реконструкция учебного пособия". В настоящее время я застрял в разделе 2.4 "Регистры аргументов".
Чтобы быть точным, я не понимаю, как получить из этих назначений регистров (стр.22) (для запроса p(Z,h(Z,W),f(W))
):
A1 = Z
A2 = h(A1,X4)
A3 = f(X4)
X4 = W
к этим инструкциям (стр.24):
put_variable X4,A1
put_structure h/2,A2
set_value X4
set_variable X5
put_structure f/1,A3
set_value X5
call p/3
Мол, откуда вдруг появился X5? В назначениях регистров X4 относится к переменной W, а X5 нет. Но в инструкциях X5 относится к (что есть / было по существу) W, а X4 теперь относится к Z. Я не вижу объяснения в книге. Что мне не хватает?
1 ответ
Я пытался понять это, но безуспешно. Ничего не найдено. Вот несколько примечаний:
Обзор инструкции
put_structure f/n,Xi
: нажмите новыйSTR
(и прилегающий к нему функтор) ячейку в кучу и скопируйте эту ячейку в выделенный адрес регистра;set_variable Xi
: нажмите новыйREF
ячейку в кучу, содержащую ее собственный адрес, и скопируйте ее в указанный регистр;set_value Xi
: поместить новую ячейку в кучу и скопировать в значение регистра.- В случае запроса:
put_variable Xn,Ai
: первое появление переменной в позиции i-го аргумента подталкивает новый несвязанныйREF
ячейку в кучу и копирует ее в регистр этой переменной, а также в регистр аргументовAi
; а такжеput_value Xn,Ai
(используется для запроса): более позднее вхождение копирует свое значение в регистр аргументовAi
.
- По факту:
get_variable Xn,Ai
: первое вхождение переменной в позиции i-го аргумента устанавливает значение регистра аргументовAi
; а такжеget_value Xn,Ai
: более позднее вхождение объединяется со значениемAi
.
Итак, об этом запросе
p(Z,h(Z,W),f(W)))
Кажется, что на страницах 17 и 19 код написан иначе.
Page 17 in the print edition Page 19 in the print edition
(given as is) (translated by me from the WAM code)
A1 = Z A1 = Z
A2 = h(A1,X4) A2 = h(X4,X5)
A3 = f(X4) A3 = f(X5)
X4 = W X4 = Z
X5 = W
Изменить: кажется, что код слева позволяет переменным, появляющимся в не корневых позициях, находиться в "регистрах аргументов", что запрещено справа, следовательно, косвенно.
Код
В Ai
регистры аргументов, Xi
- это регистры значений.
put_variable X4,A1 Z is a argument root freshvar created in X4
and also goes into A1
put_structure h/2,A2 h/2 functor goes into A2
(1)
set_value X4 New (empty) cell is created, goes into the
value of X4
(2)
set_variable X5 W is a non-root freshvar created in X5
(3)
put_structure f/1,A3 f/1 functor goes into A3
set_value X5 New (empty) cell is created, goes into the
value of X5
(4)
call p/3 Go!
На позиции (1) пока все хорошо. X4
а также X5
кажутся неявно первым и вторым аргументами h/2
в A2 (это правда?)
X4 ----+---> [unbound REF] = Z (variable appearing at root)
|
A1 ----+
A2 --------> [h/2] = h(X4,X5)
В (2)
X4 ----+---> [] = Z (variable appearing at root)
|
A1 ----+
A2 --------> [h/2] = h(X4,X5)
В 3)
X4 ----+---> [] = Z (variable appearing at root)
|
A1 ----+
A2 --------> [h/2] = h(X4,X5)
X5 --------> [myself REF] (variable not appearing at root)
В (4)
X4 ----+---> [] = Z (variable appearing at root)
|
A1 ----+
A2 --------> [h/2] = h(X4,X5)
A3 --------> [f/1] = f(X5)
X5 --------> [] = W