Книга 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

Другие вопросы по тегам