その後のJoe Armstrongのオブジェクト指向に対する見解

Erlangオブジェクト指向か?

Joe Armstrongは「オブジェクト指向はクソか?」という発言の後で「Erlangオブジェクト指向」であるという興味深い発言をしています。

この発言は2010年6月8日にJoe ArmstrongとRalph Johnsonの間のインタビューの中で発言していますが、その部分を掲載します。

オリジナルのインタビュー記事は次のURLにあります。 Ralph Johnson, Joe Armstrong on the State of OOP http://www.infoq.com/interviews/johnson-armstrong-oop

この中でJoeはErlangの言語の設計者で、RalphはGoFデザインパターンの共著者でGang of Fourと呼ばれています。

Erlangオブジェクト指向であることに気がついた

 Smalltalkはたくさんのやるべきことを行いました。そして、もし私に対する質問が「オブジェクト指向プログラミングに対してどのように考えるか」と問わるならば、私はこの質問に対して以前と少し考え方を変えました。私は1年前にブログのようなものに対してある記事を書きました。「なぜオブジェクト指向はクソなのか?」です。私がこの記事を書いた理由はある特定の種類の人々を刺激したかったからです。彼らは私の記事に対してとても興味深い反応をしました。そして私はうまく多くの人々を悩ませることができましたが、それは私の意図通りだったのです。それから私は「オブジェクト指向プログラミングとは何なのか」、「Erlangオブジェクト指向でない」ということに関して疑いを持ち始めました。

 そしてある時「お前は間違っている。Erlangは極めてオブジェクト指向なのだ!」という声が聞こえたのです。彼は「オブジェクト指向言語こそオブジェクト指向ではないのだ!」ともいいました。

それは自分すらこんなことを信じられるかどうか分かりませんが、Erlangこそただひとつのオブジェクト指向プログラミングということです。それはErlangオブジェクト指向プログラミングであるための3つの信条である「メッセージパッシング」、「オブジェクト同士の隔離(isolation)」「ポリモフィズム」を基礎としているからです。

オブジェクト指向はメッセージングが一番重要

アラン・ケイが書いた有名な話の中で彼は「オブジェクト指向プログラミングの概念は完全に間違って理解されているのだ。オブジェクト指向プログラミングの正しい概念とはオブジェクトとクラスに関してではなく、すべてがメッセージングということなのだ。」と言っています。 彼はオブジェクト指向プログラミングではクラスとメソッドに関することがあまりに強調されすぎて、メッセージについては強調されないことが問題だと言っています。そして、もしメッセージ関してその性質やメリットをもっと多く語ることができれば状況は今より状況がよくなるのだと主張しています。オリジナルのSmalltalkはオブジェクト自身に関して、また、これらのオブジェクトに対してメッセージを送って、これらオブジェクトが送り返されたメッセージによってどのように反応するかについて常にそのメリットを語っています。

 もし、このようなメッセージをやり取りするオブジェクト同士を「隔離(isolate)」できないのであれば、それは問題となります。Dan Ingallsは昨日次のように話しました(そして素晴らしい発言だと私は思います)。「もし、オブジェクトがメッセージを取得したならば、それはどこから来たかを気にする必要がない、本当に気にすることはないのだ。ランタイムシステムがメッセージの配信を取り扱うので、我々はどのように処理されるかを気にすることがないのだ。これはある種の送信側と受信側の相互に「隔離」されていることだ。このことが私がメッセージングを愛している理由なのだ。」

オブジェクト指向における3つの重要事項

 オブジェクト指向プログラミングがもつ3つの性質の中ではおそらく「メッセージング」が最も重要です。

その次に重要な性質はすでにお話した「隔離」です。「隔離」の意味は私のプログラムがあなたのプログラムを破壊してしまわないということです。それは私のプログラムがどこか誤っていてもあなたのプログラムを壊してしまわないことです。 確かにJavaはこの性質に該当しません。たとえば2つのJavaアプリケーションを取り出して、ひとつのJVMに放り込んでみましょう。そして一つのアプリケーションがマシン(JVM)を停止させてしまうと、もうひとつのアプリケーションも止まります。このようにあなたのアプリケーションは他のアプリケーションクラッシュさせることとができます。ということでJavaの世界では「隔離」はできていないことになります。

3つ目は「ポリモフィズム」です。「ポリモフィズム」はまさにメッセージングに関してプログラマーの利便性のために存在します。すべてのオブジェクトやプロセスもしくはあなたが呼び出したいあらゆるのものが"printMe"というメソッドを持っていて、あなたが"自分自身でプリントしなさい"といったときにそれらが自分たちでプリントするのであれば本当にすばらしいことなんです。もし、これらが"printMe"でなくばらばらの名前であればプログラマーは記憶することはできません。それゆえにポリモフィズムが存在して、すべてのオブジェクトは"printMe"メソッドをもっていればなんの問題もないのです。すべてのオブジェクトがわかりやすい名前のメソッドを持っていればすばらしいことなんです。

Erlangはこのような性質をすべて持っています。Erlangは「隔離」の性質を持っています。また「ポリモフィズム」と純粋な「メッセージング」の性質も持っています。このような観点から我々はErlangがただひとつのオブジェクト指向言語だと考えています。おそらく私はオブジェクト指向言語に関するの以前の発言は少し早まってしまっていたのだと思います。ということで、あなたがたはご自身でErlangを試してみることでです。