オブジェクト指向プログラミングってなに?
これもまず重要なポイントは、オブジェクト指向という名の元に
マーケティングが行なわれているというところで、
オブジェクト指向のコアとなる部分はなにかを把握しなくてはならない。
逆にオブジェクト指向の前はなんだったかを考えるとだいたいわかる。
オブジェクト指向言語の前の言語は、手続き指向言語といわれる。
手続き指向は手続きを順に書いていったもので、
じゃぁオブジェクト指向というのはなんなのか?
まず私はオブジェクト指向は言語とは直接関係がないという立場をとる。
つまりどんなプログラミング言語を使っても、オブジェクト指向で
プログラムを書いていくことはできる。
たとえばアセンブラでゲームプログラムを書くことを考えてみよう。
いろいろな種類の敵がいるゲームを想像する。
それぞれの敵の種類ごとに、移動ルーチン、衝突判定などを作っていると、
敵の種類が一つ増えたり、全体に影響するようなパラメーターを変更したいとき
やっかいだろう。
そのときたとえば、そのルーチンへのポインターのテーブルを用意しておく。
generic_enemy_move
generic_enemy_collision
generic_enemy_die
など。そしてそれぞれの敵の種類ごとにポインターのテーブルを用意する
enemy1_move = generic_enemy_move
enemy1_collision = generic_enemy_collision
enemy1_die = generic_enemy_die
そうすると、一般的な処理をする敵のルーチンができたことになる。
もし動きの部分だけを一般的な処理からはずそうとすると、
その部分だけ違うルーチンをつくり、ポインターのテーブルにいれてやる。
特定の操作の部分だけをいれかえることができるようになる。
(もう少し説明をちゃんとしよう。)
●What is ActiveX, OLE, COM, DCOM, COM+ ?
ActiveX, OLE, COM, DCOM, COM+ とはなにか?
名前だけは知っていて、なんとなくオブジェクト指向のプログラミング技術
というレベルで知ってはいるが、よくわからなくて知ってみたいんだけど、
なんだか恐くてよくわからない、という人は結構いるのではないだろうか。
実際のところ慣れてしまうとそんなに難しい概念ではない。
しかしその前にまず絶対に押えておかなくてはいけないポイントがあって、
それはマイクロソフトはこういった言葉を使って、
意図的にユーザーを混乱させようとしているという事実だ。
混乱させようとしているという言葉が悪ければ、
できるだけうまくマーティングしようとしているということだ。
具体例をあげると、かつてOLEと言われていたものと、
ActiveXと言われているものはほとんどまったく同じ技術のことを指す。
ほとんどまったく同じであるのに、革新的な新技術を売りだそうとしている
ように振舞うのである。マーケティング理論的にはこれはまったく正しいが、
ユーザー(開発者)の立場としては、これに惑わされず本質だけを見ぬくことが
大切である。
DISCLAIMER: 以下、私(江渡)の理解を元に簡単に解説したものなので、おそらく
間違っている部分が多々あるでしょうが、まったく責任はとりませんのでよろしく。
さて、じゃ、いったい何なの?
UNIXのC言語で開発するときのことを考えてみよう。
hello.c というソースをかき、それをコンパイルして、
hello.o というオブジェクトファイルを作り、それとlibcをリンクさせて、
hello という実行形式のファイルが作られる。
(DOS流に書くと、hello.obj, hello.exeになる)
もう少し細かく見る。
main()
{
printf("hello, world!\n");
}
というプログラムがあるとして、printfの実体はどこにあるのだろうか?
実体はlibcの中にある。libcの実体は /usr/lib/libc.a (だっけ?)にある。
では、実体がlibcの中にあるという事実はどうやって知ればいいのか?
それはあらかじめ知っているのだというしかない。
つまりプログラマーはなんらかの技術文章などの手段で、
libcの中にprintfの実体が入っていると知るのだ。
libcの場合はCコンパイラが自動的にリンクしてくれるのであまり気にする必要がなく、
printfなどは最初から入っているのだと考えることができるのだが。
さてprintfの実体のありかはわかるとして、printfの使い方、引数をどのように
指定したらいいのかはどこに書かれているのか? stdio.hに指定されているのだ。
この.hファイルの中にprintfという関数があって、それの引数として
こんなものを取るんだよと書かれているのだ。
さてこのような静的なリンク構造、一つのバイナリーの実行可能形式ファイル
に、必要な全てのプログラムが入っているというのが、古きよき幸せな時代の
UNIXの姿だった。
次に動的リンクがでてくる。DLL(Dynamic Link Library?), so(shared object?)
などだ。
実行ファイルを作る際にlibc.aを静的にリンクさせるのではなく、プログラム
の実行時に動的にリンクさせる方法だ。
さてこのとき上記の問題はどのように解決されるのか?
まず関数の使い方はどうか? という部分はまったくかわってない。
stdio.hをincludeする。
そしてプログラムの実体は?
libc.o? というstubをリンクし、それが実行されるとき、
libc.so というshared object本体を動的にリンクする。
(Windowsの場合は、hoge.libがstubで、hoge.dllがその本体だ。)
そのためDLLの中にはいっている関数を使おうと思うときは、それに対応する
ヘッダーが必要なのである。
ここまで説明すればだいたいわかるだろう。
すごく簡単に説明すれば、DLLのような動的結合の機能と、それと同時にヘッ
ダーに相当する情報も入れこんでしまったものが、OLE, COMなどと呼ばれてい
るものなのだ。
(ここで用語の使い方が問題になるが、ややこしいので後回し。)
さてこのヘッダーに相当する部分、つまり実体となるバイナリープログラムの
使い方、呼び出し方を説明する部分は、どのような仕組みになっているのだろうか?
こっから先がなかなか複雑で一筋縄では行かない部分なのである。
なぜかと言うと、Microsoftはここで、単にC言語だけから呼べればいいように
ではなく、多言語で利用できるようにしたからだ。
なので複数の言語で同じように対応できるようにしたため、
その分、裏でとても面倒なことをしている。
しかし利用する側だけとってみれば、そんなには複雑にはなっていない。
さてOLE, ActiveXでプログラムの実体を提供するもの、これをOLEサーバーと呼ぶ。
上記の例でいえばdllファイルに相当する部分だ。
拡張子では、.dll, .exeなど。
(これが.ocxなのがActiveXサーバーだ。
機能的にどう違うのか、よく知らないがちょっとだけ違うらしい。)
(ここから先UNIXには対応するものがないので、Win32環境だけと考えてほしい。)
ここでこのOLEサーバーに対応するファイルをどう探すか。
たとえば"InternetExplorer.Application"という文字列からレジストリを見にいって、
そこからhogehoge.dllというファイル名をかえしてくる。
(GUID、ClsIDからでもOK。GUIDってなに?って質問は保留。)
そのファイル名のファイルがHDD上のどこにあるかは、
それはDLLと同じで、PATHに入っているところを調べる。
そのファイルをDLLと同じようにリンクする。
で使い方の部分はというと、こいつには一つのインターフェイスがあることが
あらかじめ保証されている。(インターフェイスって何? てのは保留。)
IUnknownというインターフェイスだ。
そしてその中に三つの関数が用意されている。
AddRef 参照を一つ増やす。このオブジェクトを使ってるよと知らせるわけだ。
Release 参照を一つ減らす。このオブジェクトを使わなくなったということ。
QueryInterface あるインターフェイスがあるかを聞く。
ここで、QueryInterfaceでIDispatchというインターフェイスがあるかどうかを聞き、
またそのIDispatchに含まれるInvokeという関数から、
さまざまなインターフェイスを呼びさせるようになる。
ってことだと思うのだが、詳細はまだわかっていない。
ここまで強引に進めてきたが、結構説明するの大変だなぁ。
DCOMというのはここで、オブジェクトのStubが同じマシンにあって、
実体が別のマシンにあるようなものをいう。
その別のマシンとの間をつなぐものをHTTPベースでやろうとして、
SOAPを提唱しているということでしょうね。
これを覚えて何になるの? という疑問は当然のものだろう。
現在のWin32でいえば、COMを使わないと、Microsoftが提供する
様々な機能に全然アクセスできないからだ。
Win32でシステムと協調して動くプログラムを書こうと思ったら必須だってことだ。
そうじゃなかったら、そんなに無理して覚える必要もないかな。
ただそんなに難しい技術でも、特殊な技術でもなく、将来的に世界はこのような
ものになるというのは明かでもあるので、おおまかな括りくらいは
わかっていていいというようなもんだと思った。
●参考書籍
Al Williams「Windows2000システムプログラミング」インプレス、2000.
p.24からはじまるActiveX概論はとてもわかりやすく正確に書かれている。
http://www.al-williams.com/
http://www.ntinternals.com/
http://www.zdnet.com/pccomp/features/fea0797/nt/welcome.html