問題5.37 – SICP(計算機プログラムの構造と解釈)その288
2009年12月13日
問題5.37
元の preserving
から if
の述語部と代替部を取り除く。
(define (preserving regs seq1 seq2) (if (null? regs) (append-instruction-sequences seq1 seq2) (let ((first-reg (car regs))) (preserving (cdr regs) (make-instruction-sequence (list-union (list first-reg) (registers-needed seq1)) (list-difference (registers-modified seq1) (list first-reg)) (append `((save ,first-reg)) (statements seq1) `((restore ,first-reg)))) seq2))))
次の square
手続きで、常に save
, restore
演算を生成する版と、修正前の preserving
との比較を行う。
(parse-compiled-code (compile '(define (square x) (* x x)) 'val 'next))
常に save
, restore
演算を生成する版
(continue env) (val) (save continue) (save env) (save continue) (assign val (op make-compiled-procedure) (label entry1) (reg env)) (restore continue) (goto (label after-lambda2)) entry1 (assign env (op compiled-procedure-env) (reg proc)) (assign env (op extend-environment) (const (x)) (reg argl) (reg env)) (save continue) (save env) (save continue) (assign proc (op lookup-variable-value) (const *) (reg env)) (restore continue) (restore env) (restore continue) (save continue) (save proc) (save env) (save continue) (assign val (op lookup-variable-value) (const x) (reg env)) (restore continue) (assign argl (op list) (reg val)) (restore env) (save argl) (save continue) (assign val (op lookup-variable-value) (const x) (reg env)) (restore continue) (restore argl) (assign argl (op cons) (reg val) (reg argl)) (restore proc) (restore continue) (test (op primitive-procedure?) (reg proc)) (branch (label primitive-branch3)) compiled-branch4 (assign val (op compiled-procedure-entry) (reg proc)) (goto (reg val)) primitive-branch3 (save continue) (assign val (op apply-primitive-procedure) (reg proc) (reg argl)) (restore continue) (goto (reg continue)) after-call5 after-lambda2 (restore env) (perform (op define-variable!) (const square) (reg val) (reg env)) (assign val (const ok)) (restore continue)
スタック使用を最適化する preserving
を使った版
(env) (val) (assign val (op make-compiled-procedure) (label entry1) (reg env)) (goto (label after-lambda2)) entry1 (assign env (op compiled-procedure-env) (reg proc)) (assign env (op extend-environment) (const (x)) (reg argl) (reg env)) (assign proc (op lookup-variable-value) (const *) (reg env)) (assign val (op lookup-variable-value) (const x) (reg env)) (assign argl (op list) (reg val)) (assign val (op lookup-variable-value) (const x) (reg env)) (assign argl (op cons) (reg val) (reg argl)) (test (op primitive-procedure?) (reg proc)) (branch (label primitive-branch3)) compiled-branch4 (assign val (op compiled-procedure-entry) (reg proc)) (goto (reg val)) primitive-branch3 (assign val (op apply-primitive-procedure) (reg proc) (reg argl)) (goto (reg continue)) after-call5 after-lambda2 (perform (op define-variable!) (const square) (reg val) (reg env)) (assign val (const ok))
計算機プログラムの構造と解釈
posted with amazlet at 08.11.07
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
ピアソンエデュケーション
売り上げランキング: 6542