Essential COM を読み考えた事
COM を使った事も、使う予定も無いのだが、天才プログラマ A 氏のすすめで読んでみた。
COM が目指したコンポーネントは
- 言語独立
- native コード
なのだがそれを実現するために、どのような仕組みが必要であったかがよく分かる本。
特にI/F と実装を分離する際の C++ が持つ問題点は意識した事がなかったので大変勉強になった。BeOS API のクラスがダミーメンバを持っていた理由もやっと理解できた。
Essential COM を読み A 氏との議論を通して考えた事を残しておく。
COM は当初の目的を達成しているが、複雑すぎるというのが正直な感想。結局のところ「言語独立」と「native コード」の両方を実現しようとしたから複雑になったのだと思う。MS が .NET に舵を切ってからは少しずつ使われなくなっていくのだと思うのだが COM の次の世界はどんなものだろうか。
自分の理解では COM 以降に 2 つの流れがあると思う。
1つ目はコンポーネントの使い回しをそこまで追求しない。適材適所の方向性。例えば UI は JavaScript、サーバーサイドは Java/Ruby/Perl 。実現したいことが短い時間で効率よく達成されれば OK 。非常に現実的。
2つ目は JVM や .NET など VM に寄りかかる方向性。native コードを諦める。そのかわり言語独立は維持する。C#, VB.NET, JRuby, Scala, Clojure など。多くのドメインでは native コードは必要なくなってきているので、この流れも理解できる。ただ自分は MS や JVM と心中する覚悟をまだ持てない。
そして残った選択肢は「言語独立」は諦め、「native コード」を維持する方向のコンポーネントを実現する方向性。不勉強のせいかもしれないが、この方向はあまり聞かない。COM と C++ で問題になったのは、言語仕様でバイナリレイアウトが決まっていない事や、ヘッダにバイナリレイアウトが漏れてしまっていることだ。これらの問題点を解決し、ネイティブコードを吐くクールな言語が出てきてないような気がする。ネイティブコードが必要なところは無くなるわけではないので、ありだと思うのだがどうだろうか。
というわけで Mona とか Mosh の方向性に一石を投じた Essential COM をすすめてくれた A 氏に感謝。