6.001 Recitation – May 05,
2003
RI: Konrad
Tollmar
• RRM
• Explicit control evaluator
1. A recursive
register machine
Write the register machine for
(define
(add-from-one-to-recursive x)
(if (= x 1)
1
(+ (add-from-one-to-recursive (- x 1)) x)))
(assign continue (label finish))
rec
;; test and branch for base case
;; recursively call loop with x=x-1
after-rec
;; compute x+ans
goto (reg continue)) ;; return
base-case
;; set answer
(goto (reg continue)) ;; return
finish
2. Iterative Sum…
Write the register machine corresponding to this iterative procedure to compute S x :
(define
(add-from-one-to x)
(define (helper x ans)
(if (= x 1)
ans
(helper (- x 1) (+ x ans))))
(helper x 1))
Add And to the Explicit Control Evaluator.
A/ Covert this psedo-code to machine-code:
1.
ev-and
2.
store in unev and exp the conjunts
3.
save needed data on stack
4.
evaluate the first-conjunct
5.
eval-after-first
6.
restore needed data
7.
test the first- conjunct
8.
break if false
9.
evaluate the second-conjunct
10. eval-after-second
11. break procedure
B/ Tune this solution so it handles tail-recursion
C/ Could you find any further optimization?
(define (inc x) (+ x 1))
(inc
3)
Label Exp Env Val Proc Argl Unev Cont Stack
http://mitpress.mit.edu/sicp/code/
;;SECTION 5.4.1
eval-dispatch
(test (op
self-evaluating?) (reg exp))
(branch
(label ev-self-eval))
(test (op
variable?) (reg exp))
(branch
(label ev-variable))
(test (op
quoted?) (reg exp))
(branch
(label ev-quoted))
(test (op
assignment?) (reg exp))
(branch
(label ev-assignment))
(test (op
definition?) (reg exp))
(branch
(label ev-definition))
(test (op
if?) (reg exp))
(branch
(label ev-if))
(test (op
lambda?) (reg exp))
(branch
(label ev-lambda))
(test (op
begin?) (reg exp))
(branch
(label ev-begin))
(test (op
application?) (reg exp))
(branch
(label ev-application))
(goto
(label unknown-expression-type))
ev-self-eval
(assign val
(reg exp))
(goto (reg
continue))
ev-variable
(assign val
(op lookup-variable-value) (reg exp) (reg env))
(goto (reg
continue))
ev-quoted
(assign val
(op text-of-quotation) (reg exp))
(goto (reg
continue))
ev-lambda
(assign
unev (op lambda-parameters) (reg exp))
(assign exp
(op lambda-body) (reg exp))
(assign val
(op make-procedure)
(reg unev) (reg exp) (reg env))
(goto (reg continue))
ev-application
(save
continue)
(save env)
(assign
unev (op operands) (reg exp))
(save unev)
(assign exp
(op operator) (reg exp))
(assign
continue (label ev-appl-did-operator))
(goto
(label eval-dispatch))
ev-appl-did-operator
(restore
unev)
(restore
env)
(assign
argl (op empty-arglist))
(assign
proc (reg val))
(test (op
no-operands?) (reg unev))
(branch
(label apply-dispatch))
(save proc)
ev-appl-operand-loop
(save argl)
(assign exp
(op first-operand) (reg unev))
(test (op
last-operand?) (reg unev))
(branch
(label ev-appl-last-arg))
(save env)
(save unev)
(assign
continue (label ev-appl-accumulate-arg))
(goto
(label eval-dispatch))
ev-appl-accumulate-arg
(restore
unev)
(restore
env)
(restore
argl)
(assign
argl (op adjoin-arg) (reg val) (reg argl))
(assign
unev (op rest-operands) (reg unev))
(goto
(label ev-appl-operand-loop))
ev-appl-last-arg
(assign
continue (label ev-appl-accum-last-arg))
(goto
(label eval-dispatch))
ev-appl-accum-last-arg
(restore
argl)
(assign
argl (op adjoin-arg) (reg val) (reg argl))
(restore
proc)
(goto
(label apply-dispatch))
apply-dispatch
(test (op
primitive-procedure?) (reg proc))
(branch
(label primitive-apply))
(test (op
compound-procedure?) (reg proc))
(branch
(label compound-apply))
(goto
(label unknown-procedure-type))
primitive-apply
(assign val
(op apply-primitive-procedure)
(reg proc)
(reg argl))
(restore
continue)
(goto (reg
continue))
compound-apply
(assign
unev (op procedure-parameters) (reg proc))
(assign env
(op procedure-environment) (reg proc))
(assign env
(op extend-environment)
(reg unev) (reg argl) (reg
env))
(assign unev (op
procedure-body) (reg proc))
(goto
(label ev-sequence))
;;;SECTION 5.4.2
ev-begin
(assign
unev (op begin-actions) (reg exp))
(save
continue)
(goto
(label ev-sequence))
ev-sequence
(assign exp
(op first-exp) (reg unev))
(test (op
last-exp?) (reg unev))
(branch
(label ev-sequence-last-exp))
(save unev)
(save env)
(assign
continue (label ev-sequence-continue))
(goto
(label eval-dispatch))
ev-sequence-continue
(restore
env)
(restore
unev)
(assign
unev (op rest-exps) (reg unev))
(goto
(label ev-sequence))
ev-sequence-last-exp
(restore
continue)
(goto
(label eval-dispatch))
;;;SECTION 5.4.3
ev-if
(save exp)
(save env)
(save
continue)
(assign
continue (label ev-if-decide))
(assign exp
(op if-predicate) (reg exp))
(goto
(label eval-dispatch))
ev-if-decide
(restore
continue)
(restore env)
(restore
exp)
(test (op
true?) (reg val))
(branch
(label ev-if-consequent))
ev-if-alternative
(assign exp
(op if-alternative) (reg exp))
(goto
(label eval-dispatch))
ev-if-consequent
(assign exp
(op if-consequent) (reg exp))
(goto
(label eval-dispatch))
ev-assignment
(assign
unev (op assignment-variable) (reg exp))
(save unev)
(assign exp
(op assignment-value) (reg exp))
(save env)
(save
continue)
(assign
continue (label ev-assignment-1))
(goto
(label eval-dispatch))
ev-assignment-1
(restore
continue)
(restore
env)
(restore
unev)
(perform
(op
set-variable-value!) (reg unev) (reg val)
(reg env))
(assign val
(const ok))
(goto (reg
continue))
ev-definition
(assign
unev (op definition-variable) (reg exp))
(save unev)
(assign exp
(op definition-value) (reg exp))
(save env)
(save
continue)
(assign
continue (label ev-definition-1))
(goto
(label eval-dispatch))
ev-definition-1
(restore
continue)
(restore
env)
(restore
unev)
(perform
(op
define-variable!) (reg unev) (reg val) (reg env))
(assign val
(const ok))
(goto (reg
continue))
)))