Метки против последовательностей команд в регистрах (SICP)

В разделе 5.5.7 SICP говорится

External-entry предполагает, что машина запущена с val содержащий расположение последовательности команд, которая помещает результат в val и заканчивается (goto (reg continue)),

Позже в разделе говорится

Чтобы преобразовать объектный код, созданный компилятором, в исполняемые инструкции для машины регистра оценщика, мы используем процедуру assemble из симулятора регистра машины (раздел 5.2.2). Затем мы инициализируем val зарегистрироваться, чтобы указать на список инструкций, установить flag так что оценщик перейдет к external-entryи запустить оценщик.

Код отображается как:

external-entry
  (perform (op initialize-stack))
  (assign env (op get-global-environment))
  (assign continue (label print-result))
  (goto (reg val))

(define (compile-and-go expression)
  (let ((instructions
         (assemble (statements
                    (compile expression 'val 'return))
                   eceval)))
    (set! the-global-environment (setup-environment))
    (set-register-contents! eceval 'val instructions)
    (set-register-contents! eceval 'flag true)
    (start eceval)))

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

Как работает этот код? Неужели они не присваивают целую последовательность машинных инструкций в один регистр? (goto (reg val)) подразумевает то, что хранится внутри 'val является меткой, поэтому она не может быть последовательностью инструкций, хотя назначение подразумевает, что это не так.

Для справки (весь код взят из: https://mitpress.mit.edu/sicp/full-text/book/book-Z-H-4.html):

(define (assemble controller-text machine)
  (extract-labels controller-text
    (lambda (insts labels)
      (update-insts! insts labels machine)
      insts)))

(define (extract-labels text receive)
  (if (null? text)
      (receive '() '())
      (extract-labels (cdr text)
       (lambda (insts labels)
         (let ((next-inst (car text)))
           (if (symbol? next-inst)
               (receive insts
                        (cons (make-label-entry next-inst
                                                insts)
                              labels))
               (receive (cons (make-instruction next-inst)
                              insts)
                        labels)))))))

1 ответ

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

Это означает, что регистры, инструкции и т. Д. Являются структурами данных Схемы.

Например, последовательность инструкций представляет собой список, в частности список чередующихся меток и инструкций, и аналогичным образом "указатель" на istruction представляет собой просто переменную, значение которой представляет собой список инструкций (см., Например, раздел " Тестирование"). инструкции перехода и перехода, в которых говорится: "инструкция перехода аналогична переходу, за исключением того, что назначение может быть указано либо как метка, либо как регистр").

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