«前の日記(2003-08-26) 最新 次の日記(2003-08-28)» 編集

Matzにっき


2003-08-27 [長年日記]

_ [OOP]続々アイデンティティ

いくつかツッコミをもらいました、どうも。

まず、ゆあいさんのツッコミから。

アイデンティティが重要なのは、アイデンティティがあるオブジェクトと無いオブジェクトでは、 コピー時の動作が大きく異なるからではないでしょうか?

まあ、そういうこともあるでしょうが、 私が重視している理由は「アイデンティティがないものはオブジェクトではないだろう」ということです。

「オブジェクト指向」というからには「オブジェクト」を意識しないといけないわけで、 そのために最低限必要なものはなにかと考えた時に行き着いた概念が「アイデンティティ」です。

アイデンティティという観点からプログラミング言語(というか計算モデル)を分類すると

  1. すべてのデータにアイデンティティがある
  2. あるデータにはアイデンティティがあり、あるものにはない
  3. すべてのデータにアイデンティティがない

と分類できますが、オブジェクト指向するにあたって、(1)は問題なし、(2)はアイデンティティがないものも「その値がアイデンティティである」と考えて(1)に準じる、とすることができて、(3)ではちょっと無理だろう、というのが私の仮説です。

最上さんのツッコミでは、

  • 暗黙のポインタ:あり
  • 明示的なポインタ:なし
  • アイデンティティ:なし
  • 代入によるコピー:発生
  • 副作用:あり

というC++のサブセットを考えておられるとのことです。 私はこの言語におけるプログラムがどのようなものになるのか想像できないのですが、 実際のところどうなんでしょうね。この言語には本当にアイデンティティがないのでしょうか。

実際には、暗黙のポインタによってアイデンティティが導入されてそうな気がします。

さて、最後にともさんのツッコミです。

アイデンティティが無くて、メンバーはあるけど単一代入で、メッセージ送信はマルチキャストがデフォルトな言語ってどうでしょうか?割と実用的に書けるんじゃないかという気がするんですが。アイデンティティが必要ならそのためのメンバーを書けば利用者がアイデンティティのようなものを使うことはできるし (現実世界ではアイデンティティはそんなに自明じゃなくて、代用品でまにあわせている気がするし)。

これは難しい。

なにが難しいって、おそらく非常に高度な概念を短い言葉で記述してあるので、全体像が想像しにくいことです。

  • アイデンティティがない

    参照がないという意味なのでしょうか。 そもそもアイデンティティがない言語というのが(古い)FORTRANのような 低レベルのものか、純粋な関数型言語くらいしか思いつかないのですが。

  • メンバーはあるけど単一代入

    「単一代入」は分かりますが、メンバーの単一代入というのはどういう意味でしょうか。 初期化時にメンバの値を指定してその後は変えることができないということかな。 Pythonのタプルとかのようなimmutableなオブジェクトを想像しちゃいます。

  • メッセージ送信はマルチキャスト

    これが一番分かりませんでした。複数のレシーバに同時にメッセージを送るという意味だと思うのですが、 「複数のレシーバ」という概念にすでにアイデンティティが含まれていると思うのですが。

ということで、もしよければこのアイディアについていろいろ聞かせてください。

ちなみにこういう場合、「アイデンティティがある」ことになるんでしょうか?個人的にはオブジェクト指向するのに必須かどうかで議論した方が良い気がするんですけど。

すでに述べたように「オブジェクト指向という考え方の最低限」がアイデンティティだと思っています。 アイデンティティのない言語でもオブジェクト指向はできると思っていますが、 そのためにはユーザレベルでなんらかのアイデンティティを導入する必要があると思います。

一つの例としてTclがあります。Tclにはデータ型として文字列しかありません。 数値やリストなどは文字列として表現します。少なくとも表面的には。

で、Tcl上のツールキット(Tk)には「ウィンドウ」とか「ボタン」とかいったような「オブジェクト」が 登場するのですが、どのオブジェクトが明示するために「パス」というものを使います。 たとえば「.frame.panel.button1」のような感じですね。これはTcl的には文字列に過ぎないのですが、 Tkにとってはあるオブジェクトを指し示す参照でありアイデンティティです。

本日のツッコミ(全5件) [ツッコミを入れる]
_ kjana (2003-08-28 17:56)

全てのオブジェクトが immutable singleton っていうのと等価になりそうな,<br>ならなさそうな.... 値が identity ってことだとやっぱり identity はある.<br>実装がどうであれ計算モデル上は関係ないし.<br><br>identity が無い時点でマルチキャストにはあんまり意味がありませんね.同<br>じ値のオブジェクトは同じ答えを返すはずだから,複数にメッセージを送る意<br>味が無い.実装の上では並列・分散計算なんかで大きく意味があります.<br><br>オブジェクトを主体に考えると,identity が無いと返事を受け取れないとい<br>う事になりそうな気分.現実のプログラミング言語の多くがそう実装されてい<br>る「オブジェクトを thread of control が訪問する」というモデルだとどの<br>複製に「帰って」も計算を継続できるようにできそうですが.

_ ゆあい (2003-08-29 01:48)

C#のstruct(値)とclass(オブジェクト)という構造は面白いですね。なんとなく今話題のアイデンティティと関係が有るかもしれませんね。

_ kjana (2003-08-29 10:12)

返事などというものは存在しない,っていうモデルもありえるかと思い直した.<br>通信が全部ブロードキャストな actor みたいなもの.オブジェクトを変数に束<br>縛しておく必要すらなくなるけど,そのかわりどれがゴミだかわからない :-)<br><br>identity が必要なら受理するメッセージを変える.逆に,同じメッセージ群を<br>受理して同じ計算をする複数のオブジェクトを区別する事は不可能.区別でき<br>ないんだったら計算モデル上は一つしか無いと思っても問題ない.ということ<br>で,結局値が identity ということに落ち着く.... のかな?

_ 22 (2003-08-29 17:36)

オブジェクトが存在すること自体が「アイデンティティ」が存在することと同じ意味だと思うのですが。<br>誰に向けて「メッセージ」を送ればいいんでしょうか?

_ とも (2003-08-29 20:11)

・アイデンティティがない<br>あるオブジェクトと別のオブジェクトが区別できないかも知れないということです。多分、まつもとさんの定義と同じです。また、実装上ではなくて概念上のことのつもりです。<br>アイデンティティが無い場合、言及の対象はクラスになると思います。(たぶん、私の気持としては、実はアイデンティティはあるのかも知れないけど、プログラムを書く人には見えないかも知れないようなものを思い描いてる気がします。あるいはクラスとインスタンスの区別が曖昧で、見方によってクラス的インスタンス的に振舞うようなものかな?)<br><br>・メンバーはあるけど単一代入<br>意味不明でごめんなさい。まつもとさんの推測通りです。<br><br>・メッセージ送信はマルチキャスト<br>普通、メッセージはインスタンスに向けて送る訳ですが、アイデンティティがなければ、クラスの全員に送るか、クラスの誰でも良い誰かに送るしかないです。ここでは前者を指します。でも、後者でも良いかも知れないし、限量子を付けて使い分けれても良いかも。<br><br>オブジェクト指向は<br>・オブジェクトが存在する(並行性)<br>・オブジェクト間の相互作用で計算が進む(メッセージパッシング)<br>があれば良いと思います。素粒子のようなものは『存在』しますけど、区別は付きません。でも、粒子間の相互作用が存在します。個人的にはこういうものもオブジェクト指向的だと思います。<br><br>また、普通のオブジェクト指向言語ではメッセージの送信先は(アイデンティティのある)インスタンスですが、そのインスタンスを作る段階では通常クラスの中から適当に作られていると思います。つまり、まず、a cat のように cat の集合から適当なインスタンスを取り出して、それを the cat にして送信先にしている訳です。だとすると、インスタンスを作る部分がなくて、メッセージ送信先がクラスの誰かみたいになってても順番がちょっと違うだけなんじゃないかという気がします。<br><br>(オブジェクト指向並行論理型言語を想像して書いてたんだけど、ESP にはアイデンティティがあったようで、ちょっと残念!?)

お名前:
E-mail:
コメント:
[]

«前の日記(2003-08-26) 最新 次の日記(2003-08-28)» 編集

track feed Matzにっき Creative Commons License This work is licensed under a Creative Commons License.