COMって何だ?

掲示板に昔書いた記事の再掲です。フォルダのカスタマイズをする上で、避けて通れないActiveXというテクノロジ。このテクノロジを根底で支える、COMについてのお話です。

COMの歴史

 昔は、つまりIE ver.1(Win95 Plus!に付属。懐かしい)の頃は、そもそもJavaScriptどころか、スクリプト自体が実装されていなかったらしいです。
 で、ネスケがJavaScriptをサポートしていたため(かどうかは知らないが)、シェアを奪われていた(思えばこれが"ブラウザ戦争"の幕開けだった…)。
 これはまずいと思ったMSが、IEにスクリプトを実装しようとした際、JavaScriptだけでなくどうせならVBVBAと似たスクリプト言語、すなわちVBScript(VBS)もサポートしようとした。
 でも、複数の言語をサポートするときに、HTMLのドキュメントオブジェクトをいちいち両言語用に定義していっては非効率だというので、どちらからも呼び出し可能なドキュメントオブジェクトモデル(DOM)を、COM(簡単に言うと、アプリケーションを部品から構築し、相互呼び出しを可能にする技術)を使って実装した。
 呼び出し側のスクリプトエンジンもCOM化し、スクリプト自体をいろいろなホスト(IE,ASP,WSH etc)から呼び出し可能にした。

# Microsoft版JavaScriptは、JScriptという名前でリリースされたが、
# COMコンポーネントを扱えるという、本家JavaScriptとは明確な差異があるために
# 名前を変えたのか、ほかに政治的な理由があったのか私は知りません(おそらく両方だろうけど)。
# その後、JavaScriptとJScriptは、ECMAという団体?が標準スクリプト言語としてまとめあげ、
# 両スクリプト言語は以後ECMA Scriptに準拠することとなる。(JScript.NETも一応ECMA準拠らしい)が、
# 非互換性はもちろんいっぱいある。でも一般によく言われるネスケとIEのスクリプトの非互換性は、
# おもにドキュメントオブジェクトモデル(これ、IEではDHTML(DynamicHTML)と称していますね)の非互換性に
# 起因している。

 これがIE3で完成したIEの基本構造です。
(このとき、HTMLのドキュメントモデルのほかに、ブラウザ部分のCOM化も完了しています。COMコンポーネントとなったIEブラウザは、メーラーのHTML表示に使われたり、WSHからの制御を可能にしたりしました)
(このあたりの話は、「Rubyを256倍使うための本 邪道編 (arton著)」に詳しく述べられています。こういう非常に興味深い話が、何気なく書かれているので、この本は侮れません)

 その後、WindowsのシェルであるエクスプローラのCOM化が完了し、IEとシェルが統合したのがIE4(Win98)です。フォルダのウィンドウが、IEのウィンドウと同じブラウザコントロールで表示されるようになりました。
(フォルダのWeb表示。ファイル表示部分はActiveXコントロールとして実装された。ActiveXコントロールもCOMが支える技術の一つ。ActiveX スクリプティングエンジンは、ActiveXコントロール等のCOMコンポーネントを自在に操ることで機能を発揮する。ちなみに、ActiveXコントロールとは、COMコンポーネントのうちフォームを持つものを指し、コンテナとしての機能を持つクライアント(VB,IE,HTA等)からの呼び出しが可能だが、WSHからは基本的に使用できない)
 HTMLヘルプやアクティブデスクトップなどもシェル統合によって追加された機能ですね。一般には、これでブラウザ戦争が終結したといわれます。

 その後、IE5では、これまでのようなドラスティックな変更は加えられなかったものの、確実に使い勝手を増していきました。また、HTA(HTMLアプリケーション)が登場し、IEは、ついにユーザーインターフェースの一つになりました。
(WinMeのヘルプとサポート、Win2000のアプリケーションの追加と削除等)

 Win95からWinMeまで、たしかにカーネルにたいした変化はありませんでした。
 が、シェルはとんでもなく変化してきているんです。
(ま、かなり迷走気味ですが、COMというキーワードを元に見ていくと、割と妥当な 進化を遂げていると言えなくもないかも)

 そして、基本的にローカルな世界で閉じていたCOMを、ネットワーク全体の規模に拡張したのがDCOMやらCOM+です。(なのか?ちょっとじしんなし)
 この仕組みを使って、ネットワーク上に分散コンポーネントな世界を構築することができるようになり、ADSIWMIといったリモート管理用のCOMコンポーネントが登場したりしました。
 また、これらの仕組みを使ってWindowsDNAという三層構造(データ、ビジネスロジック、プレゼンテーション)の開発モデルが提供されました。

 とまあ、20世紀の終わりは、WindowsがCOMというキーワードを元にこのような発展を遂げてきたのですが、最後の最後で大どんでん返しが待ち受けていました。
 みなさんもすでにご存知の、.NETです。.NETは、インターネット上に巨大な仮想マシンを構築してしまおうという仕組みです。その部品としてはCOMではなく、.NET Frameworkというライブラリが新たに登場します。そして、その部品をつなぎ合わせる開発言語としてCommon Language Runtime(CLR)が使われます。
 CLRは正確に言うと言語ではなく、.NETに対応した言語を動作させる共通ランタイムです。その言語には、VB.NETJScript.NETC#等があります。
 .NETの登場で、COMは完全にWindowsのアーキテクチャのメインストリームからは外れることになります(実際は100%というわけでもなく、.NET FrameworkにもCOMのオブジェクトは存在する)。

 以上、駆け足でCOMの歴史を追ってみましたが、この歴史は「スクリプトから見たCOM」の歴史であり、メインストリームからは、ちと(かなり)離れた解説になっていると思います。本気で「プログラマの目から見たCOM」を勉強なさりたいかたは、各自でお願いします。

関連リンク

WSHの原理に迫る
COM仲間?のWSHの原理を解説してます。


[Home]