咳さん、首藤です。

メイルでの説明は難しいです。
動かして見せて、口頭で説明できれば、どれだけ楽か…

> dRubyを書いたものの分散オブジェクトも素人なのです。

dRuby を作っておいて、素人だなんて、そんな。

> > そこで、遠隔参照に対して、完全にローカル参照と同じ操作を行える
> > Java 用分散オブジェクトシステム (MetaVM) を作りました。
>
> 完全にローカル参照と同じ操作ってどんな感じなんんですか?
> 遠隔の参照のクラスを問い合わせると、なんて返ってくるんですか ?

クラス Foo のインスタンスを遠隔参照しているならば、getClass() では
当然ながら、Foo を表す、クラス Class のインスタンスが得られます。

> 同値の基準や、比較などはどういう具合なんですか ??

==, != は、比較対象がローカル参照でも遠隔参照でも正しく働きますし、
Object#equals(Object obj) も Object#hashCode() も、
遠隔参照の場合は実体に対する遠隔呼び出しになるので、問題ないです。

なんとまあ、instanceof も遠隔参照に対してきちんと働きます。
どうやって実現しているかというと…
JIT コンパイラで、遠隔参照対応ネイティブコードを生成します。
それで、遠隔参照がさもローカルな参照であるかのように見えると。
バイトコード命令 checkcast, instanceof についても、
遠隔参照対応コードを生成するので、型についても安心です。

僕の web ページ (www.shudo.net) に論文やらスライドがあります。
データが古かったり、恥ずかしいミスをしてたりするんですが…


> dRubyでアプリ次第であらゆる遠隔呼び出しで引数、戻り値を「参照の値渡し」
> にするのは簡単なのですがデフォルトではそうしてません。
>
> ずっと参照と言うわけにもいかないですよね。オブジェクトを操作するだけなら
> 良いけど、操作の値は永遠にわからない。いつかは「値」が必要になると思うの
> ですが、どうなのでしょう。

> 首藤さんのVMの場合、Javaのプリミティブな値(整数とか??)はやっぱりコピーで
> 渡すんですか ??

はい、そうです。
Java の場合は、いつかは基本型のフィールドに行き着くので、
オブジェクトの受け渡しはすべて参照の受け渡しで行えます。

とはいえ、僕のシステム (MetaVM) では実際は、
immutable で、かつ、個々のインスタンスに identity がない (*) 類のクラス
(例: String, Number のサブクラス, Boolean, Character)
のインスタンスは、参照ではなくて、コピーをネットワーク越しに渡しています。

(*) 他にうまい言葉が思いつかないのですが…
    Object#hashCode() は、デフォルトの実装だと
    インスタンスが違えば極力違う値が得られるようになってます。
    それに対して、これら identity がないクラスのインスタンスでは、
    hashCode() の値は、文字列 (String)、整数値 (Integer) といった値から
    決められてしまいます。インスタンスごとの identity がないんです。
    これを表すうまい用語はないものでしょうか?

これ (コピー) は、性能面でその方が得だと予想しているからです。
また、上記条件を満たしているクラスのインスタンスなら、
コピーを渡してしまっても、ローカルな実行と分散実行とで
セマンティクスが変わることで問題が起きることはないと考えています。


> Rubyだと全部オブジェクトだから、まったく同じ挙動を期待すると
> ずーっと参照でないとまずいですよね。

一方、Ruby ではどうかというと、何でもオブジェクトなわけで、
遠隔にあるあらゆるオブジェクトを遠隔参照で扱っていては、
永遠に「値」は得られない、ということは僕にも想像がつきます。
もし仮に、ローカル実行と同じセマンティクスで分散実行できる
Ruby 処理系を作ろう、という場合は、極力コピーはせずに遠隔参照で扱う一方、
一部のクラスのインスタンス (immutable かつ identity なし) については
ネットワーク経由でインスタンスをコピーするか…
しかないんじゃないかと思います。


SHUDO Kazuyuki/首藤一幸   私をたばねないで あらせいとうの花のように
  shudoh / muraoka.info.waseda.ac.jp