• 第3ファウンデーション

2006年に登場したWindows Vistaに関しては、「失敗作」との評価がもっぱらだが、Windowsのプログラミングという点から見ると、大きな転回点となった。というのも現在もWindowsの描画システムとして使われている、Windows Presentation Foundation(WPF)が入ったからだ。

Vistaには、新機能としてほかに「Windows Communication Foundation(WCF)」、「Windows Workflow Foundation(WF)」の3つのFoundationが搭載された。WCFとWFは現役を引退したが、WPFは、現在でも現役で、デスクトップ・アプリケーション(CWP。Classic Windows Platformアプリケーションとも)とUWP(Universal Windows Platform)アプリケーションで使われている。

WPFでは、画面解像度から独立した描画が可能で、画面の解像度(と表示倍率)に合わせて、適当なサイズで描画を行ってくれる。プログラムの作り方によっては、ジャギー(いわゆるギザギザ)を生じさせずに、ウィンドウサイズに合わせて全体を拡大縮小させることも可能だ(写真01)。WPFではじめてWindowsは、ハードウェアから完全に独立したプログラムを書くことが可能になった。

  • 写真01: 拡大縮小が可能なWPFアプリケーションの例。表示は、ウィンドウサイズに合わせて表示を拡大できるように作ることができ、拡大、縮小に文字の表示サイズも自動的に追従する。これにより、画面解像度が異なっても、ほぼ同じ大きさのウィンドウを表示できるようになる

    写真01: 拡大縮小が可能なWPFアプリケーションの例。表示は、ウィンドウサイズに合わせて表示を拡大できるように作ることができ、拡大、縮小に文字の表示サイズも自動的に追従する。これにより、画面解像度が異なっても、ほぼ同じ大きさのウィンドウを表示できるようになる

MS-DOSの時代、ソフトウェア開発は、手数は多かったものの、難しくはなかった。メモリとCPU性能以外の制約が何もなかったからだ。ビデオメモリには書き放題、デバイスも勝手に操作できた。ところが1985年にWindowsが登場すると状況は一変した。Windowsは、ディスプレイやプリンタなどのさまざまなデバイスを抽象化し、デバイスに依存しないプログラムの開発が可能だとの触れ込みだったが、その代償としてプログラムの構造が強制され、指定された方法でウィンドウを作成し、用意されたGUI部品を使ってのプログラミングを強いられた。しかも、ほとんどの制約には理由が示されず「こういうものだからです」としか説明されない。というのも、なぜ、そのように記述しなければならないのかを説明するには、Windowsそのものを説明しなければならないからだ。

筆者は、趣味でMS-DOSで自由気ままにプログラムを書いていたが、Windowsのプログラミングとは、まるで、強制労働のように感じ、ソフトを書くのがツラくなった(実はこのあとどんどんツラくなる)。このWindowsプログラミングの形態には、特に名前があるわけではないが、Win16やUser32/GDIなどの大雑把な呼び方がある。なにせWindows自体のことであり、名前を付けて区別する必要が当時はなかった。マイクロソフトはこういうとき、たいてい名前をつけない。

このプログラミングスタイルは、いまでも有効であるだけでなく、Visual C++でGUIアプリケーションを書こうとすると、原則この方法になる。Windowsの開発環境であるVisual Studio 2022を使い、Visual C++でWindows用のアプリケーションを作るためのテンプレートを選択すると、簡単なWindowsアプリケーションのコードが生成される。これを元に意味のあるプログラムを作れということなのだが、そのソースコードは、全部で12ファイルあり、プログラムに直接関係のある6ファイルの合計は注釈と空行を除いて232行もある。これだけの行があるのにウィンドウの中は真っ白、メニューは、終了とAbout表示だけで、アプリケーションの外枠でしかない。1989年に日本語版が出たCharles Petzoldの「programming windows」(邦訳プログラミングWindows)で、紹介されたサンプルコードとほとんど違いがない(もっともこっちはC言語だが)。ウィンドウ手続き関数(WinProc)を定義し、ウィンドウクラスを定義して登録、そこからウィンドウを作って、表示、更新を行ったあと、メッセージを処理するループに入る、という流れはまったく同じだ。

WPFとC#を使うテンプレートを元に、ほぼ同じ動作をするプログラムを作るとファイル数は7つ。うちプログラムに直接関係があるのは5つで合計行数は79行(注釈、空行を除く)と約1/3になる。このうちC#のコードが51行、XAMLのコードが28行である。

プログラミング的には、1991年にVisual BASICが登場するまでは、WindowsのプログラムはCで書くしかなかった。1985年から1991年まで、Windowsのソフトウェア開発は「暗黒時代」といってもよかった。Windows NTが登場してC++への移行が始まったが、ツラいことには変わりがない。そのあとCOMの導入などでC/C++でのプログラミングはさらに面倒になった。多くのサードパーティ・アプリケーションは、MS-DOSアプリケーションのままでWindows内で起動するように対応はしたが、Windowsアプリケーションへの移行はゆっくりだった。

多くのサードパーティ・アプリケーションが本格的にWindows対応を行うのは1995年にWindows 95が登場し、Win32APIが利用できるようになってからだ。メモリの制約からは脱することはできたが、まだ、チマチマとウィンドウの中を描画しないとダメ。ウィンドウやGUI部品の位置や大きさをドット単位で指定しなければならないからだ。さらにさまざまな解像度のモニターや対応したディスプレイカードが登場しているのに、実行時に判断しないと、高解像度モニターでは、小さなウィンドウが表示されてしまう。この問題にケリを付けたのが、2006年Windows Vistaに入ったWPFなのである。

今回のタイトルネタは、アシモフの「第2ファウンデーション」(原題Second Foundation。1953年)である。ファウンデーション・シリーズの第3作で、一応、これで完結したはずだったが、アシモフは、30年後の1982年にシリーズを再開、3作の「後編」を書いた後、2作の「前日譚」を書いた。最後の長編“ Forward the Foundation”(邦題ファウンデーションの誕生)が出版されたのは1993年のこと。第一作の“Foundation”(1951年。邦題銀河帝国の興亡)から42年が経過していた。これに比べるとWindowsのFoundationはコンピュータ技術としては長いとはいえ、まだ18年しかたっていない。