Compatibility
いつも楽しみにしているRadium Software DevelopmentsのRantsで,先日Windowsの後方互換性に関する話題が紹介されていました.
http://www.radiumsoftware.com/0406.html#040624
中でも以下で紹介されているように,Windows 95にはSimCityのバグに対応するコードが組み込まれているという話は私の周囲でも大きな反響がありました.
これは少し意外なことでもあった。当時の Microsoft がゲームの動作に関してそれほどまでの配慮を払っていたとは思いも及ばなかったからだ。このような特殊な配慮の行われた例としては, Windows 版の初代 "SimCity" を挙げることができる。元記事は Joel Spolsky 氏の "Chicken and Egg Problems" だ。
Windows 3.x 版の SimCity を書いた Jon Ross 氏が私に語ったところによれば,氏は件のゲームにおいて,解放されたばかりのメモリをリードするというバグを誤って残してしまったそうだ。これは Windows 3.x ならば問題無い。メモリはどこにも移動しないからだ。さて,ここからが素晴らしいところだ。ベータバージョンの Windows 95 を試してみたところ,案の定 SimCity は動かなかった。そこで Microsoft はバグの追跡を行い, SimCity の監視を行う特殊コードを Windows 95 に組み込んでしまった。そのコードは SimCity が動いていることを検出すると,メモリアロケータを特殊なモードへ移行させ,メモリをすぐには解放しないような設定にしてしまう。これは,後方互換性に対する執念の一例であり,これこそが人々を Windows 95 へアップグレードさせようとする要素であったわけだ。
確かにこのような裏方的な作業はユーザだけでなく意外とWindowsアプリケーションの開発者の間でも余り知られていないように感じます.Rantsでは互換モードを必要とするアプリケーションの確認にsysmain.sdbやapphelp.sdbを直接覗いてみる方法が紹介されていますが,折角ですのでMicrosoftが開発者向けに公開している互換性検証ツールを利用したブラウズ方法を紹介しておきましょう.
まずは,以下から"Windows Application Compatibility Toolkit(ACT) 3.0"をダウンロードしてインストールを行います.
http://www.microsoft.com/downloads/details.aspx?FamilyID=7fc46855-b8a4-46cd-a236-3159970fde94&DisplayLang=en
インストールが完了するとスタートメニューに"Microsoft Windows Application Compatibility Toolkit"という項目が追加されています.この中から"Compatibility Administrator"を選んで起動してみると,オンラインアップデートチェックに関するダイアログの後に以下のような画面が表示されます.
アプリケーション監視用のデータベースを閲覧するには,"System Database"以下の"Applications"を選択します.ここには実に多くのアプリケーションが登録されていて,手元の環境でその数は1792個に上ります.適当にアプリケーションの1つを選択すると,右上のペインにそのアプリケーションの必要とする互換性修正項目と,正しくアプリケーションを識別するための固有情報が表示されます.さらに互換性修正項目を1つ選ぶと,右下のペインに詳細な解説が表示されます.私の環境ではSimCityという項目はありませんでしたが,幸か不幸かSimCity 3000に関する項目がありましたので以下に例としてあげさせて頂いています.
この互換性修正項目が適用されることから,SimCity 3000(無印)のプログラマはシステムディレクトリのパスをハードコードしていたと推測されます.ただし,このゲームの公式動作環境はWindows95/98のみであるため,プログラマの心情的には上記SimCityのようなバグと同列には扱いたくないという気もします.
一方,左のツリーの"Compatibility Fixes"と"Compatibility Modes"からは,全ての互換性修正項目と互換モードを閲覧することができます.こちらもかなりの数の項目が登録されており,互換性に関するMicrosoftの執念を垣間見ることができます.
結果的にこのデータベースは,有名アプリケーションが抱えている問題の一部をリストアップすることになっています.しかし,これらを他人の失敗とせず,自分のプログラムがこのようなブラックリストに載らないで済むような教訓を得ることもプログラマとしては大切な姿勢かもしれません.