2013年12月28日土曜日

開発環境

計算機プログラムの構造と解釈(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.37.を解いてみる。

その他参考書籍

問題 5.37.

常にsaveとrestore演算を生成するようにpreservingを修正。

コード(BBEdit)

sample.scm

(definne (preserving regs seq1 seq2)
  (if (null? regs)
      (append-instruction-squences seq1 seq2)
      (let ((first-reg (car regs)))
        (preserving (cdr regs)
         (make-instruction-sequence
          (list-union (list first-reg)
                      (register-needed seq1))
          (list-difference (registers-modified seq1)
                           (list first-reg))
          (append '((save ,first-reg))
                  (statements seq1)
                  '((restore ,first-reg))))))))

式、(+ n 1)の翻訳。

常にsaveとrestore演算を生成するpreserving機構の場合。

  (save continue)
  (assign proc (op lookup-variable-value) (const +) (reg env))
  (save proc) ;; 異なる
  (save env) ;; 異なる
  (save continue) ;; 異なる
  (assign val (const 1))
  (restore continue) ;; 異なる
  (assign argl (op list) (reg val))
  (restore env) ;; 異なる
  (save argl) ;; 異なる
  (save continue) ;; 異なる
  (assign val (op lookup-variable-value) (const n) (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-branch))
compiled-branch
  (assign val (op compiled-procedure-entry) (reg proc))
  (goto (reg val))
primitive-branch
  (assign val (op apply-priitive-procedure) (reg proc) (reg argl))
after-call
  (goto (reg continue))

元の、スタック使用を最適化するpreserving機構の場合。

  (save continue)
  (assign proc (op lookup-variable-value) (const +) (reg env))
  (assign val (const 1))
  (assign argl (op list) (reg val))
  (assign val (op lookup-variable-value) (const n) (reg env))
  (assign argl (op cons) (reg val) (reg argl))
  (restore continue)
  (test (op primitive-procedure? proc))
  (branch (label primitive-procedure))
compiled-branch
  (assign val (op compiled-procedure-entry) (reg proc))
  (goto (reg val))
primitive-branch
  (assign val (op apply-primitive-procedure) (reg proc) (reg argl))
after-call
  (goto (reg continue))

単純な式の翻訳でも多くの不要なスタック演算が見つかった。

0 コメント:

コメントを投稿