言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

空間末尾最適化 spacial tail optimization: 関数型言語とスタック言語とシミュレーションの話

関数型言語で etoys を作りたい!と思ってからもう長い年月がたち、これで私もワナビだなあと思う毎日ですが、忘れないようにたまには書きます。

多分関数型言語でシミュレーションやゲームを書くのが無理じゃない?と思われている理由の一つに、状態の変化を遅延リストで表現するという富豪的な態度があるかと思います(モナドとか色々あるけど、基本は遅延リストでしょう)。直感的に、それではメモリの割り当てとガベージコレクションに莫大な負荷がかかってします。Haskell 等の実際の処理系がどうしてるのか一度じっくり勉強したい所です。

それはさておき、理屈で言うと、関数はコンビネータに変形出来て、コンビネータは線形論理に変形出来るので(言葉の使い方はこれでよいのだろうか???) 関数型言語と言えども完全にガベージコレクション不要に出来ると思います。でも、ガベージコレクション不要と言っても機械的に変形するだけでは多分莫大なスタックを伸ばしたり減らしてたりする羽目になる気がするのです。これを、再帰関数の末尾最適のようなちょっとしたトリックで、ある処理に関しては必ず定数メモリを使うと保証できたらかっこいいなと思うわけです。例えば遅延リストでも一つ前の情報を一度しか参照しないなら、結局メモリは一つで足りるみたいな。まあ単なる妄想ですが、名付けて空間末尾最適化 spacial tail optimization と呼びましょう。前にも書いた気がするけど、また書きました。