2016-06-18 11 views
0

In Abschnitt 5.5.7 von SICP sagtLabels vs Anweisungssequenzen in Registern (SICP)

External-entry geht davon aus, dass die Maschine mit val enthält den Speicherort einer Befehlsfolge gestartet wird, das ein Ergebnis in val bringt und endet mit (goto (reg continue)).

später im Abschnitt sagt, es

Um den Objektcode durch den Compiler in ausführbare Anweisungen für die Auswerter Registermaschine erzeugt zu verwandeln, verwenden wir das Verfahren assemble aus dem Register-Maschine-Simulator (Abschnitt 5.2.2). Wir initialisieren dann das val Register, um auf die Liste der Anweisungen zu zeigen, stellen Sie flag so ein, dass der Evaluator zu external-entry geht und den Evaluator startet.

ist der Code wie folgt angezeigt:

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))) 

Beide Absätze scheinen zu zeigen, dass die in 'val gespeicherten Wert ein Etikett angibt, wo für die Anweisungen zu springen, aber der Code selbst zeigt sie die Inhalte direkt einstellen eines Registers zu einer Folge von Anweisungen.

Wie funktioniert dieser Code? Sicherlich ordnen sie nicht eine ganze Folge von Maschinenanweisungen in ein einziges Register ein? Die (goto (reg val)) impliziert, was innerhalb 'val gespeichert ist, ist eine Bezeichnung, so dass es keine Folge von Anweisungen sein kann, aber die Zuordnung impliziert, dass es nicht ist.

Als Referenz (alle Code entnommen aus: 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))))))) 

Antwort

1

anzumerken, dass SICP eine Registermaschine modelliert nicht in einer Low-Level-Sprache, mit einem Speicher als Arrays von Zellen dargestellt wird, und die Adressen als ganze Zahlen , aber in Schema.

Dies bedeutet, dass Register, Anweisungen usw. alle Scheme-Datenstrukturen sind. Beispielsweise ist eine Folge von Anweisungen eine Liste, insbesondere eine Liste alternierender Markierungen und Anweisungen, und in ähnlicher Weise ist ein "Zeiger" auf eine Anweisung einfach eine Variable, deren Wert eine Liste von Anweisungen ist (siehe zum Beispiel). der Abschnitt über Test, branch and goto instructions, in dem gesagt wird: "Ein goto-Befehl ist einem Zweig ähnlich, außer dass das Ziel entweder als ein Label oder als ein Register angegeben werden kann").

Verwandte Themen