2010年03月20日 04:30 [Edit]
Every Byte is Sacred - 書評 - ガベージコレクションのアルゴリズムと実装
著者より献本御礼。
これほど地味かつ即実務に役立たない、しかし確実にプログラマーの滋養になる本が出版される日本の出版界に乾杯!世界で二番目(著者調べ)、国内で初のGC本は、実に滋味豊かだ。
とはいえ、本書はこの話題に関してMECEというわけでもない。というわけで本entryでは本書に何が書いていないかを主に紹介していく。何が書いてあるかは本書で確認すればよいのだから。
本書「ガベージコレクションのアルゴリズムと実装」は、コンピューターの資源管理の技術の一つ、ガベージコレクション(以下GC)についてまるまる一冊を費やして考察した本。
目次 - 「ガベージコレクションのアルゴリズムと実装」という本を書きました。 - I am Cruby!より
|
|
「技術の一つ」とあえて書いた。別の言い方をすると、それ以外の資源管理法に関しては本書に書かれていないということになる。本書の性格を考慮すれば書く必要はないのだけど、それでも序章で紹介はしておいて欲しかったところ。
たとえば、スタック。あらかじめ使用する資源量がわかっていれば、実は全てスタックにのせてしまえばGCは不要である。そうしたプログラムは少なくなく、C言語の初心者本のサンプルはたいていそういうプログラムである。別の言い方をすれば、malloc()を使わずに済むプログラムにGCはいらない。
しかし実際のプログラミングにおいて、このやり方は無駄が多い。なぜならプログラマーは考えうる最大の資源を確保せざるを得ないからだ。実際に使う時にはたとえ1Byteで済む場合でも、1MBになる可能性があれば、問答無用で1MBをあらかじめ用意しておかなければならない。
これを防ぐには、必要な時に、必要なだけ、動的に資源を確保すればよい。それがmalloc()だ。これをどうやるのかは、実は本を一冊書けるネタでもあるのだが、簡単な実装例であればK&Rにも載っている。
そして使った後は、free()で返す…のだが、この返し忘れによるバグが後を経たない。資源のポイ捨ては地球にもコンピューターにもやさしくないので慎むべきではあるが、しかし環境の方でよきに計らってくれたら楽なのに。
その願いをかなえてくれるのが、
オビ by まつもとゆきひろ古からの魔法ガベージコレクション
というわけだ。ずいぶん長い前置きになってしまったが、序章でここまでは書いておいて欲しかったというのが正直な感想だ。その代わりというわけではないが、「初めての人のためのLISP」の著者でもある監修者が、すばらしい序文を寄せている
実は、GCは仮想記憶なのです。通常の仮想記憶は、実メモリは大きくないのに、それを二次記憶を使って「仮想的に」アドレス空間一杯あるかのごとく見せる技術です。つまり、空間方向にメモリを拡大する技術なので、私はこれを空間的仮想記憶と呼んでいます。とするとGCは使い捨てメモリを永久に与え続けてくれる時間軸方向の、時間的仮想記憶ということになります。
本書が扱っているのは、その時間的仮想記憶が実際にどうなっているか、である。
やり方はいくつもある。そしてそれぞれに一長一短がある。Mark & Sweep は確実だが遅い。参照カウンターは速いが循環参照を回収できない…保守的(conservative)GCは「ゴミでないものを捨てる」危険が少ないが、ゴミを確実に捨てられない。厳格(exact)--本書では「正確」なGCは、ゴミを100%回収できるが、そのかわり「ゴミ袋」がかさばる…。
こうした苦労を、ふつうのプログラマーは知る必要はない。我々が清掃業者のことを知らなくても日々生活できるように。しかし知っているのと知らないのとでは、プログラムの質に格段の差が出るはずだ。特に必要な資源と確保できる資源の差が少ない環境ではそうである。本書を薦めるゆえんだ。
とはいえ、細かい点で気になるところは少なくない。たとえば本書で用いている疑似コード。関数は{}でくくるのにifはインデントというのはいささか面食らう。参照カウンターをせっかく取り上げているのに weak reference に関する言及がない(Perlが有名だが、Pythonにもちゃんとある)…しかしこれだけ多彩なアルゴリズムを実装とともに図解した本は今までなかった。こうした不備不満は、保守的GCで回収しきれなかったゴミとみなすべきだろう。むしろ不満があった方が読解が進むぐらいに思った方がいい。
とはいえ、「空間的仮想記憶」の方にも多少は言及があってもよかったのではと感じる。こういっては何だが、アプリケーションの場合、GCに瑕疵があっても終了してしまえばそれでよい。しかしOSからしてみれば、プロセス即オブジェクト。これをきちんと回収しなければすぐにコンピューターはゴミ屋敷になってしまう。実際そういうOSは今だって少なくない。
それとて再起動してしまえばきれいさっぱりにはなるのだが、それは再起動できる場合であって、端末はとにかくサーバーはそういうわけに行かない。実際何年にもわたって再起動なしで稼働しているコンピューターは少なくない。
そんなわけで、本書で「時間的仮想記憶」を学んだ後は、ぜひ「BSDカーネルの設計と実装」を。それこそが、おそらく
序文多くの読者にGCの重要さを納得していただければ、GCがハードウェアやOSによってサポートされた真の時間的仮想記憶に発展することがあり得るでしょう。ワツィが前書きで述べたかった本音はこれです
の「実装」に相当するはずなのだから。
Dan the Sloppy Garbage Collector
この記事へのトラックバックURL
知識の生態学や知識の衛生学や知識の病理学や知識の疫学もこれから整備されていくのだろうと思います。
そういう知識が充実するうちに、知識や時間をみんなが粗末な扱いをしないようになるのだろうとも思います。


