前田です。

At Tue, 26 Dec 2000 20:24:47 +0900,
SHUDO Kazuyuki <shudoh / muraoka.info.waseda.ac.jp> wrote:
> とはいえ、僕のシステム (MetaVM) では実際は、
> immutable で、かつ、個々のインスタンスに identity がない (*) 類のクラス
> (例: String, Number のサブクラス, Boolean, Character)
> のインスタンスは、参照ではなくて、コピーをネットワーク越しに渡しています。
> 
> (*) 他にうまい言葉が思いつかないのですが…
>     Object#hashCode() は、デフォルトの実装だと
>     インスタンスが違えば極力違う値が得られるようになってます。
>     それに対して、これら identity がないクラスのインスタンスでは、
>     hashCode() の値は、文字列 (String)、整数値 (Integer) といった値から
>     決められてしまいます。インスタンスごとの identity がないんです。
>     これを表すうまい用語はないものでしょうか?

String#hashCode()がoverrideされてるのは、Stringのインスタンスに
identityがないからではなくて、たんにより性質のよいハッシュ値を得
るためだけではないでしょうか。
System#identityHashCode()にStringのインスタンスを与えれば、
Object#hashCode()と同様の値を得られますよね。
# 試してないですけど。

==による比較でもStringインスタンスの同一性のチェックが出来ますし、
同じ内容のStringリテラルは同一のオブジェクトになることが言語仕様
にあったような気がするので、hashCode()がoverrideされていることだ
けを持ってStringインスタンスにidentityがないと言うのは言いすぎの
ような気がします。

intなどのprimitive typeについて同一性がないというのは同意できるん
ですけど…何か勘違いしてるのかな。
# primitive typeについては同値だったら同一だ(同じ値のインスタンス
# は世界に一つしかない)という考え方もできるかもしれません。

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

Stringなどについてそういうことが言えることについては異論はないの
ですが。

> もし仮に、ローカル実行と同じセマンティクスで分散実行できる
> Ruby 処理系を作ろう、という場合は、極力コピーはせずに遠隔参照で扱う一方、
> 一部のクラスのインスタンス (immutable かつ identity なし) については
> ネットワーク経由でインスタンスをコピーするか…
> しかないんじゃないかと思います。

Rubyだと、

1.instance_eval { @foo = 1 }

というのがあるので、実はFixnumやnilも完全にimmutableとは言えない
のですよね。ううむ。

-- 
前田 修吾