Ruby インタプリタの「ゴミ集め(Garbage Collection)」を制御するモジュールである。

ついにコイツが出てきてしまったのである。

C言語という有名なプログラミング言語がある。

ことプログラミングを生業としている者であれば、知っていて当たり前であるといわれるほど有名な言語なのだ。但し、使えるかどうかは別問題であるが。

なぜそのように有名なのかというと、何でもできる超汎用言語であるとともに、二十世紀最大の暴君と呼ばれるほどの暴れん坊だからなのである。C言語で作成されたプログラムは、せっかく好意で自分を動作させてくれている、大恩あるオペレーティングシステムごと破壊して、自分も死んでしまうということを平気でやってのけるのだ。

今でこそオペレーティングシステムも堅牢になってきているが、例えばWindowsNTあたりまでなら、C言語がちょっとその気になれば、簡単に真っ青な画面(Windowsがダウンしたとき、大変なことが起こったのだということを知らせるアラートが、青地に白文字で表示される画面)にすることが可能であったのだ。昔はよかったなあ(よくない!)。

『何でもできる超汎用言語』であるということと『二十世紀最大の暴君』であるということは、実は表裏一体となっている。要するに『何でもできるがゆえに危ない』のである。

それには、BIOSやOSのAPIを直接ぶっ叩けるという理由もあるわけだが、一番の理由は『メモリを自由に操作できること』なのである。

ポインタという機能を使って、メモリ内を自由に読み書きできるし、動作中にちょっとメモリが使いたいと思ったら、ひょいと動的に確保することができるのだ。実はこれが危ない。間違ったポインタでオペレーティングシステムのメモリにちょっかいをかけたり、他人様のメモリを破壊して知らん顔することが往々にしてあるわけだ。

また、大量にメモリを確保しておきながら、使い終わっても解放せず、だれも使えないメモリ領域を誕生させてしまうのである。この粗忽なプログラムが、何度も何度もそういっただらしないことを繰り返すと、どんどんメモリが圧迫されて、しまいにメモリ不足でどのプログラムも起動することが叶わなくなり、オペレーティングシステムを再起動せねばならぬはめに陥るのである。

これを『メモリーリーク』と呼ぶ。

この『メモリ破壊』『メモリリーク』二つの大罪が、C言語をして呪われたプログラミング言語と言わしめているわけだが、そうは言っても便利だから『良薬は口に苦し』ということで、皆騙し騙しC言語でプログラムを作っていたのである。

だが、

『そんな危ない言語じゃあ、堅牢なシステムなんて構築できねぇよ!バカ!』


と考える、心ある優秀な技術者達が出現したのだ。

そして彼らは、C言語に取って代わる、まともなプログラミング言語開発を目指したのである。

彼らの目標は、まず第一にポインタの排除は当然として、第二に、メモリの解放を自動化することだった。

「うっかりもののプログラマーが、メモリの後片付けを忘れるんだったら、言語処理系が自らやるしかない」というわけだ。

かくして、プログラマーは好きなだけメモリを確保しても、いちいち解放してやる必要がなくなったのである。不要になったら、言語処理系が勝手にメモリを解放してくれるのだから楽でいい。間違いもない。夢のようなプログラミング環境だ。

この自動メモリ後片付け機能を『ガーベージ・コレクション(ゴミ集め)機能』と呼ぶわけである。

そしてRubyにも、ガーベージ・コレクション機能が存在する。で、そのガーベージ・コレクション機能を制御するのが、GCモジュールなのである。

と、ここまでの説明で、不審に思われたことはないであろうか。皆さん。なにかおかしくないかな。

それは、

『ガーベージ・コレクション機能は、言語自体が自動的に行うサービスであるのに、なぜプログラマーが操作できるようモジュールが提供されているのであろうか???』

ということなのだ。

それは、ガーベージ・コレクション機能にちょっと問題があるからなのである。

ガーベージ・コレクションを行う機能即ちガーベージ・コレクタは、プログラム本体とは別スレッドで、平素ひっそりと邪魔にならぬようメモリの状態を監視している。

だが、実際にメモリを片付けるときは、プログラム本体を含む全てのスレッドに停止してもらわなければならない。これは当然だ。

ガーベージ・コレクタが懸命に片付け物をしているときに『あ、やっぱこれ使う』と横からひったくられると、永遠に片付けが終わらないのであるから。

これがプログラム全体の実行速度低下を招くのである。なにしろ処理が止っているのだからね。

この『Ruby・イン・ワンダーランド』に登場するサンプルプログラム程度であれば、まず影響はないのだが、もっと大規模なシステムになると問題が発生する。めちゃめちゃ遅くなるのだ。

であるから、ちょっと時間のかかる重たい処理に入る前に、実装者の意思でガーベージ・コレクタの動作を停止しておくということが必要になってくるわけである。重たい処理が無事終了すれば、またゴミ集めを再開してもらうとよい。

これを実現するために、GCモジュールが存在するわけなのだ。

絶対に安全(セイフティー)な言語の出現には、まだもう少し時間がかかるということなのだね。

最終更新:2009年03月12日 22:36