В разделе 5.5.7 SICP он говоритЭтикетки против команд последовательностей в регистрах (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#%_toc_start):
(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)))))))