言語ゲーム

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

Twitter: @propella

逆ガベコレ

ガベージコレクションというのを考えてみた。ガベージコレクション(ガベコレ)というのは、コンピュータがプログラムを動かす時に裏で働く大切な仕組みで、不要になったメモリを集めて再生する役割を持つ。ガベコレがあるおかげで、プログラマは煩雑なメモリ管理を忘れて論理に徹する事が出来る。

逆ガベコレというのは、メモリのコピーが本当に必要になった時に自動的にコピーする仕組みである。copy on write に似ているが、逆ガベコレを使うと、プログラマはメモリをコピーする必要が無くなる。

プログラマがメモリをコピーして何か悪い?あるデータが壊れてしまう可能性がある時にプログラマはコピーを行う。データが壊れるかどうかというのはあらかじめ分かりようが無いので、ライブラリなんかだと念のため一応コピーする事がある。例えばチャットを HTTP 経由で行うプログラムなんかを考えてみよう。HTTP を実現するためのあらゆる階層がそれぞれ無数のコピーを行うので、結果沢山の無駄が生まれている。無駄はパフォーマンスの悪化を生むだけでなく、論理の複雑性を生む。アルゴリズムに必要なのはコピーという実装ではなく、ある時点のデータに過ぎない。メモリの削除と同じく、メモリの複製に関してもプログラマではなく、機械がその必要性を判断するべきだ。

これを実現するには純粋関数型言語のアプローチが有用だ。ある変数の参照という時、関数型言語ではこれがある時点での変数の参照なのか、(モナドやストリームによる)最新の値の参照なのかという区別がある。ある時点の変数が必要な時だけコピーすれば良いし、必要な場所は静的に決定出来る。

興味深い考えとしては、Cat のように中間言語として設計された関数型言語という物がある。VM関数型言語でも、上位に命令型言語のレイヤを被せれば、プログラマは中が関数型かどうか気にする必要は無い。ただ、コピーを実行してもすぐには実行されず、本当に必要かどうか VMコンパイル時に決定する。