開発環境
- OS X Mavericks - Apple(OS)
- Emacs (CUI)、BBEdit - Bare Bones Software, Inc. (GUI) (Text Editor)
- Scheme (プログラミング言語)
- MIT/GNU Scheme (処理系)
計算機プログラムの構造と解釈(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.1(翻訳系の構造)、標的と接続、命令列とスタックの使用、問題 5.31.を解いてみる。
その他参考書籍
問題 5.31.
実際に、
- env
- argl
- proc
(f 'x 'y)について。
;; 演算子の評価の前 … (1) ;;(save env) ;; 演算子の評価 ;; 演算子(f)の評価の後 ;;(restore env) ;;(assign proc (…)) ;; (1)からここまでは次のようになるので余分 (assign proc (op lookup-variable-value) (const f) (reg env)) ;; 被演算子列('x 'y)の評価の前 ;; (save proc) ;; 被演算子('x)の評価前 ;; (save env) ;; (save argl) ;; 被演算子('x)の評価後 ;; (restore argl) ;; (restore env) ;; 最後の被演算子('y)の評価前 ;; 最後の被演算子('y)の評価 ;; 最後の被演算子('y)の評価後 ;; 被演算子列('x 'y)の評価後 ;; (restore proc) ;; ここまでも、被演算子x'、y'の評価はレジスタenv、argl、procを修正することは無いので余分 (apply …)
ということで、全てのsaveとrestoreが余分であり、翻訳系のpreserving機構で除くことが出来る。
((f) 'x 'y)について。
;; 演算子((f))の評価前 ;; (save env) … (2) ;; 演算子((f))の評価 ;; 演算子(f)の評価前 … (1) ;; (save env) ;; 演算子(f)の評価 ;; 演算子(f)の評価後 ;; (restore env) (2)からレジスタenvは修正されていないので不要 ;; (assign proc (…)) ;; (1)からここまでのsaveとrestoreは不要で次のようになる (assign proc (op lookup-variable-value) (const f) (reg env)) ;; 演算子((f))の評価後 ;; (restore env) この(1), (2)からこのrestoreも不要 ;; (assign proc (…)) ;; … (3) ;; 被演算子列('x 'y)の評価前 ;; (save proc) ;; 被演算子('x)の評価前 ;; (save env) ;; (save argl) ;; 被演算子の評価 ;; (restore argl) ;; (restore env) ;; 最後の被演算子('y)の評価前 ;; 最後の被演算子の評価 ;; 最後の被演算子の評価後 ;; 被演算子列('x 'y)の評価後 ;; (restore proc) (3)以降にレジスタenv、argl、procを修正することは無いので余分 (apply …)
ということで、全てのsaveとrestoreは余分で翻訳系のpreserving機構で除ける。
(f (g 'x) y)について。
;; 演算子(f)の評価前 ;; (save env) … (1) ;; 演算子(f)の評価 ;; 演算子(f)の評価後 ;; (restore env) (1)のsaveとこのsaveとrestoreは余分。次のようになる (assign proc (op lookup-variable-value) (const f) (reg env)) ;; 被演算子列((g 'x) y)の評価前 (save proc) ;; 被演算子(g 'x)の評価前 ;; (save env) … (4) (save argl) ;; 被演算子(g 'x)の評価 ;; 演算子(g)の評価前 ;; (save env) … (2) ;; 演算子(g)の評価 ;; 演算子(g)の評価後 ;; (restore env) … (2)のsaveとこのrestoreは余分。次のようになる (assign proc (op lookup-variable-value) (const g) (reg env)) ;; 被演算子列('x)の評価前 (assign argl …) ;; (save proc) … (3) ;; 最後の被演算子('x)の評価前 ;; 最後の被演算子('x)の評価 ;; 最後の被演算子('x)の評価後 ;; 被演算子列('x)の評価後 ;; (restore proc) … (3)のsaveとこのrestoreは、レジスタprocは修正されることが無いので余分。 ;; 被演算子(g 'x)の評価後 (restore argl) (assign argl …) ;; (restore env) … (4)のsaveとこのrestoreは、レジスタenvが修正されることは無いので余分。 ;; 最後の被演算子(y)の評価前 ;; 最後の被演算子(y)の評価 ;; 最後の被演算子(y)の評価後 ;; 被演算子列((g 'x) y)の評価後 (restore proc)
ということで、余分なものを除いて残ったのは、(save argl)と(restore argl)。
(f (g 'x) 'y)について。
;; 演算子(f)の評価前 ;; (save env) …(1) ;; 演算子(f)の評価 ;; 演算子(f)の評価後 ;; (restore env) (1)のsaveとこのrestoreは余分。次のようになる (assign proc (op lookup-variable-value) (const f) (reg env)) ;; 被演算子列((g 'x) 'y)の評価前 (save proc) ;; 被演算子(g 'x)の評価前 ;; (save env) … (4) (save argl) ;; 被演算子(g 'x)の評価 ;; 演算子(g)の評価前 ;; (save env) … (2) ;; 演算子(g)の評価 ;; 演算子(g)の評価後 ;; (restore env) … (2)のsaveとこのrestoreは、余分。次のようになる (assign proc (op lookup-variable-value) (const g) (reg env)) ;; 被演算子列('x)の評価前 (assign argl …) ;; (save proc) … (3) ;; 最後の被演算子('x)の評価前 ;; 最後の被演算子('x)の評価 ;; 最後の被演算子('x)の評価後 ;; 被演算子列('x)の評価後 ;; (restore proc) … (3)のsaveとこのrestoreは、レジスタprocが修正されることはないので余分。 ;; 被演算子(g 'x)の評価後 (restore argl) (assign argl …) ;; (restore env) … (4)のsaveとこのrestoreは、レジスタenvが修正されることは無いので余分。 ;; 最後の被演算子('y)の評価前 ;; 最後の被演算子('y)の評価 ;; 最後の被演算子('y)の評価後 ;; 被演算子列((g 'x) 'y)の評価後 (restore proc)
ということで、preserving機構で余分なものを除いて残ったのは、(save argl)と(restore argl)。
0 コメント:
コメントを投稿