
多くのユーザーを抱えるWindowsは、古いWindows向けのプログラムが最新のWindowsでも動作するという互換性の高さが魅力の一つに挙げられることがあります。
今回、Stanislav Safronov氏は、40年前のWindows 1.0向けに、実際に動く小さなゲーム「Xonix」を作るという実験に挑戦し、当時のWinAPIと現代のWinAPIがどれほど共通しているのかを確かめています。
Windows 1.0は16bitプロセッサ、MS-DOS、協調型マルチタスクという古典的な環境で動作するOSですが、アプリケーションAPIに目を向けると、驚くほど今と同じ構造が残っていることがわかったとのことです。
当時の開発環境とWinAPIの姿
ゲームの作成に使用したのはMicrosoft C 4.0です。Microsoft C 4.0、Windows黎明期のコンパイラで、ANSI C 標準が存在する前のK&R Cを実装しています。そのため、コードは古い関数宣言スタイルや、FARやPASCALといった廃れたコンパイラ拡張を使用しています。
LRESULT FAR PASCAL WndProc(hWnd, message, wParam, lParam)
HWND hWnd; unsigned int message; WPARAM wParam; LPARAM lParam;
{
…
}
それでも、ウィンドウプロシージャ、メッセージループ、タイマー、リソース、キーボード・マウス入力といった基本要素はすでに揃っていました。
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(hWnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
メッセージループは現代とほぼ同じ構造で、40年前のコードを見ても「見覚えがある」と感じるほどです。
ゲーム実装で見えた最小限のWindows
ゲームはWM_PAINT、SetTimer、GDI描画、キーボード入力といった最小限の機能だけで構成されていて、外部ライブラリは一切使わず、Windows 1.0が最初から持っていた機能だけで完結しています。
同じソースコードがWindows 1.0から現代の64bit Windows SDKまでコンパイル可能で、内部実装は大きく変わっても、アプリケーションモデルはほとんど変わっていないという事実が証明されました。
実際に作成した16bitアプリをさまざまなWindowsで動かしたところ、Windows 1.xからWindows 10(32bit)までそのまま実行可能という結果になりました。ただし例外もあり、Windows 95では起動しないなど、Win16サブシステムの違いによる影響も見られます。また、64bit版WindowsではWin16サポートがないため実行することはできませんでした。それでも、バイナリ互換性が40年近く維持されているのは驚異的です。
結論:WinAPIの設計は長寿命だった
この実験が示す最大のポイントは、WinAPIの基本設計が40年経っても通用している という事実です。
内部構造は大きく変わり続けているにもかかわらず、アプリケーション側のコードはほとんど変わらずに動き続けることが可能となっています。数年で技術が陳腐化するソフトウェア業界において、これは非常に珍しいことといえるかもしれません。
