探検
動的言語で大規模開発
■ このスレッドは過去ログ倉庫に格納されています
1uy
2012/07/24(火) 09:10:42.04 たててみた
549デフォルトの名無しさん
2014/11/30(日) 17:02:44.20ID:UnYKruMf550デフォルトの名無しさん
2014/11/30(日) 17:04:54.56ID:qFjB73Ro コンピュータにやらせるなんてアホ
脳が腐る。
人間がシコシコ変換するることで
ボケが防止される
脳が腐る。
人間がシコシコ変換するることで
ボケが防止される
551デフォルトの名無しさん
2014/11/30(日) 17:10:09.29ID:7WEYW95R >>546
そうなんだよね。結局問題を先送りしてるだけ。
だいたいさ、コードの中でこの変数(httpとか)は
connectを呼び出しているって書いているから
この変数はconnectを持っている型だって決まってるわけだよね。
動的型付けであっても、型は決まってる。
だからそのことをコードに書いておけばいいわけよ。
それが変数の型宣言というもの。
型宣言しておけば、コードとその型に矛盾が起きるような修正が
発生した時、それをすぐにコンピュータが検出できる。
検出した問題を人間がみた時にも、すぐにその原因がわかりやすい。
どうせコードでは型は特定の型じゃないと動かないんだから
その型であるって明示しておけばもっと便利になる。
動的型付けでは不可能なレベルの完璧な補完っていうのも
その高度なコード解析能力の一端にすぎないんだよ。
そうなんだよね。結局問題を先送りしてるだけ。
だいたいさ、コードの中でこの変数(httpとか)は
connectを呼び出しているって書いているから
この変数はconnectを持っている型だって決まってるわけだよね。
動的型付けであっても、型は決まってる。
だからそのことをコードに書いておけばいいわけよ。
それが変数の型宣言というもの。
型宣言しておけば、コードとその型に矛盾が起きるような修正が
発生した時、それをすぐにコンピュータが検出できる。
検出した問題を人間がみた時にも、すぐにその原因がわかりやすい。
どうせコードでは型は特定の型じゃないと動かないんだから
その型であるって明示しておけばもっと便利になる。
動的型付けでは不可能なレベルの完璧な補完っていうのも
その高度なコード解析能力の一端にすぎないんだよ。
552デフォルトの名無しさん
2014/11/30(日) 17:23:36.91ID:360iudbJ >>548
くやしいのうwwwくやしいのうwww
>>551
否定はしないけれど、視点の違いとか「ものは言いよう」という側面もあるな。
「真のソフトウェア工学が開発されるまでの次善の策は、
あらゆる要素について極端に遅延結合な動的システムを使って開発する事だ。」
http://metatoys.org/oxymoron/oxymoron.html
くやしいのうwwwくやしいのうwww
>>551
否定はしないけれど、視点の違いとか「ものは言いよう」という側面もあるな。
「真のソフトウェア工学が開発されるまでの次善の策は、
あらゆる要素について極端に遅延結合な動的システムを使って開発する事だ。」
http://metatoys.org/oxymoron/oxymoron.html
553デフォルトの名無しさん
2014/11/30(日) 17:25:33.97ID:tVFfE2xZ まあ中規模くらいなら動的言語の気楽さ>静的言語の堅牢性だけど
大規模になって全体のコードを把握できなくなると気楽さ<堅牢性になるよね
大規模になって全体のコードを把握できなくなると気楽さ<堅牢性になるよね
554デフォルトの名無しさん
2014/11/30(日) 17:37:33.47ID:7WEYW95R555デフォルトの名無しさん
2014/11/30(日) 17:40:58.65ID:7WEYW95R >>552
その頃言われていた「遅延結合」っていうのは、
遅延ではない結合、つまり特定の型以外には結合しないという意味で
それを解決したのが、継承やインターフェースでしょう。
継承やインターフェースは、指定した型+その型を継承したもの
(もしくはインターフェースを持っているもの)に
動的に結合しているわけで、遅延結合になっている。
その頃言われていた「遅延結合」っていうのは、
遅延ではない結合、つまり特定の型以外には結合しないという意味で
それを解決したのが、継承やインターフェースでしょう。
継承やインターフェースは、指定した型+その型を継承したもの
(もしくはインターフェースを持っているもの)に
動的に結合しているわけで、遅延結合になっている。
556デフォルトの名無しさん
2014/11/30(日) 17:41:53.12ID:guVElZZq 静的言語だとテスト工数が減るとか、動的言語だとテスト工数が増えるとかあるの?
557デフォルトの名無しさん
2014/11/30(日) 17:47:36.29ID:7WEYW95R >>556
コンパイルエラーをミスと考えるかバグと考えるかで話が違う。
テストはバグを見つけるもの。
だから普通はコンパイルエラーによるミスは
テストで見つけるものではない。
だから本当の意味でのテストの量は同じだが、問題はミス。
静的型付け言語ならミスは、ミスとしてテストの前段階で弾くことができるが、
動的型付け言語だと、テストの段階で弾くことになる。
(しかも静的型付け言語ならミスは修正箇所をコンピュータが示すから素早く解決できるが、
動的型付け言語だとバグを探すのと同じ作業をしないといけなくなる)
そういう点で、動的型付け言語ではテストでやるべきことが
増えるのでテスト工数が増えることになる。
コンパイルエラーをミスと考えるかバグと考えるかで話が違う。
テストはバグを見つけるもの。
だから普通はコンパイルエラーによるミスは
テストで見つけるものではない。
だから本当の意味でのテストの量は同じだが、問題はミス。
静的型付け言語ならミスは、ミスとしてテストの前段階で弾くことができるが、
動的型付け言語だと、テストの段階で弾くことになる。
(しかも静的型付け言語ならミスは修正箇所をコンピュータが示すから素早く解決できるが、
動的型付け言語だとバグを探すのと同じ作業をしないといけなくなる)
そういう点で、動的型付け言語ではテストでやるべきことが
増えるのでテスト工数が増えることになる。
558デフォルトの名無しさん
2014/11/30(日) 18:12:40.43ID:c9Q+Jt/4 >>536
制約だな。
制約だな。
559デフォルトの名無しさん
2014/11/30(日) 18:24:06.55ID:7WEYW95R >>558
それを言うなら、契約って言ったほうがかっこいいな。
契約プログラミングといえば、EiffelとD言語ぐらいだけど、
型っていうのもある意味契約だからね。
この引数は、○型であるという事前条件
この関数は、○型を返すという事後条件
それを言うなら、契約って言ったほうがかっこいいな。
契約プログラミングといえば、EiffelとD言語ぐらいだけど、
型っていうのもある意味契約だからね。
この引数は、○型であるという事前条件
この関数は、○型を返すという事後条件
560デフォルトの名無しさん
2014/11/30(日) 18:24:17.69ID:uRzHHhxu なんだ
このスレの静的厨は静的型が制約だということも理解せずに喚いてたのか
初心者としても筋が悪いな
このスレの静的厨は静的型が制約だということも理解せずに喚いてたのか
初心者としても筋が悪いな
561デフォルトの名無しさん
2014/11/30(日) 18:25:23.77ID:tHR3Cg3X ここの人たちにとってC++のテンプレートを引数に取る関数ってどういうふうに捉えられてるの?
template<typename T> void f(T func)
みたいないわゆるダックタイピング
template<typename T> void f(T func)
みたいないわゆるダックタイピング
562デフォルトの名無しさん
2014/11/30(日) 18:26:57.46ID:mFsly3WX >>534
Static Typing vs. Dynamic Typing という対比はよく見かける
しかし structural subtyping vs. duck typing という対比は知らないね
もし「いくらでも目にする」のなら、ソース(学術的文献)を示せばいい
簡単な事だろ?
ましてや
> 「構造的部分型付けは公称的部分型付けとダックタイピングの間に位置する」あるいは
>「構造的部分型付けは公称的部分型付けとダックタイピングとのハイブリッドである」
なんて奇妙な主張は聞いたことが無い
blog記事を批判するつもりはないが、そんな個人メモを元にして
「動的型言語の補完がどうあるべきかの指標になる(>>533)」と主張するのは
馬鹿だってこと
Static Typing vs. Dynamic Typing という対比はよく見かける
しかし structural subtyping vs. duck typing という対比は知らないね
もし「いくらでも目にする」のなら、ソース(学術的文献)を示せばいい
簡単な事だろ?
ましてや
> 「構造的部分型付けは公称的部分型付けとダックタイピングの間に位置する」あるいは
>「構造的部分型付けは公称的部分型付けとダックタイピングとのハイブリッドである」
なんて奇妙な主張は聞いたことが無い
blog記事を批判するつもりはないが、そんな個人メモを元にして
「動的型言語の補完がどうあるべきかの指標になる(>>533)」と主張するのは
馬鹿だってこと
563デフォルトの名無しさん
2014/11/30(日) 18:31:27.03ID:7WEYW95R >>561
> ここの人たちにとってC++のテンプレートを引数に取る関数ってどういうふうに捉えられてるの?
┃ template<typename T>┃ void f(T func)
↑ ここからここまでが、型 ↑
HOGE_T void f(T func)
置き換えるならこんなふうに捉えてる。
> みたいないわゆるダックタイピング
それをダックタイピングとは言わない。
> ここの人たちにとってC++のテンプレートを引数に取る関数ってどういうふうに捉えられてるの?
┃ template<typename T>┃ void f(T func)
↑ ここからここまでが、型 ↑
HOGE_T void f(T func)
置き換えるならこんなふうに捉えてる。
> みたいないわゆるダックタイピング
それをダックタイピングとは言わない。
564デフォルトの名無しさん
2014/11/30(日) 18:36:30.75ID:uRzHHhxu そもそもduck typing自体まともな定義はない
565デフォルトの名無しさん
2014/11/30(日) 18:44:16.77ID:/BRxH/wW function foo(a) {
a.bar()
}
bar() を呼び出せるなら何でも foo の引数に入れられるのが
ダックタイピングというのはどうだろうか
このスレだけでも
a.bar()
}
bar() を呼び出せるなら何でも foo の引数に入れられるのが
ダックタイピングというのはどうだろうか
このスレだけでも
566デフォルトの名無しさん
2014/11/30(日) 19:22:49.09ID:7WEYW95R > bar() を呼び出せるなら何でも foo の引数に入れられるのが
それってさfoo関数の引数 aはbarメソッドを
持った型ではなければならないってことだよね?
コードに書くならば
function foo(/* fooメソッドを持った型 */ a) {
a.bar()
}
それってさfoo関数の引数 aはbarメソッドを
持った型ではなければならないってことだよね?
コードに書くならば
function foo(/* fooメソッドを持った型 */ a) {
a.bar()
}
567デフォルトの名無しさん
2014/11/30(日) 19:26:23.25ID:7WEYW95R 間違えたw
function foo(/* barメソッドを持った型 */ a) {
a.bar()
}
そして、大概は一つのメソッドだけ使うことはないから、
function foo(/* barとbazメソッドを持った型 */ a) {
a.bar()
a.baz()
}
あぁ!もう面倒くさい。
// Hogeインターフェース = barとbazメソッドを持っていること
function foo(Hoge a) {
a.bar()
a.baz()
}
わかりやすい。Hogeってみるだけで barとbazを持っていることがわかるし
もし持っていないものをaに入れるコードを書いたらコンパイルエラーが出る
function foo(/* barメソッドを持った型 */ a) {
a.bar()
}
そして、大概は一つのメソッドだけ使うことはないから、
function foo(/* barとbazメソッドを持った型 */ a) {
a.bar()
a.baz()
}
あぁ!もう面倒くさい。
// Hogeインターフェース = barとbazメソッドを持っていること
function foo(Hoge a) {
a.bar()
a.baz()
}
わかりやすい。Hogeってみるだけで barとbazを持っていることがわかるし
もし持っていないものをaに入れるコードを書いたらコンパイルエラーが出る
568デフォルトの名無しさん
2014/11/30(日) 19:32:01.35ID:/BRxH/wW569デフォルトの名無しさん
2014/11/30(日) 19:47:43.07ID:7WEYW95R http.connectを呼び出す関数に、
db.connectというメソッドを持ったオブジェクトを
入れても期待通りに動くことはまず無い。
二つの無関係なオブジェクトが同名のメソッドを持っていて
呼び出せるからといって、それはバグにしかならない。
メソッドに名前空間がないような形で使う動的型付け言語では
このような問題が起きる。
静的型付け言語ではインターフェースという型を定義することで、
同名であっても本質的に違うものは、違うものとして扱うことが出来る
db.connectというメソッドを持ったオブジェクトを
入れても期待通りに動くことはまず無い。
二つの無関係なオブジェクトが同名のメソッドを持っていて
呼び出せるからといって、それはバグにしかならない。
メソッドに名前空間がないような形で使う動的型付け言語では
このような問題が起きる。
静的型付け言語ではインターフェースという型を定義することで、
同名であっても本質的に違うものは、違うものとして扱うことが出来る
570デフォルトの名無しさん
2014/11/30(日) 19:53:09.38ID:VpMFGcKd どんな御託を並べても
インターフェースがduck typingは無いわw
インターフェースがduck typingは無いわw
571デフォルトの名無しさん
2014/11/30(日) 19:56:23.78ID:7WEYW95R インターフェースがduck typingなどとは
ひとことも言ってない。
duck typingは不要。ガアガアと鳴いたからたから
といって人間はアヒルでしか無い。
アヒルだ、空を飛べ。人間は飛べません。はいバグです。
実際には鳴くメソッドがあればアヒルである
ということになって更に意味がわからない。
もちろん、アヒルである条件をインターフェースとして定義しているならば
そのインターフェースを備えているものは、アヒルでいいですがね。
メソッド一つが有るか無いかきめんなよ。
ひとことも言ってない。
duck typingは不要。ガアガアと鳴いたからたから
といって人間はアヒルでしか無い。
アヒルだ、空を飛べ。人間は飛べません。はいバグです。
実際には鳴くメソッドがあればアヒルである
ということになって更に意味がわからない。
もちろん、アヒルである条件をインターフェースとして定義しているならば
そのインターフェースを備えているものは、アヒルでいいですがね。
メソッド一つが有るか無いかきめんなよ。
572デフォルトの名無しさん
2014/11/30(日) 19:57:27.20ID:7WEYW95R 訂正
duck typingは不要。ガアガアと鳴いたからたから
といって人間はアヒルにはならない
duck typingは不要。ガアガアと鳴いたからたから
といって人間はアヒルにはならない
573デフォルトの名無しさん
2014/11/30(日) 19:59:03.44ID:360iudbJ >>562
ググるとかしたことないのかね。
ググるとかしたことないのかね。
574デフォルトの名無しさん
2014/11/30(日) 20:01:50.38ID:7WEYW95R したことある人が、リンクを見つけてきて
ここに書けばいいと思いますが、
それを要求することは酷なことですね。
だってググっても見つからないのだから。
ここに書けばいいと思いますが、
それを要求することは酷なことですね。
だってググっても見つからないのだから。
575デフォルトの名無しさん
2014/11/30(日) 20:04:43.51ID:7WEYW95R ダックタイピングの説明として
「アヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである」
という言葉があるが、
それを、
アヒルのように歩くとアヒルのように鳴くという
アヒルインターフェースを実装しているものはアヒルである。
というふうに読み替えると
これは実は静的型付け言語の説明だなとわかるはずである。
「アヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである」
という言葉があるが、
それを、
アヒルのように歩くとアヒルのように鳴くという
アヒルインターフェースを実装しているものはアヒルである。
というふうに読み替えると
これは実は静的型付け言語の説明だなとわかるはずである。
576デフォルトの名無しさん
2014/11/30(日) 20:09:27.69ID:VpMFGcKd >>569
mysql.connect と postgresql.connect は置き換え可能だけど?
mysql.connect と postgresql.connect は置き換え可能だけど?
577デフォルトの名無しさん
2014/11/30(日) 20:11:34.14ID:VpMFGcKd578デフォルトの名無しさん
2014/11/30(日) 20:15:01.73ID:7WEYW95R >>576
両方が同じデータベースインターフェースを
サポートしているならばそうだろうね。
現実的な話をするならば、mysql.connect を
使うコードは、実際にはmysql.connect だけを
使うことはなく、複数のメソッドを使う。
だから、その複数のメソッドというものを
定義しないといけない。
そしてその定義したものがインターフェースであり
そのインターフェースを使いますよと宣言するのが
型宣言なのである。
そうすればある型がデータベースインターフェースを
定義していることを保証する型宣言だけあれば、
全てのメソッドを安心して使うことが出来る。
このオブジェクトはconnectメソッドは持ってるけど、
disconnectメソッドを持っていないかもしれない
なんてことはなくなるのである。
両方が同じデータベースインターフェースを
サポートしているならばそうだろうね。
現実的な話をするならば、mysql.connect を
使うコードは、実際にはmysql.connect だけを
使うことはなく、複数のメソッドを使う。
だから、その複数のメソッドというものを
定義しないといけない。
そしてその定義したものがインターフェースであり
そのインターフェースを使いますよと宣言するのが
型宣言なのである。
そうすればある型がデータベースインターフェースを
定義していることを保証する型宣言だけあれば、
全てのメソッドを安心して使うことが出来る。
このオブジェクトはconnectメソッドは持ってるけど、
disconnectメソッドを持っていないかもしれない
なんてことはなくなるのである。
579デフォルトの名無しさん
2014/11/30(日) 20:16:45.31ID:nRiDRl39 足し算と掛け算のある型なら複素数でも行列でも良いとかいうパターンは有るな
580デフォルトの名無しさん
2014/11/30(日) 20:21:32.59ID:7WEYW95R 足し算をaddメソッドだとして、
addメソッドさえあればなんでも使えるかというと
(addメソッドでググって一番目にでてきた)
> Addメソッドとはエクセルのシートに表とグラフを同時に表示するメソッドです。
に対してもうまく動くことはおそらくないだろう。
つまり名前が一緒でも、正しく動くとは限らんのさ。
だから名前と意味が一緒であることを保証するために
名前をつけたものが型なのである。
addメソッドさえあればなんでも使えるかというと
(addメソッドでググって一番目にでてきた)
> Addメソッドとはエクセルのシートに表とグラフを同時に表示するメソッドです。
に対してもうまく動くことはおそらくないだろう。
つまり名前が一緒でも、正しく動くとは限らんのさ。
だから名前と意味が一緒であることを保証するために
名前をつけたものが型なのである。
581デフォルトの名無しさん
2014/11/30(日) 20:24:10.20ID:T2KLr1TM >>575
アヒルのインスタンスを実行時にその振る舞いから分類するところがポイントなのであって
アヒルというクラスに対してコンパイル時に分類するのはダックタイピングじゃないよ
というわけでダックタイピングはインターフェースや構造的部分型とは全く別
アヒルのインスタンスを実行時にその振る舞いから分類するところがポイントなのであって
アヒルというクラスに対してコンパイル時に分類するのはダックタイピングじゃないよ
というわけでダックタイピングはインターフェースや構造的部分型とは全く別
582デフォルトの名無しさん
2014/11/30(日) 20:25:36.35ID:VpMFGcKd >>580
Excelのaddメソッドは戻り値の型が違うだろ
Excelのaddメソッドは戻り値の型が違うだろ
583デフォルトの名無しさん
2014/11/30(日) 20:25:53.73ID:T2KLr1TM >>580
だから同じ「意味」に対して名前を揃えるのが動的言語でのメソッド名のつけ方だ
だから同じ「意味」に対して名前を揃えるのが動的言語でのメソッド名のつけ方だ
584デフォルトの名無しさん
2014/11/30(日) 20:26:04.76ID:7WEYW95R アヒルのインスタンスを実行時にその振る舞いから分類というけれど、
コード自体は、実行時に分類してないんだよ。
コードは、アヒルであること、を前提として書いてる。
実行前にコードで分類しているのに、
なぜ実行時に分類しないといけないのか。
型は動的に変わるが、コードは静的なのである。
コード自体は、実行時に分類してないんだよ。
コードは、アヒルであること、を前提として書いてる。
実行前にコードで分類しているのに、
なぜ実行時に分類しないといけないのか。
型は動的に変わるが、コードは静的なのである。
585デフォルトの名無しさん
2014/11/30(日) 20:28:54.03ID:7WEYW95R >>583
> だから同じ「意味」に対して名前を揃えるのが動的言語でのメソッド名のつけ方だ
だから大規模では無理なんだよ。
大規模=大多数の人間が係る。場合によっては全く知らない人が作った
ライブラリを使うこともあるしな。
そんなんで、すべて意味を揃えるなんてことは不可能
いくつもの意味を持つ英単語なんてざらにある
単語の意味を揃えるのは不可能。というのが大前提
> だから同じ「意味」に対して名前を揃えるのが動的言語でのメソッド名のつけ方だ
だから大規模では無理なんだよ。
大規模=大多数の人間が係る。場合によっては全く知らない人が作った
ライブラリを使うこともあるしな。
そんなんで、すべて意味を揃えるなんてことは不可能
いくつもの意味を持つ英単語なんてざらにある
単語の意味を揃えるのは不可能。というのが大前提
586デフォルトの名無しさん
2014/11/30(日) 20:29:37.63ID:T2KLr1TM587デフォルトの名無しさん
2014/11/30(日) 20:30:01.03ID:/BRxH/wW588デフォルトの名無しさん
2014/11/30(日) 20:31:08.34ID:T2KLr1TM589デフォルトの名無しさん
2014/11/30(日) 20:33:46.05ID:SVLUkCya >>588
SmalltalkでObjectに500もメソッドなんてねーよw
あったとしたら、アンチパターン ゴッドクラス
(設計の一部分(クラス)に、過剰に機能を集中させること)に
適合してしまうわw
SmalltalkでObjectに500もメソッドなんてねーよw
あったとしたら、アンチパターン ゴッドクラス
(設計の一部分(クラス)に、過剰に機能を集中させること)に
適合してしまうわw
590デフォルトの名無しさん
2014/11/30(日) 20:34:01.13ID:T2KLr1TM >>587
分岐(メソッド探索)の話などしていない
どの式がどのインターフェースを実装しているのかを実行時に検査してるのか?
どの式がどの型の部分型かを実行時に検査しているのか?
へー、それ、なんていう言語だい?
分岐(メソッド探索)の話などしていない
どの式がどのインターフェースを実装しているのかを実行時に検査してるのか?
どの式がどの型の部分型かを実行時に検査しているのか?
へー、それ、なんていう言語だい?
591デフォルトの名無しさん
2014/11/30(日) 20:36:14.22ID:TE77vkUw592デフォルトの名無しさん
2014/11/30(日) 20:36:20.46ID:VpMFGcKd >>585
大規模なシステムは作者が異なる様々なライブラリを使うが、違うライブラリ間で
同じ意味の機能に同じインターフェースを持たせるのは不可能
インターフェース方式は、ある数値計算ライブラリと別の行列演算ライブラリを混ぜて使う場合などで問題になる
大規模なシステムは作者が異なる様々なライブラリを使うが、違うライブラリ間で
同じ意味の機能に同じインターフェースを持たせるのは不可能
インターフェース方式は、ある数値計算ライブラリと別の行列演算ライブラリを混ぜて使う場合などで問題になる
593デフォルトの名無しさん
2014/11/30(日) 20:40:02.67ID:/BRxH/wW >>590
実行時にvalidationするのがダックタイピングというなら
構造的部分型は確かに違うな
"If it walks like a duck and quacks like a duck, it must be a duck"
という文章からそのような意味を読み取るのは無理だが
実行時にvalidationするのがダックタイピングというなら
構造的部分型は確かに違うな
"If it walks like a duck and quacks like a duck, it must be a duck"
という文章からそのような意味を読み取るのは無理だが
594デフォルトの名無しさん
2014/11/30(日) 20:40:22.76ID:SVLUkCya >>591
> Smalltalkでは色々なパッケージがObjectクラスにメソッドを追加していくんだよw
最悪だな。JavaScriptでprototypejsっていうのがあったけど、
名前が標準のメソッドとobjectに追加したメソッド名が
被って大変な目にあっていた。
それ移行Objectにメソッドを追加するのは
ダメなやり方だって広く知られるようになったね。
> Smalltalkでは色々なパッケージがObjectクラスにメソッドを追加していくんだよw
最悪だな。JavaScriptでprototypejsっていうのがあったけど、
名前が標準のメソッドとobjectに追加したメソッド名が
被って大変な目にあっていた。
それ移行Objectにメソッドを追加するのは
ダメなやり方だって広く知られるようになったね。
595デフォルトの名無しさん
2014/11/30(日) 20:40:39.28ID:360iudbJ >>570
いや。duck typing とは言わないけれど、Smalltalk の動的型と
同様の柔軟性を持たせつつ型安全を目指したのがインターフェイス。
(Eiffel流のクラスの継承をサブタイプに使うと型安全でないという流れで)
http://www.cs.utexas.edu/~wcook/papers/InheritanceSubtyping90/CookPOPL90.pdf
いや。duck typing とは言わないけれど、Smalltalk の動的型と
同様の柔軟性を持たせつつ型安全を目指したのがインターフェイス。
(Eiffel流のクラスの継承をサブタイプに使うと型安全でないという流れで)
http://www.cs.utexas.edu/~wcook/papers/InheritanceSubtyping90/CookPOPL90.pdf
596デフォルトの名無しさん
2014/11/30(日) 20:43:21.18ID:/BRxH/wW597デフォルトの名無しさん
2014/11/30(日) 20:45:52.98ID:TE77vkUw >>593
If it walks like a duckというのは、実際のitの振る舞いのことを指しているのだから実行時のことだと考えるのが自然だと思うが?
If it will walk like a duckならばコンパイルだろうけどな。
If it walks like a duckというのは、実際のitの振る舞いのことを指しているのだから実行時のことだと考えるのが自然だと思うが?
If it will walk like a duckならばコンパイルだろうけどな。
598デフォルトの名無しさん
2014/11/30(日) 20:47:16.39ID:TE77vkUw599デフォルトの名無しさん
2014/11/30(日) 20:48:14.19ID:360iudbJ600デフォルトの名無しさん
2014/11/30(日) 20:51:13.03ID:TE77vkUw >>592
>大規模なシステムは作者が異なる様々なライブラリを使うが、違うライブラリ間で
>同じ意味の機能に同じインターフェースを持たせるのは不可能
そういう初心者は補助輪(静的型)を使えばいいよw
ちなみに動的言語の環境では
様々なライブラリでどういうメソッド名がつけられているか検索する仕組みと
指定したメソッド名のメソッドを検索する仕組みが
遥か80年代から用意されていたりするけどなw
>大規模なシステムは作者が異なる様々なライブラリを使うが、違うライブラリ間で
>同じ意味の機能に同じインターフェースを持たせるのは不可能
そういう初心者は補助輪(静的型)を使えばいいよw
ちなみに動的言語の環境では
様々なライブラリでどういうメソッド名がつけられているか検索する仕組みと
指定したメソッド名のメソッドを検索する仕組みが
遥か80年代から用意されていたりするけどなw
601デフォルトの名無しさん
2014/11/30(日) 20:53:54.80ID:TE77vkUw >>599
動的言語では全オブジェクト共通の語彙が重要だから当然そうなる
動的言語では全オブジェクト共通の語彙が重要だから当然そうなる
602デフォルトの名無しさん
2014/11/30(日) 20:56:59.55ID:360iudbJ603デフォルトの名無しさん
2014/11/30(日) 21:05:38.46ID:/BRxH/wW604デフォルトの名無しさん
2014/11/30(日) 21:09:31.70ID:360iudbJ >>601
とはいえ、Squeak のカオス化に嫌気してフォークされた Pharo は
だいぶ減らして 374 だし(3.0調べ)、VisualWorks はもとより 303(7.10調べ)だけどね。
とはいえ、Squeak のカオス化に嫌気してフォークされた Pharo は
だいぶ減らして 374 だし(3.0調べ)、VisualWorks はもとより 303(7.10調べ)だけどね。
605デフォルトの名無しさん
2014/11/30(日) 21:10:47.94ID:VpMFGcKd606デフォルトの名無しさん
2014/11/30(日) 21:13:30.42ID:VpMFGcKd607デフォルトの名無しさん
2014/11/30(日) 21:15:20.91ID:guVElZZq >>599
Pharo 3.0 は、374
Pharo 3.0 は、374
608デフォルトの名無しさん
2014/11/30(日) 21:17:02.28ID:guVElZZq >604 で既出だった orz
609デフォルトの名無しさん
2014/11/30(日) 21:30:34.30ID:360iudbJ610デフォルトの名無しさん
2014/11/30(日) 21:50:46.91ID:mFsly3WX >>595
>いや。duck typing とは言わないけれど、
引用した論文は静的型付け言語における継承の意味論モデルに関する内容であり、
duck typing や interface とは直接的に関係してない
Smalltalk における継承の意味について、Effel は Smalltalk と同じように柔軟だけど型安全ではなく、
Modula-3 や C++ は型安全だけど Smalltalk とは意味が異なる
この論文では、Smalltalk と同じ継承の意味を持ちかつ安全な新しい意味論モデルを提案している
まったく無関係な論文を引用して、いったい何を言いたいのか意味不明だね
なお、ここで言う「継承の意味」とは、具体的には Smalltalk の疑似変数 self や super のこと
たとえば Smalltalk と同じ意味論を持つ Ruby では(Smalltalk と同様な)疑似変数 self と super を持つ
それに対して、Smalltalk とは異なる意味論の Modula-3 を参考にして継承が設計された Python では
self や super に相当する疑似変数は存在せず、わざわざメソッドの引数で __self__ を明示しなければならない
結果として Python は動的型付け言語であるにもかかわらず、Smalltalk や Ruby と同等レベルの柔軟な
オブジェクト指向プログラミングができないという言語設計上の欠陥を抱えている
この意味論モデルは、以下の論文で詳細に解説されている
http://www.cs.utexas.edu/~wcook/papers/thesis/cook89.pdf
>いや。duck typing とは言わないけれど、
引用した論文は静的型付け言語における継承の意味論モデルに関する内容であり、
duck typing や interface とは直接的に関係してない
Smalltalk における継承の意味について、Effel は Smalltalk と同じように柔軟だけど型安全ではなく、
Modula-3 や C++ は型安全だけど Smalltalk とは意味が異なる
この論文では、Smalltalk と同じ継承の意味を持ちかつ安全な新しい意味論モデルを提案している
まったく無関係な論文を引用して、いったい何を言いたいのか意味不明だね
なお、ここで言う「継承の意味」とは、具体的には Smalltalk の疑似変数 self や super のこと
たとえば Smalltalk と同じ意味論を持つ Ruby では(Smalltalk と同様な)疑似変数 self と super を持つ
それに対して、Smalltalk とは異なる意味論の Modula-3 を参考にして継承が設計された Python では
self や super に相当する疑似変数は存在せず、わざわざメソッドの引数で __self__ を明示しなければならない
結果として Python は動的型付け言語であるにもかかわらず、Smalltalk や Ruby と同等レベルの柔軟な
オブジェクト指向プログラミングができないという言語設計上の欠陥を抱えている
この意味論モデルは、以下の論文で詳細に解説されている
http://www.cs.utexas.edu/~wcook/papers/thesis/cook89.pdf
611デフォルトの名無しさん
2014/11/30(日) 22:04:51.19ID:SVLUkCya オブジェクト指向プログラミングをするのが目的ではない。
巨大なシステムをより早くより安全に開発するのが目的なのだ。
巨大なシステムをより早くより安全に開発するのが目的なのだ。
612デフォルトの名無しさん
2014/11/30(日) 22:11:54.90ID:rR9TrKjV オブジェクト指向上の欠陥とやらが何か知らんが、
そのお陰で実用レベルの型推論(補完や型検査)が出来てるなら面白いな
そのお陰で実用レベルの型推論(補完や型検査)が出来てるなら面白いな
613デフォルトの名無しさん
2014/11/30(日) 22:22:44.40ID:SVLUkCya 人間が間違わずに全てのコードを脳に記憶して
タイプミスすらしないことを前提にするならば、
コードにわざわざ記憶の断片(つまり型情報)を書く必要はないよ。
それができないから、型情報を書いたほうが
わずかの手間だけで、そのあとずっと楽ができるわけで。
タイプミスすらしないことを前提にするならば、
コードにわざわざ記憶の断片(つまり型情報)を書く必要はないよ。
それができないから、型情報を書いたほうが
わずかの手間だけで、そのあとずっと楽ができるわけで。
614デフォルトの名無しさん
2014/11/30(日) 22:32:19.86ID:360iudbJ >>570
すまん。こっちだった。
Interfaces for Strongly-Typed Object-Oriented Programming
http://www.cs.utexas.edu/~wcook/papers/OOPSLA89/interfaces.pdf
すまん。こっちだった。
Interfaces for Strongly-Typed Object-Oriented Programming
http://www.cs.utexas.edu/~wcook/papers/OOPSLA89/interfaces.pdf
615デフォルトの名無しさん
2014/11/30(日) 22:48:40.83ID:mFsly3WX >>612
>オブジェクト指向上の欠陥とやらが何か知らんが、
有名な Python のself地獄だよ
キーワード「python self地獄」で検索すればGoogle先生が教えてくれる
Python しか知らなければself地獄が気にならないかもしれないけど、
Smalltalk や Ruby を知っている人からすれば、無知は幸せだなぁと見る
これの基礎が「継承の意味論における差異」になる
なお単に意味論の違いだから、self地獄と引き換えに
実用的な型推論(補完や型検査)が手に入るわけではない
両者の間に直接的な関連性は無い(言い換えるとスレチな話題)
>オブジェクト指向上の欠陥とやらが何か知らんが、
有名な Python のself地獄だよ
キーワード「python self地獄」で検索すればGoogle先生が教えてくれる
Python しか知らなければself地獄が気にならないかもしれないけど、
Smalltalk や Ruby を知っている人からすれば、無知は幸せだなぁと見る
これの基礎が「継承の意味論における差異」になる
なお単に意味論の違いだから、self地獄と引き換えに
実用的な型推論(補完や型検査)が手に入るわけではない
両者の間に直接的な関連性は無い(言い換えるとスレチな話題)
616デフォルトの名無しさん
2014/11/30(日) 22:53:53.26ID:rR9TrKjV617デフォルトの名無しさん
2014/11/30(日) 22:55:23.26ID:360iudbJ618デフォルトの名無しさん
2014/11/30(日) 22:55:36.39ID:/BRxH/wW619デフォルトの名無しさん
2014/11/30(日) 22:57:41.96ID:mFsly3WX >>614
この論文内では duck typing という用語は一度も使われていないし、
タイトルに Strongly-Typed と書かれているように静的型付け言語に関する内容だ
で、いったいどこから duck typing を連想したの?
この論文内では duck typing という用語は一度も使われていないし、
タイトルに Strongly-Typed と書かれているように静的型付け言語に関する内容だ
で、いったいどこから duck typing を連想したの?
620デフォルトの名無しさん
2014/11/30(日) 23:00:20.47ID:360iudbJ 典型的なアスペか。
621デフォルトの名無しさん
2014/11/30(日) 23:01:15.62ID:mFsly3WX622デフォルトの名無しさん
2014/11/30(日) 23:09:04.67ID:rR9TrKjV623デフォルトの名無しさん
2014/11/30(日) 23:09:46.51ID:tHR3Cg3X あれ?int型の+とstring型の+に対するオーバーロードみたいな話になってる?
無知なら口だすなと言われそうなので黙っておきます…
無知なら口だすなと言われそうなので黙っておきます…
624デフォルトの名無しさん
2014/11/30(日) 23:22:20.73ID:/BRxH/wW >>621
そうか。じゃあスレ違いの話は止めないと荒らしになってしまうな
そうか。じゃあスレ違いの話は止めないと荒らしになってしまうな
625デフォルトの名無しさん
2014/11/30(日) 23:27:42.56ID:mFsly3WX >>616
Python のオブジェクト指向は Modula-3 を参考にしているけど、
Modula-3 のオブジェクト指向は Simula を参考にしている
そして疑似変数 self の概念は Simula には存在せず、
Simula を参考にした Smalltalk で生まれた
だから、Modula-3 や Python に疑似変数 self は存在せず、
これを模倣するにはメソッド引数で明示的に __self__ を
渡さなければならない訳
あと疑似変数 self の値は実行時に決まるから、
もし Python で __self__ を省略できるようにするためには、
構文論(syntax)の変更すなわちパーザの改造だけではダメで、
意味論(semantics)も変更しなければならない
こうした背景も知らずに「変人だから」という理由で決めつけるのは、
Guido氏に失礼だと思うよ
Python のオブジェクト指向は Modula-3 を参考にしているけど、
Modula-3 のオブジェクト指向は Simula を参考にしている
そして疑似変数 self の概念は Simula には存在せず、
Simula を参考にした Smalltalk で生まれた
だから、Modula-3 や Python に疑似変数 self は存在せず、
これを模倣するにはメソッド引数で明示的に __self__ を
渡さなければならない訳
あと疑似変数 self の値は実行時に決まるから、
もし Python で __self__ を省略できるようにするためには、
構文論(syntax)の変更すなわちパーザの改造だけではダメで、
意味論(semantics)も変更しなければならない
こうした背景も知らずに「変人だから」という理由で決めつけるのは、
Guido氏に失礼だと思うよ
626デフォルトの名無しさん
2014/11/30(日) 23:31:44.94ID:guVElZZq もう、超優秀なIDEがあって動的構造取り入れた c# 最強って事で良いんじゃないの?
627デフォルトの名無しさん
2014/11/30(日) 23:42:47.38ID:UnYKruMf628デフォルトの名無しさん
2014/11/30(日) 23:43:33.56ID:mFsly3WX >>622
> 1989年の論文にduck typingと言う用語が出てきたらそっちの方が驚くわ
そうだろ、だから驚いて >>619 では
>>で、いったいどこから duck typing を連想したの?
と書いた
論文を引用するのはいいけど、この論文をどう解釈して duck typing に結びつけたのか、
説明が無ければ意味が分からんという話だよ
>abstract斜め読みしただけだがSmalltalkには言及されてんぞ
Smalltalk の柔軟な継承を強い型付け(=静的型付け)なOO言語に取り込むために
インターフェイスを用いる、という文脈でね
動的型付けを濫用するというニュアンスを持つ duck typing とは何の関係も無い
この論文、型システムと言語設計に興味がある人にはとても有益だから、
斜め読みと言わずじっくり読んでみたほうがいいと思うな
> 1989年の論文にduck typingと言う用語が出てきたらそっちの方が驚くわ
そうだろ、だから驚いて >>619 では
>>で、いったいどこから duck typing を連想したの?
と書いた
論文を引用するのはいいけど、この論文をどう解釈して duck typing に結びつけたのか、
説明が無ければ意味が分からんという話だよ
>abstract斜め読みしただけだがSmalltalkには言及されてんぞ
Smalltalk の柔軟な継承を強い型付け(=静的型付け)なOO言語に取り込むために
インターフェイスを用いる、という文脈でね
動的型付けを濫用するというニュアンスを持つ duck typing とは何の関係も無い
この論文、型システムと言語設計に興味がある人にはとても有益だから、
斜め読みと言わずじっくり読んでみたほうがいいと思うな
629デフォルトの名無しさん
2014/11/30(日) 23:44:44.78ID:/BRxH/wW >>616
http://neopythonic.blogspot.jp/2008/10/why-explicit-self-has-to-stay.html
・ただの関数を、後からクラスにメソッドとして後付けできること(そのとき暗黙のselfの扱い)
・decoratorがあるから(動的にstatic methodやclass methodに変更できる)
というのが理由だそうだ
http://neopythonic.blogspot.jp/2008/10/why-explicit-self-has-to-stay.html
・ただの関数を、後からクラスにメソッドとして後付けできること(そのとき暗黙のselfの扱い)
・decoratorがあるから(動的にstatic methodやclass methodに変更できる)
というのが理由だそうだ
630デフォルトの名無しさん
2014/11/30(日) 23:49:11.15ID:guVElZZq >>627
Roslyn凄そうだが、どんだけのヤツが付いていけるんだろ。
Roslyn凄そうだが、どんだけのヤツが付いていけるんだろ。
631デフォルトの名無しさん
2014/11/30(日) 23:50:00.23ID:nRiDRl39632デフォルトの名無しさん
2014/11/30(日) 23:52:00.50ID:mFsly3WX633デフォルトの名無しさん
2014/11/30(日) 23:53:34.74ID:/BRxH/wW 言語だけでいうならRustに期待しているんだが……
634デフォルトの名無しさん
2014/11/30(日) 23:57:11.19ID:SVLUkCya635デフォルトの名無しさん
2014/11/30(日) 23:58:47.30ID:mFsly3WX >>634
おいおい、Python は動的型付け言語だよ
おいおい、Python は動的型付け言語だよ
636デフォルトの名無しさん
2014/11/30(日) 23:59:07.80ID:rR9TrKjV637デフォルトの名無しさん
2014/11/30(日) 23:59:36.82ID:UnYKruMf638デフォルトの名無しさん
2014/11/30(日) 23:59:39.73ID:guVElZZq >>631
dynamic型
dynamic型
639デフォルトの名無しさん
2014/12/01(月) 00:02:55.46ID:v1/AC0CB640デフォルトの名無しさん
2014/12/01(月) 00:04:29.77ID:JhMfQ7kZ >>636
いや、Procオブジェクトを明示的にコーディングするのは稀だ
クロージャの無い Python とは違って、
Ruby だと普通は do |x| ... end や { |x| .... } で書ける
いや、Procオブジェクトを明示的にコーディングするのは稀だ
クロージャの無い Python とは違って、
Ruby だと普通は do |x| ... end や { |x| .... } で書ける
641デフォルトの名無しさん
2014/12/01(月) 00:08:40.28ID:v1/AC0CB642デフォルトの名無しさん
2014/12/01(月) 00:11:50.96ID:WHPunuUw643デフォルトの名無しさん
2014/12/01(月) 00:13:16.83ID:2BTgZC4D 結局は、静的言語が動的言語の要素を取り入れて進化し、両方の境界が曖昧になるんだよ。
644デフォルトの名無しさん
2014/12/01(月) 00:15:06.71ID:JhMfQ7kZ >>641
逆だろw
クロージャを使えば簡潔に書けるのに、結局 Python ではコードが書けずに終わった
で、しまいに火病を発症してわめきちらしただけ、それがフルボッコなのか?www
今からでもいいから Python でコード書いてみな
逆だろw
クロージャを使えば簡潔に書けるのに、結局 Python ではコードが書けずに終わった
で、しまいに火病を発症してわめきちらしただけ、それがフルボッコなのか?www
今からでもいいから Python でコード書いてみな
645デフォルトの名無しさん
2014/12/01(月) 00:18:09.70ID:v1/AC0CB646デフォルトの名無しさん
2014/12/01(月) 00:20:09.36ID:JhMfQ7kZ >>640
ほう、Python で Soft Typing が実用化されたとは初耳だ
ググってみると2003年に提案はあったものの、
その後に実装されたという情報は見つけられなかった
本当に実用化されているの?
また嘘でも何でも議論に勝ちさえばいいという発想じゃないのかなあ....
ほう、Python で Soft Typing が実用化されたとは初耳だ
ググってみると2003年に提案はあったものの、
その後に実装されたという情報は見つけられなかった
本当に実用化されているの?
また嘘でも何でも議論に勝ちさえばいいという発想じゃないのかなあ....
647デフォルトの名無しさん
2014/12/01(月) 00:21:49.35ID:v1/AC0CB648デフォルトの名無しさん
2014/12/01(月) 00:28:35.48ID:v1/AC0CB■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国・ロシア両軍の爆撃機が東京方面へ向かう「異例のルート」を共同飛行…核も搭載可能、連携して威嚇か ★3 [ぐれ★]
- 京都のホテル大幅値下げ 訪日中国人客、年1000万人目前で急ブレーキ [蚤の市★]
- 「中国人の訪日熱は冷めた」 人気旅行先から日本外れる 14日で自粛呼びかけ1カ月 ★3 [蚤の市★]
- 現場からは悲鳴、母親からは「高い」「性犯罪が怖い」の声も…高市総理がどうしても実現したい政策「ベビーシッターの利用促進」 [ぐれ★]
- 「今の女性はルッキズム」は本当なのか? 若い世代が結婚相手に求める"本当の条件" [少考さん★]
- 「1800万円の売り上げゼロに…」中国インバウンドに特化の宿の今 ★3 [蚤の市★]
- クリスマスの「予定なし」54% 貧困ジャップで進む季節のイベント離れ… [667744927]
- 【実況】博衣こよりのえちえちドラクエ1&2リメイク🧪
- 【悲報】ユニクロのダウンを洗った結果wwwwwwwwwwwwwwwwwwww [802034645]
- 秋田でクマに柴犬が惨殺→犬の外飼いに批判が殺到「クマが出る地域で頑なに外で犬を飼う理由が理解できない!」高市 [357264179]
- 催眠おじさんぼく「人類は戦争禁止です!」
- 【高市悲報】NHKニュース「発狂している中国に対して、日本は至って冷静」😳 [762037879]
