Powered by SmartDoc

ELM-VEの特徴

2002年2月13日
Kenji Saito
http://elm-ve.sourceforge.net
ELMの作成は2000年4月にはじまりました。このプログラムパッケージは物理実験用に開発された個人的なプログラムに、ネットワーク透過性の機能の追加し、内部アーキテクチャとユーザインタフェースの完全な分離を実現することで、仮想現実の基本的な機能と、開発環境を提供できるように作成されています。

目次

What's ELM-VE

ELM-VEの提供する機能

ELM-VEは仮想現実を利用するアプリケーションを作成するための パッケージです。また、マルチエージェント……… この世界で起るさまざまな現象や、空想の世界での出来事、 目に見えない物理現象、実際には費用や危険性や実験の規模の 問題で実現不可能な実験などをシミュレートすることを意図して 作成されています。

仮想現実を実現するためのソフトウェアは、すでに数多く ありますが、ELMの際立った特長といえば拡張性にあるとおもいます。 例えば各オブジェクトに対して、においを表現するデータを 付け加えてElmのエージェントとClientを拡張すれば、においの ある仮想空間を実現できるでしょう(今年アメリカの企業で、 コンピュータに接続して匂い?(かおり)を発生する デバイスがリリースされる予定だそうです)。

近年研究されている多くの分野では、独立した多くの要素が 互いに影響を及ぼしあう対象物が注目されていると言えると思います。 ELMではこのような対象をシミュレーションするのに適しています。 このような対象物は並列処理を用いた、プログラミングが有効ですが、 この場合マルチスレッドプログラミングなどの高等なプログラミング 技術が必要になってきます。ELMでは、スレッドをまったく意識 することなしに、マルチスレッド的なプログラミングが可能です。

スレッドを用いたプログラミングにより、能動的で 自律的なオブジェクトを作成することができます。

とくにELMは学生が研究で実験を行うための環境として 整備されています。シミュレーションのデータを保存したり、 クライアントの画像を保存したり、という機能が 用意されています。

ELMの提供する仮想現実は、通常、クライアントを起動 したときに自動的に作成される、自分のマシン内のサーバ によって維持されています。しかし、クライアントとは 独立したサーバをインターネットに接続された マシンで起動することによって新しい仮想現実を 造ることもできます。これらのサーバ間に リンクをはることによって、分散された巨大な 仮想現実を実現できます。

ELMの応用例

仮想現実、物理シミュレーション

ELM-VEのコンセプト

Javaはオブジェクト指向を取り入れ、プラットフォームを越えた実行ファ イルレベルでの互換性を提供し、計算機ネットワークの資源をフルに活用でき るプログラミング言語として非常に優れている。Javaは アプリケーション開発者の多様な要求にこたえるための言語として発展しているよう に見える。Javaで作成したアプリケーションが現実的な速度で動作し、 安全なセキュリティ機構をもち、豊富なGUIや多くのメディアへの対応、 さまざまなデータ構造の取り扱いを簡便にするクラス郡、などを有し などを目指しており、実際に実現されている。

Javaは優れた言語であるが、アプリケーションの開発言語でクロウト向け という感じが否めない。Javaではさまざまな機能が提供されているが、これら の機能を使ったプログラムを行うためには、その機能を実現するための固有の 概念を理解する必要がある。また、多くの場合さまざまな設定を考慮しなけれ ば、正しく動作するオブジェクトを作成することすらできない。つまり、プロ グラムを組む前の段階で全てを理解している必要がある。簡単なGUIを持つ プログラムを組む場合でも理解していなければならないことは、膨大である。

ほとんどの場合、学生が研究をするときに重要なのは、プログラミング技 術ではなく、そのプログラムで何をするかである。

ELMには計算機アーキテクチャを一切持ち込まない。 例えば、長さの単位にピクセルは持ち込まず、 メートルを用いる。

クラス名と名前だけで、まず、オブジェクトを作成できる。 他のカスタマイズ設定を必要としない。 しかし、カスタマイズできる。

拡張性、は研究に必要で、重要。

特に、並列処理ー>スレッドー>難解&バグ取りが難しい

プログラムが見えるということ

受動的か、能動的か

新しい概念を覚える必要がない、触ってみればよい。 生活の中で得られる概念のメタファを用いる

子供と、年寄りそして、Disabledの復権。

VESMAの特徴

ここではVESMAの特徴を簡単にまとめておきたいと思います。 VESMAを使ったほうが良いのか、別のソフトウェアを使うほうが 良いかの判断に役立てて下さい。でも、つたない文章で いちいち説明されるより、実際に使ってみて判断したいと 思う人は次の節の「インストールとセットアップ」と 「VESMAを使ってみよう!」の節に進んだほうが良いかもしれません。

読んでみたいけど時間が無いという人は箇条書のところだけチェック してみて下さい。●のマークがある項目はVESMAを使用する人全般 に対して関係する特徴、○のマークがある項目はVESMAをプログラム して拡張して使ってみたいという人に特に関係がある特徴になってます。

仮想環境

まず、VESMAは仮想環境を提供するシステムですが、 仮想環境と言ってもさまざまな タイプがあり、それぞれにさまざまなシステムも作成されています。 VESMAで提供される仮想環境は基本的に3次元空間で、倍精度実数値 により座標を指定するので原子などのミクロな世界から 宇宙などのマクロな世界までそのままのスケールで表現できます。 また、空間の中に空間を作ることができます。つまり、階層構造を 持つ空間群を扱うことができます。階層的といってもそれぞれの空間 は独立した空間になっているので、サイエンスフィクションで言う ところの互いに離れた並行宇宙と言ったほうが別りやすいかもしれません。 しかし、この階層性を利用すれば、

[大学]--+--[校舎棟]----+--[101教室]
        |              |
        |              +--[102教室]
        |              :
        |
        +--[図書館]----+--[観覧室]
        |              |
        |              +--[書庫1]--+--[書庫1-1]
        |              |           |
        |              |           +--[書庫1-2]
        |              |
        |              +--[書庫2]--+--[書庫2-1]
        |              :           |
        |                          +--[書庫2-2]
        |
        +--[研究室棟]--+--[101研究室]
        |              |
        |              +--[102研究室]
        |              :
        |
        +[食堂]--------+--[一階食堂]
                       |
                       +--[二階食堂]
のような自然な構造が簡単に作成できます。 VESMAの仮想空間内に、他のサーバが提供する仮想空間への リンクを作成できます。ちょうどWebページでリンクを クリックすると世界中の他のWebページに簡単に移動できるのと同じ ような感じです。この仕組によって、世界規模の巨大なハイパー 空間が作成できます。一つのマシンではマシンパワーの限界で 実現不可能なような巨大な仮想空間でも複数のマシンを用いれば いくらでも巨大な仮想空間を作成できます。 また、近年の仮想空間技術では当然のことですが、VESMAでも インターネットで接続された複数のユーザが同じ空間に集まり コミュニケーションをとったり様々なオブジェクトを共有する ことができるようになっています。

サーバとクライアントの関係

VESMAのシステムにはサーバとクライアントがそれぞれありますが このサーバとクライアントの関係は、WebサーバとWebクライアント のような通常のサーバ-クライアントシステムの関係とは微妙に 異なります。VESMAのサーバは上の節でも説明したように、3次元空間 を提供するものであり、その中では様々なオブジェクトが生成できます。 VESMAのクライアントとは、VESMAサーバ内に生成される ちょっと特殊なオブジェクトという位置付けになっています。 よって、VESMAのクライアントが起動している時には必ずVESMAサーバも 起動していることになります。(特殊な場合としてサーバだけを立ち上げ ることも可能です。)そして最初にVESMAのクライアントに表示されるのは、 このクライアントが存在しているサーバの中ということになります。

これは、他のサーバクライアントシステムに慣れ親しんだユーザには 非常に奇妙なシステムに思えるでしょう。しかし、このようなシステムを 採用したことにより以下のような特徴的な機能を実現することが可能に なります。

まず一つ目は、必ず自分個人のプライベートなサーバを持つことができるという特徴があります。このプライベートなサーバはクライアントと同じマシン上にあるので、ほとんどタイムラグ無しでサーバの中がクライアントに表示されます。これを利用すればVESMAシステムを利用してアクションゲームを作成したり、簡単な物理シミュレーションなどを快適に実現できます。また、後でも述べますが、他のサーバから集めてきた情報やオブジェクトを自分のプライベートなサーバに持ってきてファイルに保存しておくことも可能になります。

通常のサーバクライアントの仕組では、クライアントがサーバに情報を要求し、サーバがそれに答えて情報を送り返します。サーバが自らの判断でクライアントに自分から情報を送り出すことは基本的にできません。VESMAでは情報の交換は「メッセージの伝達」という形で実現されますが、これはサーバ内の各オブジェクトがどのサーバのどのオブジェクトに対してでも自由にメッセージを送信できます。インターネットやイントラネットに詳しい人ならば、これは不可能なことのように思われるでしょうが、これは各イントラネット内に一つBridgeと呼ばれるサーバを立てることで実現できるようになっています。(ちなみにイントラネット内だけで使用する場合にはBridgeは必要ありません)ここで重要なのは通信が対称であるということです。こちらからあちら、あちらからこちら、のどの方向でも同じように情報を伝達できます。

上でも述べたようにオブジェクト間のあらゆる情報交換は「メッセージの伝達」という仕組みを用いており、プログラム上では情報の受け手・送り手の区別はなくなり統一された形になっています。また、その手順も可能なかぎり簡潔化されており、(1)URLのような形式で通信相手を指定して、(2)伝達するメッセージを作成し、(3)送り出すだけです。多くの単純な場合ではたった1行のプログラムになります。例えばこんな風です。

send(makeOrder(getElm("/room1/receiver"),"method1","data"));

上のプログラムは「room1」という空間の中にある「receiver」という名前のオブジェクトの「method1」という名前のメソッドに対して「"data"」という文字列データを送ります。データの部分は文字列だけでなく数字や、オブジェクトやなにかの配列でもOkです。上のプログラムは括弧が3重になっていて、ちょっとだけトリッキーなので同じプログラムをわかりやすく書くと、

ElmStub es = getElm("/room1/receiver");   // (1)送り先の取得
Order o = makeOrder(es,"method1","data"); // (2)メッセージを作る
send(o);                                  // (3)送る

となります。もし同じところと繰り返し通信をするのなら送り先"es"は再利用できるので(2)と(3)の処理だけ繰り返せばOKです。

アバタの働き

アバタとはユーザが仮想空間に入る際にユーザ自身の分身としてその外見を表現し、他のユーザに自分が仮想空間内に存在していることを示す働きを持ちます。仮想空間で行動するとは、このアバタを操縦するということに他なりません。VESMAのアバタはこのような働き以外にも他の重要な働きをします。

VESMAのアバタはモバイルエージェントで実装されています。つまりアバタを構成するプログラム自身が、サーバを渡り歩くことが可能です。セキュリティの設定によっては、自分で拡張し賢くしたアバタのプログラムをサーバに送り込むことが可能なので、様々な応用が可能です。また、VESMAのアバタはサーバ内にあるオブジェクトを自分のポケットの中に入れることが可能です。つまり、ゆっくり検討したいオブジェクトはポケットに入れプライベートなサーバに持ち帰り、インターネットとの接続を切った後でも見ることができます。また、自分のマシンのハードディスク内に保存することも可能です。

もう一つ重要な働きは、アバタはクライアントに表示させるための情報を自分で選択し、サーバ内から集めて送り返すということです。VESMAにはテキストベースのクライアントJavaSwingベースのクライアントJava3Dベースのクライアントがありますが、それぞれ表示されるものがまったく異なります。これはアバタがテキストベースのクライアントには文字情報を、SwingベースのクライアントにはJavaComponentの情報をJava3Dのクライアントには3Dの情報を収集して送り返すことにより可能になっています。もし、あなたが犬のペットを飼っていて、その犬にVESMAをつかわせたいと思ったら、アバタに「匂い」の情報を集めるように拡張してあげると良いでしょう。(クライアントで匂いを再生するには高価な機材が必要でしょうが…)

オブジェクトのアイコンとカスタマイザ

通常の仮想空間ではオブジェクトはたいていアイコン、または3次元グラフィックスのような形でクライアント内に表示されます。そして、他のオブジェクトに対してアクションする方法は「体当りする」「剣をふりおろす」「魔法をぶちあてる」などの限定された手法しか用意されません。我々がメインで開発しているVESMAのJavaSwingを用いたクライアントを用いれば、VESMAのオブジェクトはアイコンの代りにあらゆるSwingコンポーネントが使用できます。つまり、オブジェクトに複数のボタンを付けたり、テキストの入力欄を付けることなどが可能です。実際、データベースの入力画面などを上手く表示できるようにカスタマイズされたクライアントを作成すれば、データベース入力のためのGUIを簡単に作成できるようになるかもしれません。Swingのクライアントは拡張性に比重を置いて設計されています。

GUIでもう一つの重要な機能は、各オブジェクトに設定されているカスタマイザと呼ばれる機能です。仮想現実を現実に近付けるという観点から見れば、クライアントの中に実際にアバタが見る光景をそのまま表示するようにするのが最適かもしれません。しかし、現在のコンピュータでは一つのクライアントのウィンドウだけで美しい3Dの景色を表示したり、動画のデータを表示したり、大量の文字データを表示することは無理があります。動画や高解像度の画像、文字データなどはクライアントとは別ウィンドウに表示するほうが実際的です。そのような機能を提供するのがVESMAのカスタマイザという機能です。Swingのクライアントではオブジェクトをダブルクリックすることでウィンドウが表示されます。このカスタマイザはユーザが自由に変更することができます。実はもともとカスタマイザはその名が示すようにオブジェクトのパラメータなどをカスタマイズするための機能でしたが、上のような応用も可能です。

もちろん上のような機能はVESMAの処理速度を重くします。このような機能を使用したくない人は使わなければ、その分早くなると思います。VESMAにはスケーラビリティがあります。

メッセージ交換による通信

ソフトウェア技術の専門用語でエージェントという言葉があります。これには正確な定義はないのですが、「自律的」であるとか「環境に適応」する機能を持つこととか「移動」する機能があることなどがエージェントである条件と言われています。VESMAのオブジェクトは単なるオブジェクトというよりはエージェントにかなり近い存在です。数千から数万のオブジェクトが互いに独立に自律的に動作することが可能です。

プログラミングに詳しい人ならば、「データの整合性」と「デッドロック」と呼ばれる問題があることを御存知でしょう。これはマルチスレッドプログラミングと呼ばれるプログラム方式を採用すると起る問題です。VESMAでは「準マルチスレッドプログラミング」とでも呼ぶべき方法が採用されています。非常に大量のエージェントを動作させるにはどうしても必要になってきます。上述の2つの問題は、プログラム上発見しにくいバグを生み出してしまう難しい問題ですが、VESMAで採用するメッセージの交換方式による通信を使えば、殆どその問題は回避できます。(詳しくはVESMAの基盤技術であるELM-VEのマニュアルを参照して下さい。)

VESMAのメッセージ交換による通信は、上述の複雑な問題を回避するだけでなく、プログラムをする時に必ず覚えておかなければならない概念は単純で少ないです。そしてプログラムとして記述する時のタイプ量もかなり少ないと思います。

基本的にはメッセージの交換の手法だけあればあらゆる通信が可能であるが、例えば特定のメッセージに対して返事のメッセージが欲しい時や、多くのオブジェクトが同期をとって動作するように同期用の信号をメッセージとして送る時など、プログラムが繁雑になってしまう。このようなタイプの通信が簡単にプログラムできるように、Request機能が用意されている。これを使用するには(1)メッセージの送信先の特定、(2)メッセージの作成、(3)返事のメッセージを受けとった時の振舞いを指定する、(4)メッセージを送るというステップになります。(3)の手順だけが通常の通信と違うところです。

多段階のセキュリティ

VESMAのメッセージ伝送は3段階のセキュリティチェックを受けます。イントラネットに一台用意するBridgeサーバにおいてチェックされ、VESMAのサーバ自体もメッセージをチェックし、最後に、各オブジェクトのメソッドごとにチェックされます。このようにチェックの回数を多くしているのは、VESMAのサーバは単にリクエストに対してデータを返すだけのサーバではなく、外のプログラムをサーバ内に導き入れ、自由に動きまわらせるようなサーバだからです。

セキュリティを設定する個所が増えて一見大変になるだけに思えますが、次のような利点もあります。一つには個人レベルのセキュリティ設定が可能となることで、管理者のミスでBridgeサーバでのチェックが正しく行われなかった場合でも不測の事態を未然に防ぐことが可能かもしれません。また、個人でセキュリティの設定をすることは良いセキュリティの教育になると思われます。VESMAは一番最初に起動した時点では他のサーバとまったく通信できないような設定で起動します。他のサーバを接続を試みるには、自分の責任で自分に必要な通信を許可してゆく作業が必要になります。Swingベースのクライアントを使用していれば、セキュリティ設定のためのGUIが用意されているので、概念さえ覚えておけば自分で設定できるはずです。

VESMAのメッセージをチェックするために使用できるチェック項目は非常に豊富で、メッセージの送り手、受け手のそれぞれに対して、IPアドレス、サーバ名、オブジェクトの名前、オブジェクトのサーバ内での場所、オブジェクトのクラス名、オブジェクトのロール(役割)、メッセージの種類など細かく設定できます。

セキュリティを強くすると利便性が犠牲になり、利便性を優先するとセキュリティが弱くなるということは、セキュリティを考えるときに是非知っておくべきことです。しかしVESMAでは3段階のチェックとメッセージのチェック項目の豊富なセットのおかげで、セキュリティをあまり弱くせずに、利便性を保つことができると思います。設定は難しくなると思いますがこの際勉強して利便性を獲得できるようにチャレンジしてみると良いと思います。

実はVESMAプログラム全般に関しも言えるのですが、特にセキュリティの機能に関しては実地テストが十分ではありません。セキュリティホールを見付けた方はご報告お願いします。

拡張性

ここまでの特徴を読んでくると、VESMAの特徴の多くが「拡張性」に起因するものであるのがわかると思います。もちろん、VESMAは拡張しなくとも十分「教育的仮想環境」として機能するように努力して作っていますが、教育的仮想環境ではない用途に使用したい人や、教育的仮想環境として使うにしても、もっと違った観点から使用したい人や、使う人の立場によってどうしても気にいらない部分というのが出てくるはずです。VESMAは拡張性に非常に気を使って設計しましたので、VESMAをベースにして少し手を加えるだけで、VESMAの特徴を受け継ぎながら、さらに良いシステムを構築できると思います。

拡張法するには、少しJavaでプログラミングで苦労をしいられると思いますがきっとその苦労に見合うものができるのではないかと思います。VESMAはGNUで定めたGPLのライセンスに基づき公開してあるので、あなたがVESMAを用いて作ったプログラムはどんどん公開することができます。是非VESMAをつかってみて、改善点などあれば御連絡下さい。

欠点

最後に悪い特徴つまり「欠点」についても述べておかねばなりません。現時点での欠点の多くは、VESMAがほとんどだれにも使用されていないということに関連しています。このためにフリーソフトウェアである利点の多くが失われています。作者が公開にあまり積極的ではなかったのですが、これからは改心してゆきたいと思いますので、有志の方々、どうか御協力お願いします。

技術的な点での欠点の一つとして、処理スピードの遅さが上げられます。通常の仮想空間としての使用や、簡単なゲームやシミュレーションなどに使用する場合にはほどんど問題になることはないと思いますが、大量の計算パワーを必要とするような物理シミュレーションには不向きだと思います。ただし、ある種のシミュレーションの場合、VESMAオブジェクトの自律性を利用して短時間でシミュレーションプログラムを作成でき、しかもビジュアルにシミュレーション結果を確認できるので、本格的なシミュレーションプログラムを作成前にその実験の価値を判断するのには役立つと思います。

また、VESMAのプログラミングにおいてはクラスを拡張してメソッドを追加する作業を行なうことになりますが、これにはVESMA特有の約束事や制限事項があります。多かれ少なかれ、既存のプログラムを使用して何かを作成する場合には約束事は必要ですが、それを理解しなければプログラムは組めません。VESMAでの約束事にはそれほど難しいものは無いと思いますが、他のプログラミングでは無いような特徴的な制限事項があります。詳しくはVESMAの基盤技術であるELM-VEのマニュアルを参照して下さい。

ELM-VEの動作原理

Agent指向?

ELMのもととなったプログラムは、非常に多くの単純な動作をする 要素が互いに影響を及ぼしあう環境をシミュレーションするために 作成されています。ここで、ELM環境内の要素の身になって考えてみ てください。以下にあげられるような機能は必須であることが想像で きるはずです。しかしJavaのデフォルトのオブジェクトはそのような 機能がないのです。そして、この機能は、近年注目されるAgent指向 コンピューティングと非常に親和性があります。 以下ELM環境内のELMオブジェクトの機能を見ていきます。

能動的な動作

オブジェクト指向言語では、各オブジェクトにはメソッドが あり、メソッドの中にそのオブジェクトの動作が記述されます。 Javaのオブジェクトもメソッドをもちますが、普通にプログラム すると、各オブジェクトのメソッドが実行されるかどうかは、 ほとんどの場合、他のオブジェクトからそのメソッドが呼び 出されるかどうかにかかっています。もちろんオブジェクト 内のメソッドから自分自身のメソッドを呼び出すことも可能 ですが、そのような場合は、主となるメソッドの細かい動作を 記述してあるサブルーチン的なメソッドであることがほとんど です。

そこで、オブジェクトの身になって考えてみてください。 自分のどのメソッドを実行して、自分がどのように動作 するか自分で決めたい、つまりどのメソッドを実行するか 決める部分のプログラムも自分自身の中に持ち独自に 実行したいと、思いませんか?このようなことを可能に するには、スレッドのような仕組みがどうしても 必要です。ELMでは、これを実現する方法を提案しています。

他の要素からの要求

上で説明したように、自分のメソッドを自分で、 呼び出す機能があっても、やはり、他のオブジェクトから の要求を受けることができなければ意味がありません。 ここでは、他のオブジェクトからの要求を受ける場合を 考えます。

たくさんの同じタイプのオブジェクトをつくり それらの間での相互作用をシミュレーションする場合を 考えてみてください。オブジェクト指向言語では オブジェクトは全てクラスから生成されます。もし、 これらのオブジェクトが一つのクラスから生成された ものだとすると、Javaのオブジェクトではこまった ことが起こります。Javaのメソッドにはprivate, protected,publicなどの種類がありますが、 同じクラスから生成されたオブジェクトどうし ならば、他のオブジェクトのprivateやprotectedの メソッドをも呼び出せてしまうのです。

それに、Javaのオブジェクトは他のオブジェクトから メソッドを呼び出されたときに、どのオブジェクトから 呼び出されたのかを知る一貫した方法がありません。つまり、 なんの工夫もない通常のプログラムでは、誰から呼び出された としても、同じように答えるしか方法がなく、呼び出された相手に よって要求を拒否したり、返答の内容を変更することが できません。もしくはそのような仕組みを自分で作成する 必要があるでしょう。ELM上でのメッセージの伝達を用いれば この問題を克服できます。

自分の周りの状況を知る

何の工夫もされていないJavaのオブジェクトは、 自分の置かれた状況を把握することができません。 そもそも、自分の周りの状況というものが存在 しないのです。つまり、デフォルトのJavaオブジェクトは 目も見えないし耳も聞こえないのです。

一方ELMのオブジェクトは必ずElmSetオブジェクトの 中にいます(一番トップのElmSetオブジェクトは例外)。 この自分のいるElmSetのことを"親"と呼び、 ELMオブジェクトのいる場所のデータを持っています。 ELMオブジェクトは自分の親に対して、周りに誰が いるのかをたずねることができるし、自分のいるばしょ についてのさまざまな状況を調べることができます。 どのようなことが調べられるかはElmSetの機能に よります。基本的な機能はElmSetにすでにあるはずですが、 ElmSetはユーザが自由に拡張することも可能です。

木構造

前章で述べたようにELMのオブジェクトはElmSetクラスから 生成されるElmSetオブジェクトの 中に存在しています。そして実は、ElmSetクラスはElmクラスの サブクラスです。するどい人はこの事実からすぐ予想できる と思いますが、ELMでは仮想空間を階層的に構築し、 計算機のファイルシステムのように木構造を作ることができます。 これには2つの利点があります。1つは、文字どうり階層的な 仮想空間を作成できるということです。仮想的なバーチャル シティを構築する場合を考えてみて下さい。そのバーチャル シティには学校、病院、役所などのいろいろな建物を建てる ことができます。学校を建てるならばその学校の中に図書館、 体育館、音楽室、教室などの部屋を作ることができます。 もう一つの利点は、なにか複雑なオブジェクトを作成する場合に 既存の単純なオブジェクトを組合せて、それを ElmSetオブジェクトでまとめることによって、簡単に作成 できるということです。将来的には十分な量の 基本ELMオブジェクトを提供することによって、 Javaのプログラミングの知識が無い人でもELM上で複雑な オブジェクトを作成できるようにしていきたいと 考えています。

スレッドにつて

上で述べたように、オブジェクトに能動的な動作をさせるためには、 スレッドのような機能が必要になってきます。しかし、JavaのThread はコストがかかります。つまり、Threadを一つ生成するたびにそれを 維持するために、スタック領域が必要だし、Javaのデフォルトの 動作では、計算機資源からネイティブなスレッドを一つ消費します。 数百、数千のスレッドを生成するのは、非現実的であり下手な プログラミングです。

このような状況を簡単に克服するには、一つのスレッドを 用いて、複数(数百、数千)のオブジェクトのメソッドを順番 に呼び出すようなプログラミングが考えられます。しかし、 この方法はさまざまな状況に対応するために、多くの拡張を 必要とするでしょう。例えば、時間が経過するにつれてオブジェクト の個数が増減する場合や、全てのオブジェクトが常に動作するの ではなく、実際に動作するオブジェクトと休眠状態のオブジェクト が混在しており、個々のオブジェクトが独自に休眠状態から 覚めたり入ったりするような場合です。 もし研究者に十分な時間がなければ、自分の本当に やりたかったことをあきらめて制限されたプログラムを組む ことになりかねません。また、そのようなプログラムを書く プログラマは、それぞれのオブジェクトを自律的に動作 させるための仕組みも独自に考案する必要があるかもしれません。

以上さまざまな問題点を上げて、ELMではそれが克服できると述べてきました が、その克服方法は次節で説明する待ち行列(キュー)を用いたメッセージの処理 によって実現されています。ELMのこの方法は、Swingパッケージのイベント処理 や、Java3Dのオブジェクトの挙動制御やイベントを処理の手法と少し似ています。 これらの手法とELMの違いはELMの待ち行列はオブジェクトごとに用意されている 点です。Java3Dはコンピュータゲームなども作れるように設計されていますが、 コンピュータゲームをやったことのある人ならば、そのゲームの中では様々なキャ ラクタが突然表われて、それぞれに複雑な動きをし、消えゆくと言ったようなこ とが当然のように行なわれていることを知っているでしょう。これはELMの目指 していることと同じです。これらが似たような方法を採用しているのは偶然では ありません。しかし、Java3DやSwingのそれは目的の制限されたものであるし、 ELMの方法のほうがより簡単で拡張性があり理解もしやすいと思います。そして トランザクション機構を実現するための便利な機能も提供しています。ELMを使 いこなすために次節は、しっかり理解して下さい。

待ち行列(キュー)

ELMシステムは多くのクラスから構成されるJavaのパッケージですが、 最も重要な クラスはElmクラスで、仮想空間内のオブジェクト、ユーザ、 部屋などの全ての クラスのスーパクラスです。Elmクラスは待ち行列 (キュー)を持っており、この中にメッセージを格納することができます。 下の図はElmServer内で活動している複数のElmオブジェクトを 模式的に表しています。

上の図を見て下さい。この図にはELMの仕組みの重要な概念の多くが 示されています。この図の全ての要素について適切な説明ができるよう になれば、ELMの仕組みの基礎を理解できていると言えるでしょう。 一番外側の四角はElmServerを表わしています。 その中に"root(ElmSet)"とラベルのある四角があります。これはrootという 名前のElmSetオブジェクトを表わしています。?節でも説明 したように、このElmSetオブジェクトは中に複数のElmオブジェクトやElmSet オブジェクトを含むことができます。ElmやElmSetを拡張した、エージェント や独自のオブジェクトを含むこともできます。始めてElmServerを単独で 起動した時にはElmServerの中にはrootと名の着いたElmSetオブジェクトが 一つだけ存在する状態で起動します。

この図はデフォルトで用意されるrootのElmSetの中に、 "Object1"、"Object2"、"Object3"を作成した状態を表わしています。 Object1とObject2は通常のElmオブジェクトですが、 Object3はElmSetオブジェクトですので、その中にまた他のElmオブジェクト を作成できます。この図ではObject3の中には"ObjectA"と"ObjectB"があります。 これはELMが仮想環境を階層的に作成できることを図で表現しています。

図の中には灰色の小さな四角がいくつも示されています。これらはメッセー ジです。メッセージはElmオブジェクトやElmSetオブジェクトの中で生成され、 オブジェクト間で交換され、オブジェクトの中で処理され消滅します。各オブジェ クトはELMのグラフィカルなクライアントで見ることができますが、メッ セージはクライアントで見えるものではありません。

メッセージの一部は、横長の四角の中に描かれているものがあります。この 横長の四角が"待ち行列(キュー)"です。これはメッセージを受け取ったオブジェ クトが一時的にメッセージを保存しておく場所です。待ち行列の中にメッセージ が格納されるとElmは待ち行列の先頭から一つメッセージを取り出し、自動的に そのメッセージに対応するメソッドを呼出すようななっています。Elmシステム では、全ての動作がメッセージの送信とそれに対応するメソッドの実行のプロセ スで行われます。

メッセージには、4つの要素が含まれます。それらは、メッセージの送り主、 受け手、メソッド名、引数です。よってメッセージを受け取ったElmオブジェク トは、処理の内容をメッセージの送り主によって変えることができます。また、 引数はObject型なので、メッセージを使ってあらゆる種類のデータを伝達す ることが可能です。

以下に実際にメッセージを送信するためのソースコードの例を挙げます。 メッセージの実体はOrderというクラスを用いて実装されます。

import ac.hiu.j314.elm.*;

// method1というメッセージを処理できるElmクラス
public class TestElm extends Elm {
    // 自分自身を呼出すメソッド(無限ループになる)
    public void method1(Order o) {
        System.out.println(o.getStringArgAt(0));
        System.out.println(o.getDoubleArgAt(1));
        System.out.println(o.getIntArgAt(2));
        Object args[] = {"arg1",W.p(2.0),W.p(3)};
        sendMessage(makeOrder(this,"method1",args));
    }
}

詳しい説明はサンプルを参照して下さい。

トランザクション

基本的にはメッセージの伝達の仕組みを用いればELMの全ての機能を実現可能 ですが、不便な点があります。一つは他のオブジェクトにメッセージを送り処理 を依頼するだけではなく、処理結果を返事として受け取りたい場合です。もう一 つは多くのオブジェクトが同期を取って動作しなければならない場合です。ELM では、この二つの場合を次のような同じ一つのテクニックで処理します。

まず、今までメッセージと呼んできたものをOrderとRequestの二つに分類し ます。この二つのクラスはどちらもMessageクラスのサブクラスで、機能はまっ たく同じです。しかしELMシステムはRequestにはそれに対応する返事が必ず存在 すると仮定します。一方Orderは返事を返す必要のないメッセージであるとして 処理します。

実際にRequestを送り返事を受け取るためのソースコードの例を下に示します。

private Elm elmObjectB;
public void method1(Order o) {
    Request r = makeRequest(elmObjectB,"cubicContent",W.p(2.0));
    prepareForReply(r,"method2",null);
    sendMessage(r);
}
public void method2(ReplySet sr) {
    System.out.println(sr.getReplyAt(0).getDoubleArgAt(0));
}

以下のソースファイルは上のソースファイルから呼出されるメソッドです。

// 立方体の体積を求めるメソッド
public void cubicContent(Request r) {
    double d = r.getDoubleArgAt(0);
    sendMessage(makeReply(r,W.p(d*d*d)));
}

先程、メッセージをOrderとRequestの二種類に分類しました。さらに それぞれにプライベートな目的に使用するメッセージを表わすクラスを 用意してあります。Orderに対してはMyOrder、Requestに対しては MyRequestです。

さらに詳しい説明は[*unresolved*]を見て下さい。

Server,Client,Mobile Agent

ELMはローカルマシンだけで動作させることができますが、ELMサーバをリモー トマシンに立ち上げれば計算機ネットワークを越えて複数のユーザが共有する仮 想空間を構築することが可能です。そして、ELMのサーバ内のデータをクライア ントに伝達するためにモバイルエージェントを用いています。

VESMAのサーバは、三次元の仮想環境を生成・維持し、クライアントから計算 機ネットワークを通して送られてくるモバイルエージェントを受け入れサーバ内 の仮想環境に導き入れます。クライアントは仮想環境内のモバイルエージェントを 操作するリモートコントロールシステムの役割とモバイルエージェントが仮想環 境内で見ている風景をユーザにも見せる働きを持ちます。

モバイルエージェントを用いたことにより、ユーザインタフェースの機能の 拡張が非常に容易になります。ELMにはデフォルトのクライアントとして、テキ ストベースのクライアント、Swingベースのクライアント、Java3Dベースのクラ イアントの3種類のクライアントが用意されていますが、これもモバイルエージェ ントがサーバからクライアントに送り返すデータの種類をコントロールすること によって実現されています。

ElmCustomizer

ELM仮想空間内のオブジェクトは独自のカスタマイザを設定できます。ELMの Swingベースの2次元クライアントも、Java3Dベースの3次元クライアントもその クライアントの画面だけでは多くの情報を表示するのに十分な広さを持っていま せん。また、常に全ての情報を表示しておくと逆に見にくくなります。Swingベー スのクライアントではオブジェクトをダブルクリックすることによりカスタマイ ザを開くことができます。カスタマイザと名前がついていますが、そのカスタマ イザに表示するものは自由です。これはいくつかの必要なメソッドが実装された JComponentクラスのサブクラスで、その中に様々なSwingコンポーネントを使っ て複雑なユーザインタフェースを作成できます。特にカスタマイザを設定しなけ ればデフォルトのカスタマイザが使用されます。

実際のカスタマイザの作成法は[*unresolved*]を見て下さ い。

利点

以上のようなアーキテクチャを使用することにより3つの利点が得られる。こ れは並列プログラミングのテクニックとして常に問題となる事項である。一つ目 はプログラミングの設計上の見通しの改善、二つ目は複数のスレッドによるデー タ整合性の破壊の回避、三つ目はデッドロック問題の発生の軽減である。

欠点

ELMの欠点を述べる前に、基本的に並列処理のプログラムを組む という場合に避けることのできない問題点がある。まずは、自分の プログラムしようとしている問題は並列処理が向いているのか、 並列処理する必要があるのかを判断する必要がある。 例えば普通、CPUが1つの計算機では並列アルゴリズムにしても 処理スピードが早くなるわけではない。問題の構造が並列処理に 合わないものは並列処理でプログラミングするのは単に物事を 繁雑にするだけである。

0.データが分散されてしまうために、それらをまとめて 処理したい場合は分散されたデータを集めなければならない 場合がある。 1.並列処理では他のスレッドの処理状態を調べる必要性が あるかもしれず、それは繁雑な処理になる可能性がある。 2.ELMの仕組だけで、デッドロックを完全に避けることは できない。