2013年12月26日木曜日

開発環境

計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の5(レジスタ計算機での計算)、5.5(翻訳系)、翻訳系の概観、5.5.5(翻訳したコードの例)、問題 5.35.を解いてみる。

その他参考書籍

問題 5.35.

コード(BBEdit)

sample.scm

(define (f x)
  (+ x (g (+ x 2))))

確認のために、この公式を翻訳して図5.18に示すコードと一致するか確認。

翻訳。

  (assign val (op make-compiled-procedure)
  (goto (label after-lambda1))

entry2 ;; fの呼び出しはここから
  (assign env (op compiled-procedure-env) (reg proc))
  (assign env (op extend-environment) (reg env))
  
  ;; (+ x (g (+ x 2)))の計算
  (assign proc (op lookup-variable-value) (const +) (reg env))
  (save continue)
  (save proc)
  (save env)
  
  ;; (g (+ x 2))の計算
  (assign proc (op lookup-variable-value) (const g) (reg env))
  (save proc)
  ;; (+ x 2)の計算
  (assign proc (op lookup-variable-value) (const +) (reg env))
  (assign val (const 2))
  (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-branch11))
compiled-branch10
  (assign continue (label after-call9))
  (assign val (op compiled-procedure-entry) (reg proc))
  (goto (reg val))
primitive-branch11
  (assign val (op apply-primitive-procedure) (reg proc) (reg val))
after-call9 ;; valには(+ x 2)の結果がある
  (assign argl (op list) (reg val))
  (restore proc)
  (test (op primitive-procedure?) (const g) (reg env))
  (branch (label primitive-branch8))
compiled-branch7
  (assign continue (label after-call6))
  (assign val (op compiled-procedure-entry) (reg proc))
  (goto (reg val))
primitive-branch8
  (assign val (op apply-primitive-procedure) (reg proc) (reg argl))
after-call6 ;; valには(g (+ x 2))の結果がある
  (assign argl (op list) (reg val))
  (restore env)
  (assign val (op lookup-variable-value) (const x) (reg env))
  (assign argl (op cons) (reg val) (reg argl))
  (restore proc)
  (test (op primitive-procedure?) (reg proc))
  (branch (op primitive-branch5))
compiled-branch4
  (assign val (op compiled-procedure-entry) (reg proc))
  (goto (reg val))
primitive-branch5
  (assign val (op apply-primitive-procedure) (reg proc) (reg argl))
  (goto (reg continue))
after-call3 ;; valには(+ x (g (+ x 2)))の結果がある
after-lambda1
  (perform (op define-variable!) (const f) (reg val) (reg env))
  (assign val (const ok))

0 コメント:

コメントを投稿