C++のObject Slicingとオブジェクト指向言語の引数の評価戦略の話

TLで流れていた、オブジェクト指向での引数の云々の話をまとめました。 分量があるので、抜けているところがあったらお知らせください。
2
前へ 1 ・・ 6 7 9 次へ
AoiMoe a.k.aしお兄P @AoiMoe

「派生させてもデータサイズが変わらないならcopyableでも問題ないでしょ」といって出かけていったプログラマ、一時間後に変死体となって発見される

2015-02-07 23:45:14
Tetsuo Sakaguchi @tsaka1

ちなみに、ANSI Cで私が唯一(?)認めているのは関数の引数宣言のところ。ANSI以前のCはあの構文はなぁ(気持ちはわかるんだけど:-)。。もっとも、後方互換性のための void 宣言の使い方は「あー、柵は大変だよな」と思うわけですけど:-)

2015-02-07 23:46:43
Tetsuo Sakaguchi @tsaka1

とはいうものの、「そらで」Cのプログラムを書く時は未だにK&R 1st ed.の書き方をしてしまう私です:-)

2015-02-07 23:47:23
AoiMoe a.k.aしお兄P @AoiMoe

むしろ、コピー可能なクラスのpublic継承を禁止すべきなのかもしれないが、これも互換性から難しい

2015-02-07 23:47:58
Tetsuo Sakaguchi @tsaka1

ところで、前にもその手の話題を見かけた時に思ったんだが、「言語仕様としての引数渡しの定義」と「プログラミングテクニックとしての、何を渡したいかに応じて実引数記述を書き分ける」のを混同している事例があるらしいことは哀しいよなぁ。。とくにそこでコミュニケーションができてないと。。

2015-02-07 23:50:56
AoiMoe a.k.aしお兄P @AoiMoe

EMC++読んでるが、しょっぱなのautoとdecltype(auto)のあたりからやっぱりC++の闇の深さを再認識するのであった

2015-02-07 23:51:33
Tetsuo Sakaguchi @tsaka1

まぁでも、77やそれ以前のFORTRANでも「こういう記述をすればcall by valueになるで」というような話題もあったから、五十歩百歩か。(注: FORTRANはcall by referenceです:-)

2015-02-07 23:53:26
SODA Noriyuki @n_soda

@AoiMoe ここはLisp系の言語だと、参照を値渡ししている(C言語で言うところのポインタの値渡し)という感覚でいます。つまり「値渡しが不自然」という感覚ではないです。ではなにかというと「オブジェクトをコピーするのは不自然」という感じ。

2015-02-07 23:57:42
SODA Noriyuki @n_soda

@AoiMoe というわけで、正確に言うと「参照渡しが自然」ではなくて、「参照の値渡しが自然」(コピーするとオブジェクトのidentityが失われるから)という感じですね。これはオブジェクト指向的な感覚であって、関数型的感覚だとidentityなんてものはない方が良いです。

2015-02-08 00:00:52
SODA Noriyuki @n_soda

@AoiMoe RubyにしてもPythonにしても、基本型は値渡しであって、「全部参照渡し」じゃないです。(あと繰り返しになりますが、オブジェクトについても、参照の値渡しであって、参照渡しとは微妙に違うので区別することにしましょう)

2015-02-08 00:03:13
吉田 恵介 @kay68060

@n_soda @AoiMoe うーん、Lisp書く身からすると、どっちかというとコピーするのは変更するためだよねぇ?って感じ? replacaとか使う場合だよねぇ。

2015-02-08 00:04:35
SODA Noriyuki @n_soda

@kay68060 @AoiMoe 関数型的感覚としてはそうですね。副作用がないのであれば参照を渡しても何の問題もないわけで。「オブジェクトをコピーするのは不自然」は関数型的な感覚ではなく、オブジェクト指向的感覚の方です。

2015-02-08 00:06:53
吉田 恵介 @kay68060

@n_soda @AoiMoe ちなみにオブジェクト指向的って何をベースに考えてます? 私はCLOSベースなので、、、、、、 Smalltalkは使えなかったんですよねぇ。

2015-02-08 00:08:39
SODA Noriyuki @n_soda

@kay68060 @AoiMoe Smalltalk、Python、Rubyみたいな言語です。

2015-02-08 00:10:35
吉田 恵介 @kay68060

@n_soda @AoiMoe Rubyは使ったことがありますが、あれはJavaScriptっぽい感じでしたねぇ。(実装的に) Simulaとかは割りとC++っぽいんですかねぇ?

2015-02-08 00:13:55
SODA Noriyuki @n_soda

@kay68060 @AoiMoe そこまで言語に密着した話ではなくて、副作用上等みたいな、状態を持つオブジェクトがあって、その状態を変更していくみたいなスタイルを念頭に置いてます。コピーするかどうかによって、副作用の及ぶ範囲が変わるので。SimulaはC++の直接の祖先ですね。

2015-02-08 00:16:28
SODA Noriyuki @n_soda

@kay68060 @AoiMoe で、Smalltalk、Python、Ruby のような言語って、オブジェクトのコピーってそんなに頻繁に行なう操作じゃないんですね。このコピーに対する感覚がC++とだいぶ違う感じ。

2015-02-08 00:18:37
吉田 恵介 @kay68060

@n_soda @AoiMoe あー。 Lispって一応ベースが関数型だからなぁ。 そういう意味ではコピーって、オブジェクトのスナップショットとを取る感じなんでしょうか? Database的に言うとVIEWに対するMVIEW?

2015-02-08 00:21:10
吉田 恵介 @kay68060

@n_soda @AoiMoe C++って無駄にオブジェクトをコピーするッて感じが、、、、、 いや、スタック上にオブジェクトを確保するという前提だと、それが必要なのは分かるんですけどね。

2015-02-08 00:22:52
SODA Noriyuki @n_soda

@kay68060 @AoiMoe あのツイートでLisp系の言語…って書いたのは、「参照の値渡し」という感覚(すなわち、Javaのあれも「値渡ししている」という感覚)の部分です。「オブジェクトをコピーするのは不自然」はJavaというかオブジェクト指向言語の話ですね。

2015-02-08 00:23:50
SODA Noriyuki @n_soda

@kay68060 @AoiMoe コピーすると元のオブジェクトに対する副作用はコピーに対して及ばなくなる/コピーに対する副作用は元のオブジェクトに及ばなくなるって話ですね。副作用を排する関数型プログラミングとは対極の話ですね。

2015-02-08 00:26:40
SODA Noriyuki @n_soda

@kay68060 @AoiMoe C++は何でもできる言語で、コピーすることもしないことも手軽に選択できますから。(何でもできるから、スーパープログラマーにとっては超強力なんだけど、素人には危険な面もあるわけですが)

2015-02-08 00:28:44
吉田 恵介 @kay68060

@n_soda @AoiMoe あー、オブジェクトの粒度的に分界点が微妙に異なっているんですね。 Lispだとオブジェクトとデータ構造(Struct)が明確な分離が無いですからねぇ。 むしろClassのインスタンスはStructの派生になっている当たりはC++に近いのに。

2015-02-08 00:29:11
吉田 恵介 @kay68060

@n_soda @AoiMoe 最近はJavaでも関数型プログラミングとか言っているので、ある意味、Lispに回帰しているんでしょうかねぇ?

2015-02-08 00:34:57
AoiMoe a.k.aしお兄P @AoiMoe

まあ、C++のcopyableなクラスというのはオブジェクトではなくてデータ型なので

2015-02-08 00:40:04
前へ 1 ・・ 6 7 9 次へ