- 2006-04-01
- programming
SICPの読破は今年一年の目標の一つである。まあかなり挫折しそうだけれど。 何だこの問題2.6は。これほど短いソースコードを見てこれほど全く理解できない というのは久しぶりだ。ラムダ計算スゴス。
末尾再帰はgotoと等価だというのを学んだ時、10年くらい前にやったアセンブラの仕事を思い出した。 再帰ではなかったけど、関数の最後がcallの場合はjmpに置き換えられる というのをその時学んだ。アレと似てるじゃないか。
;; コレより、、
:func1
;; 処理
call func2
ret
:func2
;; 処理
;; 処理
ret
;; コッチの方がスタック消費しなくていいじゃん
:func1
;; 処理
jmp func2
ret ;; 通らない
:func2
;; 処理
;; 処理
ret ;; いきなりfunc1の呼び元まで戻る
;; まああくまで一例ってことで、、、
普通の構造化プログラミング的なフローに照らしあわせながら 他の人が書いたソースを見ていたら、 当然callが出てきそうな所にいきなりjmpが出てきて面くらった。 コードを書いた人は、 あのフローを見ながら、当然のようにこういう最適化をやっていたわけだ。
とか思ってたら、アセンブラで継続を書いてる人がいるよ。
んなわけで、当たり前のことかもしれないけど、Schemeをやってると アセンブラっぽさを感じるというか、C言語なんかとは別の 進化を歩んだ言語なんだなと(つーかあんまり進化してないのか)と思う。
アセンブラ | +- Lisp | +- ... +- Pascal、C +- ...