In Abschnitt 5.5.7 von SICP sagtLabels vs Anweisungssequenzen in Registern (SICP)
External-entry
geht davon aus, dass die Maschine mitval
enthält den Speicherort einer Befehlsfolge gestartet wird, das ein Ergebnis inval
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 dasval
Register, um auf die Liste der Anweisungen zu zeigen, stellen Sieflag
so ein, dass der Evaluator zuexternal-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)))))))