Метки против последовательностей команд в регистрах (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 представляет собой просто переменную, значение которой представляет собой список инструкций (см., Например, раздел " Тестирование"). инструкции перехода и перехода, в которых говорится: "инструкция перехода аналогична переходу, за исключением того, что назначение может быть указано либо как метка, либо как регистр").