2003年09月26日
川俣晶の縁側ソフトウェア技術雑記total 8427 count

意外と盲点? Windowsのウィンドウシステムに見るオブジェクト指向風味

Written By: 川俣 晶連絡先

 Windowsのウィンドウシステムには、ちょっとしたオブジェクト指向風味が含まれています。このあたりの仕組みは、生APIを隠す様々なライブラリが存在するおかげで、意外と知られていないかもしれない、ということで、書いてみることにしました。

 念のために付け加えるなら、これはWindowsがオブジェクト指向のOSであるという話ではありません。また、ここでいうオブジェクト指向が、Javaに代表されるような現在多くの人がイメージするオブジェクト指向と一致する訳でもありません。ここで取り上げているのは、オブジェクト指向「風味」という言葉で分かるとおり、それっぽい味もするということであって、オブジェクト指向であるという断定ではありません。

 それはさておき。この話の発端は、「【▲→川俣晶の縁側→過去形 本の虫→感想編】テスト駆動開発入門 ケント・ベック ピアソン・エデュケーション」( https://mag.autumn.org/Content.aspx?id=20030925164420 )の以下の部分にあります。

「ちなみに、メッセージを交換する主体、という機能は、あるOSのある重要な機能で嫌になるほど使った経験がありますが、そのうちに時間があれば書きましょう」

 つまり、直接アクセスできる変数などという軟弱な機能は使わず、メッセージを交換しながら動作するオブジェクトによって実現されるオブジェクト指向、というイメージから連想したものがあるということです。

 それは、ずばり、タイトルにあるようにWindowsのウィンドウシステムです。

 Windowsのウィンドウは、メッセージを受信する主体として機能します。SendMessageのようなAPIを使ったことがあれば、これは容易に理解できると思います。

 しかし、メッセージを受信できるからオブジェクトをイメージしたというような単純なものではありません。

 Windowsのウィンドウは、ウィンドウ クラスというものから生成されます。ウィンドウ クラスは、RegisterClass(Ex)というAPIによって登録されます。このAPIはウィンドウの振る舞いを規定するウィンドウ プロシージャや、ウィンドウのスタイル、クラスやウィンドウに付随して記録する記憶領域のサイズなどを設定します。そして、CreateWindow(Ex) APIによってウィンドウの実体が生成されます。RegisterClass(Ex)は、まさにClassという言葉が入っていることから、オブジェクト指向的なクラスの宣言を連想させます。CreateWindow(Ex)の方はインスタンスの生成に対応することになります。

 ここで、「クラスやウィンドウに付随して記録する記憶領域」と書いた通り、クラスやウィンドウに付随した記憶領域を確保することができます。これは静的なメンバ変数と、通常のメンバ変数に対応するものと見ることができますが、アーキテクチャ的に普通のプログラム言語の変数として扱うことはできません。クラスや付随したものは、SetWindowWordやGetWindowWord、ウィンドウに付随したものはSetClassWord、GetClassWordといったAPIで読み書きします。(16bitの世界を意識している書いているのでこれらのAPIの名前を出していますが、Win32の世界だとWord系ではなくLong系を使うべきであるようです)。これらの記憶領域が変数として見えないというのは、システムを抽象化するという意味では、こころざしの高いやり方と言えます。それが現実的に望ましいかどうかはともかくとして。

 もう1つ、Windowsでは、サブクラス化というテクニックが使用されます。これは、あるウィンドウ クラスのウィンドウ プロシージャをオーバーライドすることで、ウィンドウの振る舞いを変更するものです。これは、サブクラスという言葉から連想される通り、オブジェクト指向の「継承」が連想されます。実際、C++が導入される以前、Cを使っていたWindowsプログラマが、平然とサブクラス化という言葉を使いながら仕事をしていたという事実があります。

 さて、このようなオブジェクト指向風味を感じさせるウィンドウシステムのアーキテクチャはどのように生まれたものでしょうか。

 その経緯は良く分かりません。

 しかし、このようなスタイルが、「センスの悪い技術者がC++やJavaを曲解することで生まれた」と思うのはおそらく間違いでしょう。

 このアーキテクチャは、1986年の最初のWindows バージョン1の時点で既に成立しています。ものの本によれば開発には数年を要したといいますから、もっと早い時点である程度のアーキテクチャは固まっていたのでしょう。仮に1986年と考えても、少なくともJDK1.0がリリースされる10年前ですね。C++はいつ頃生まれたのかと、本棚からすぐ取り出せたプログラム言語C++第2版(B.ストラウストラップ トッパン出版)より引用してみると。

 「ひとまとめにして"クラス付きのC"として知られているこの言語の初期バージョンは1980年以来使用されてきた」

 「C++は1983年7月に、著者の研究グループの外で初めてインストールされた。しかしながら、現行のC++の特徴のいくつかはまだ全く考案されていなかった」

 といった記述が見えます。

 それなら、いくつかの特徴を欠いているとはいえ、WindowsがC++を参考にする時間的余裕はあったではないか、と思うことはできるでしょう。しかし、時代的な背景を考えると、その説は素直には受け入れられません。というのは、C++がオブジェクト指向プログラム言語の主流として確定したのは1990年代初期のことだと(個人的に)思うからです。Windowsに限っても、1990年頃には、C++ではないオブジェクト指向開発言語(何という名前か忘れてしまった! Turbo Pascalのことではないよ!!)もあり、まだ混沌とした可能性に満ちていたと言えます。それがC++へと収束して行くには、(パソコンレベルの話なら)、Turbo C++(Borland C++)、Zortech C++といった製品がリリースされ、業界の主流がC++へ向かう流れが見え始めた後、マイクロソフトが初めてCだけでなくC++をサポートした純正開発環境MS-C 7.0をリリースする必要があったと言えます。逆に言えば、これより前の時点で、特にC++だけを尊重したり、これを主流と位置づける業界動向は無かったと思います。むしろ、オブジェクト指向といえば、最初に名前が出るプログラム言語はSmalltalkという状況だったような気がします。そして、Smalltalkを使うには、ワークステーションが必要で、XeroxのDolphinという名前だったか、そんな高価なものを指をくわえて見ていた時代というのが確かにあったのです。

 そういう時代の中で、最先端の何か(それがSmalltalkなのか別のものなのかは分かりませんが)を貪欲に取り込もうとした結果として、Windowsのウィンドウ アーキテクチャがあるのかもしれません。単なる推測と感想に過ぎませんが、少なくとも、C++やのようなスタイルがいつでも常識であったと思うことは間違いでしょう。むしろ、一時はC++イコール異端とする風潮すらあったような気がします。そして、C++の悪い部分を切り落としているはずのJavaにも、ある種の異端的な雰囲気(現在は当たり前になってしまった!)は残っているのかも知れません。

 以上いろいろ書いてみましたが、偉そうなことを言えるほど、オブジェクト指向について詳しいわけでも、歴史を追いかけているわけでもないので、単なる感想に過ぎません。かなり曖昧な記憶に基づいて書いていますので、ここに書かれた内容が「間違いのない事実」ではないことはお断りしておきます。

 ただし、例外として、Xeroxの雑誌広告の写真でDolphinやStarを見ながら指をくわえて見ていた私がいた、ということだけは間違いない事実だということははっきりさせておきます。え? そんな事実どうでもいい? こりゃまた失礼しました~~~~

以下余談。

Alto、Star、Smalltalk、Lisa、Mac 年表

https://sumim.no-ip.com:8080/collab/24

 によると、最初のSmalltalkであるSmalltalk-72は1972年。コメント欄を見ると、「最初のSmalltalkは千行程度のBASICプログラムで激遅」と書かれているのが、なかなか素晴らしいですね。オブジェクト指向言語の処理系が、BASICプログラムであったとは面白いです。ちなみに、PC-8001のN-BASICでPascalのサブセットモドキのコンパイラを書いたことがありますので、どれぐらい激遅かは容易に想像ができます。

Facebook

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

https://mag.autumn.org/tb.aspx/20030926143607
サイトの表紙【技術雑記】の表紙【技術雑記】のコンテンツ全リスト 【技術雑記】の入手全リスト 【技術雑記】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.36 (Alpha-Test) Copyright (c) 2004-2021 Pie Dey.Co.,Ltd.