2016-06-18 7 views
0

В разделе 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))))))) 

ответ

1

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

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

Например, последовательность инструкций представляет собой список, в частности список чередующихся меток и инструкций, а также «указатель» на istruction - это просто переменная, значение которой представляет собой список инструкций (см., Например, раздел на Test, branch and goto instructions, в котором сказано: «Инструкция goto похожа на ветвь, за исключением того, что пункт назначения может быть указан либо как метка, либо как регистр»).