思想と実装の実像
プログラムの世界にはオブジェクト指向というのがある。
SIMULAという言語に端を発して、SmalltalkとC++でブラッシュアップされ、今やほぼすべての言語の処理系に実装が搭載されているような状況だ。
当初、SIMULATでは『プロセス』と『アクション』という概念を用いていたようだ。
プログラミングでプロセスを定義し、プログラムの実行中にアクションが生成されるというような感じになる。
SIMULA67になって、さらに概念的に拡張してプロセスは『クラス』に、『アクション』は『オブジェクト』に名前を変える。
これら(プロセスとクラス、アクションとオブジェクト)は、並列処理(今で言うところのマルチスレッド)をシミュレーションするために用意されたものだった。
つまり、イメージ的には「オブジェクトが(並列で)個々に動き回りつつ、適時オブジェクト同士でメッセージを伝え合うことでプログラムというシステムが動く」という感じになる。
これは、シミュレーションを指向する言語(SIMULAはSimlation Languageの略である)としては至極真っ当な方針であるといえる。
すべてのオブジェクトが"同時に"動くのであるから、タートル2万匹の50メートル徒競走だってコーディングは楽なはずだ。
その後、この概念(オブジェクト指向)はアラン・ケイとストラウストラップに目をつけられた。
そして、アラン・ケイによってSmalltalk言語が、ストラウストラップによってC++言語がつくられる事となり、これらの言語は広く普及する。
これは各種プログラム言語がオブジェクト指向へ変化する呼び水となり、(言語設計的に本来不向きな言語であったとしても)多数の言語がオブジェクト指向へと方向を変えていった。
しかし、SIMULAから他の言語へと派生するうちになぜかすっぽりと忘れ去られてしまった部分がある。
オブジェクトの並列処理だ。
基本的に現状のほとんど全ての言語(の処理系)はオブジェクトを並列に処理しない。(ほとんど全ての、というのはもしかしたらあるかもしれない可能性に賭けて書いたのであって、デフォルトでオブジェクトを並列に処理する言語を知っているわけではない。たとえば、Javaでオブジェクトを並列に動かしたければスレッドとして定義する必要がある。)
オブジェクトが独立して動くというのはきわめて魅力的なことだ。
今までほとんど追及されてこなかった分、可能性も大いに期待できるだろう。
(プログラムを分散・並列処理するという方向では多くの研究がなされているが、オブジェクトが並列に動作するような研究はあまりメジャーではない)
この方向の究極は1つのオブジェクトに対して計算機を1つ割り当てるというレベルである。
P2P、SOAPなど、それっぽい技術が徐々に開拓されつつある今、(商売を抜きにして純粋に技術として探求して楽しいのは)たぶんこっちの方向だと思う。