Windows 秘話電源が入っていない Windows 95

Raymond Chen

Windows® 95 向けの 32 ビット プログラムには一般的な 32 ビット コンパイラを使用することができ、16 ビット プログラムには一般的な 16 ビット コンパイラを使用できますが、Windows 95 自体には、32 ビットと 16 ビット両方の環境を理解して、そのギャップを埋めることができる特殊なコンパイラが必要でした。Windows 95 には、それら 2 種類のコードの結び付ける方法を理解するカスタム リンカと、VxD (Windows 95 のドライバ形式) 用のカスタム リンカも必要でした。

Windows 95 チームは、こうした特殊な目的を持ったコンパイラとリンカを用意することを、言語部門とツール部門に依頼しました。言語部門は、変わった要求だと思ったことでしょう。「X、Y、Z の 3 つのことを行うコンパイラを作成するつもりで、その役割はたった 2 つの DLL をコンパイルするだけだって」。そのとおりなのです。しかし、実は、この 2 つの DLL が非常に重要でした。

明らかに途方もない要求なのにもかかわらず、言語部門とツール部門が期待に応えてくれたことで、この非常に特殊なコンパイラとリンカが Windows 95 ビルド プロセスの一部になりました。もちろん、コンパイラは最初から完全な形ではありませんでした。Windows チームはまず暫定版を受け取り、その後、新たな最適化が実装され、バグが修正されていく過程で定期的に更新版を受け取りました。

ある日、Windows 95 のビルド速度が突然落ちました。数秒でリンクされていたファイルが、突然リンクに数分かかるようになったのです。依然としてファイルは正常に生成されていましたが、大変時間がかかりました。この現象は、ある開発者のコンピュータ上だけで起こっていたわけではありません。チーム全体のあらゆる開発者がこの問題に直面しました。リンカの一部に異常があり、コードが突然この異常に遭遇してしまったのでしょうか。リンカのバグを偶然発見したのでしょうか。

いくつかデバッグを行った後で、問題の原因がわかりました。最新バージョンのリンカにはいくつか診断コードが含まれていて、言語部門の担当者は最新のリンカを Windows チームに引き渡す前にこうした診断コードを削除し忘れていたのです。この診断コードは、コンパイラ チームのメンバのオフィスにあるコンピュータに格納されていたファイルに記録をログ出力するものでした。そして、そのコンピュータの電源がたまたまオフになっていたのです (これは、Leslie Lamport の発言を思い起こさせます。Leslie Lamport が分散システムを評して「聞いたこともないコンピュータが停止しただけで何もできなくなってしまうシステム」と表現したのは有名な話です)。

fig84a.gif

そのバージョンのリンカは、数週間は順調に実行されていました。Windows 95 をビルドする際だれかが VxD をリンクしようと試みるたびに、その開発者のコンピュータにあるファイルが更新されていました。そのコンピュータの電源が入っていてネットワークに接続されている限り、だれも気付きませんでした。しかしある日そのコンピュータの電源が切られたため、すべての処理の速度が落ちたのです。

問題さえわかってしまえば、コンパイラの担当者がリンカから診断コードを削除した修正プログラムを Windows チームに提供するまでそう長くはかかりませんでした。

このジョークの落ちは、だれが話すかによってさまざまです。私がこの話をすると、「そのコンパイラの開発者は、後に Windows チームに移籍し、私の上司になったんだ」という落ちになります。上司をちょっとからかいたいときは、この話を何度も持ち出して楽しんでいます。

しかし、私の上司がこの話をすると、ジョークの落ちはまったく違ったものになります。「後からわかったことだけど、その診断コードを作成したのは私ではなっかったんだ。作成したのは私の同僚の 1 人で、自分のコンピュータが診断情報であふれかえるのが嫌で、私のコンピュータをこっそり使ったんだよ。」

Raymond Chen は自分の Web サイト「The Old New Thing」および同じタイトルの書籍で、Windows の歴史と Win32 プログラミングについて扱っています。彼の DNA は無意味なコードで満たされています。