2008-09-04

電源コードを抜くべからず

Windows Confidential: Windows 95 Unplugged

実に面白かったので紹介する。

Windows 95で動く32bitのプログラムは、32bitコンパイラを使うし、16bitのプログラムは、16bitコンパイラを使うものだ。しかし、Windows 95は特別なコンパイラが必要だったのだ。そのコンパイラは32bitと16bitの両方を扱う必要があった。Windows 95はまた、その二つのコードをつなぐためと、WIndows 95のドライバフォーマット、VxDのために、特別なリンカーを必要とした。

Windows 95の開発チームは、言語とツールの開発部門に、この特別なコンパイラとリンカーを作るように言った。コンパイラのチームはさだめし変に思ったことであろう。「たったの二つのDLLをコンパイルおよびリンクするのにしか使われない、特別なコンパイラを作れって?」と。その通りだった。しかしそれは、とても重要なDLLだったのだ。

コンパイラの開発部門は、要求された特別なコンパイラを作った。そして、そのコンパイラはWindows 95のビルドプロセスに組み込まれた。もちろん、コンパイラは、新しい最適化やバグフィックスのたびにアップグレードされた。

ある日、Windows 95のビルドはとても遅くなった。ほんの数秒でリンクできたはずのファイルが、何分もかかるようになったのだ。ファイル自体は問題なく生成されるのだが、ひたすら時間がかかる。しかも、ただ一人のコンピュータに起きた話ではない。開発チーム全員に起きたのだ。我々のコードが何かリンカーにとって難しいものになったのだろうか。あるいは、リンカーのバグに引っかかったのだろうか。

デバッグの結果、我々は原因を突き止めた。最新のリンカーには、コンパイラチームが消し忘れたデバッグコードが含まれていたのだ。そのデバッグコードは、コンパイラチームの部屋のあるコンピュータに、ログを出力するようになっていた。そしてそのコンピュータの電源が、たまたま落とされていたのだ。

デバッグコードのあるバージョンのリンカーは数週間ほど問題なく動き続けた。Windows 95のビルドでVxDをリンクするたびに、コンパイラチームの部屋のコンピュータのあるファイルが更新された。そのコンピュータの電源が入っており、ネットワークにつながっている限りは。しかし、ある日コンピュータの電源が落とされ、ビルドが遅くなってしまったというわけだ。

この問題は、すぐに修正された。

この話のオチはいくつかあるが、語り手によってオチが変わる。私の場合のオチは、「んで、そのコンパイラの開発者は、Windowsチームにやってきて、今では俺の上司さ」となる。今でも、私はこの笑い話をよく言うのだ。

ところで、私の上司にこの話を言わせると、オチが変わる。「そもそも、俺はそんなデバッグコードなんざ書いてなかったんだ。ありゃ俺の同僚のコードだった。奴は自分のコンピュータをデバッグログで一杯にしたくないんで、俺のを出力先にしたんだ」

No comments: