前回、Windowsの歴史を振り返ってみました。
で、
思ったのは、WindowsというOSの本質ってなんだろう、ということ。
(1)マルチタスク、マルチスレッド
マルチタスクとマルチスレッドというと、すぐウィンドウがオーバーラップするGUIのOSを思い浮かべますが、元々はプリエンプティブマルチタスクといえども8bitの時代からCUIベースで存在しました。(若い時は、富士通のFMシリーズでOS-9が走ると聞いてうらやましかったことを記憶しています。)また、プレゼンテーションマネージャーというGUIを起動することもできましたが、複数のDOSが走るOS/2がありました。いずれにしても、シングルタスク、シングルスレッドであった昔は憧れでも今はフツーに提供していますよね。でも、私(わたし)的にはこの側面がとてもありがたいと思っています。
(2)リソース、プロセス、接続・アクセス等管理
これは「OS論」のような話になり、ここまで広げると素人には荷が重いですよね。素人にはこちらの方がなじめます。また、カバーする領域が広いので、人によって切り口が異なり、却って迷宮に入っちゃいます。
(3)GUI
一般的にはこれが特徴的に映りますね。特に(日本では余りWin3.0がはやらなかったので)Windows 95では熱狂して受け入れられました。しかし、昔はCPUの力が弱く、メモリーも遅くて高価だった為、APIを含めて極めて多くのコンピューターリソースを費やすGUIには腰が引けていたというのが事実です。その後CPU性能が上がり、メモリーも潤沢且つ安価に手に入るにつれ、GUIのデザインも世につれ変遷(Windows 1.0~Windows 10)してきました。その結果、現在は余りコストやスピードに気にせずにGUIをエンジョイさせていただいてますね。
所でこのGUI、というかウィンドウですが、どのようになっているのでしょう?これはプロ目線過ぎて余り参考になりませんね。一方、これは簡単、というよりは雑ですね。Wikiでは、
「GUIの仕組みは?
基本的には「デスクトップ」「ウィンドウ」「メニュー」「アイコン」「ボタン」など要素を組み合わせて構成され、それらをポインティングデバイスによって操作されるカーソルを通じて指示を与える。 端的に言うと、画面上のボタンや画像などを選択する事でリアクションを発生させる仕組みを総称してGUIと言う。」
と書かれていますが、具体的に言うとどういうことかを考えてみました。
(1)マウスデバイスを動かす机上の移動量に合わせて、画面上にマウスカーソルを「動かす」。(背景画像の取り込み→マウス輪郭のビット0画像と背景画像をANDでとる→マウス画像とその背景画像をORでとる[表示]→保存した背景画像を表示[消去])
(2)マウスを使った処理操作の際に「スクリーン座標位置」と共に「どのボタンがどう押されたか」がPCに分かる。
(3)画面上のウィンドウは、
①ウィンドウの登録種類(例:オーバーラップウィンドウやボタンコントロール等)に合わせた形状等の一般情報を予め保持(ウィンドウクラス)し、
②特定のプロセスを担うメインウィンドウ、それに配置されたメニュー、コントロール等の個別のウィンドウインスタンスのスクリーン座標位置、領域(幅、高さ)、表示順(Zオーダー)を常時管理し、それに合わせて、
③「奥(Zオーダーの低い方)」から順に(現実にはオーバーラップ領域一番上の画像のみ)
描画してゆくことで入出力を管理します。
(4)画面描画は画面情報に変化がある都度、描画を行うウィンドウメッセージ(WM_PAINT)により描画処理され、常に最新の位置、領域、順序の情報が反映されます。
なにか、いつもPCが何も言わずに遂行している「GUIの中の基本中の基本の画像描画処理」を具体的に考えるだけで素人はお腹がいっぱいになってしまいますね。
うへぇ。
まぁ、素人はPCをブラックボックスとして扱うのが無難である、ということはわかると思います。次はもっと絞ってウィンドウの描画についてみてみますか。
ps. ウィンドウと言えば、昔Z80という8bitのROM Basic PC(具体的にはMZ2500といいます)でアセンブラーによるプログラミングをしていた時に「CUIでマルチウィンドウ」を実現したエディターを使っていました。勿論64KBの空間なので一つのファイルの異なる部分を2-3のウィンドウで表示するだけのものでしたが、↓のような表示でそれはそれで面白かったです。
ーーーーーーーーーーー
|abcde |
|01234 |
| |ーーーーーーー
| | |
| | |
ーーーーーーーーーーー |
|vwxyz |
|56789 |
ーーーーーーーーーー





