関数型プログラミング言語Haskell Part19
■ このスレッドは過去ログ倉庫に格納されています
0736710
2012/09/12(水) 10:13:45.76ありがとうございます。ちょっと自分ではまだ解明を進められていません。すいません。
確かに遅延評価を行っているなら最終的に各々の値が必要なのか分かっている状態になってから計算を始めるので、
ある値を計算する段階で必要ではない値は計算しない事で
(x:ys)のような不必要な値を残さない事が可能である事は理解できます。
ただ、それを実際どのように実現しているのか不思議に思いました。
というのも、haskellはコンパイラ言語であるので最終的に機械語の状態で解釈され計算を行うはずです。
ここでもしlengthやlinesが完全に機械語に変換されているならばlengthがlinesに実はその値は要らないんだ、
という事を知らせる事は不可能ではないかと思ったのからです。
今はいくつかの可能性を考えています。
一つはガーベージコレクタなどのメモリ管理モジュールに全てを任せてしまう方法です。
この場合(x:ys)は一応計算されメモリにストアされるものの、lengthが参照していないので、
GCが動作した時に全て破棄されてしまうという可能性です。
もう一つは一つのhaskell関数を幾つもの小さい関数としてオブジェクトファイル(.oファイル)に格納する方法です。
これにより、ある関数内部の必要な計算と不必要な計算を、小関数単位で呼び出す事で呼出側が制御する事が可能になり、
最終的にリンカのみで不必要な計算を排除出来る可能性があります。
まだよく分かって無いので、もうすこし調べてみようと思います。ありがとうございます。
■ このスレッドは過去ログ倉庫に格納されています