やっぱり動的型付け言語は大規模開発で効率が悪い 4
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2011/11/21(月) 11:48:03.35やっぱり動的型付け言語は大規模開発で効率が悪い 3
http://hibari.2ch.net/test/read.cgi/tech/1320832914/
0175デフォルトの名無しさん
2011/11/28(月) 01:50:47.66静的型チェック機構があれば便利なのは自明じゃないの?
0176デフォルトの名無しさん
2011/11/28(月) 01:52:51.47既存の静的型チェック機構は大なり小なりなんらかの問題を抱えているもんなんじゃないの?
0177デフォルトの名無しさん
2011/11/28(月) 01:56:44.950178デフォルトの名無しさん
2011/11/28(月) 02:09:51.04言語仕様としてEnum値を網羅していない場合をエラーとしていないだけであって
(網羅していないswitch文を書いたっていいじゃん)、検証自体は文法的に、静的に
出来るし、そういうツールだって書ける。実際Eclipseでオプション一つ変更すれば
Enum値を網羅していない場合をコンパイル時にエラーとしてはじけるわけで。
じゃあ何故Enumを使った場合は自動的に網羅性を検証するよう言語仕様そのもの
を変えないのかと問われれば、これは歴史的な経緯としか言えん。
もともとJavaのEnumは後付けでswitchは整数型で分岐するものだったから網羅性
のチェックといってもコンパイルの手間を考えるとdefaultの有無を確認する程度
しか現実的な解は無かった。
その後Enumでも分岐できるようになったものの、整数型の場合の動作と揃えて
網羅していない場合もエラーにならない、そういう判断になっただけの話。
0179デフォルトの名無しさん
2011/11/28(月) 02:18:06.48- 大事なのは、静的型付きであることより静的型チェック機構の有無。
- ドカタに任せられるレベルのコードでは動的型付きのメリットは皆無。というか変に使われると逆に困る
- したがって、静的型チェック機構による制約も気にならないしメリットのほうがはるかに大きい。
- 制約を増やせばより確実な型チェックが可能になるが、その分ルールや出来ない事や場合によっては記述も増える。
- 出来ない事や記述の増加は問題ないが、ルールが増えてしまうと当然ドカタは使えなくなるから本末転倒。
- だからドカタ向けにはJavaやC#程度の型チェックでおk。
0180デフォルトの名無しさん
2011/11/28(月) 02:25:35.33せっかくenum使ったswitchの網羅性をチェックしても、
enum型変数の値をnullにするだけで
ぬるぽ発生してどの分岐も通らないJavaは素晴らしい
0181デフォルトの名無しさん
2011/11/28(月) 02:33:12.340182デフォルトの名無しさん
2011/11/28(月) 05:46:05.30nullケースも必須にすればいいだけ。
0183デフォルトの名無しさん
2011/11/28(月) 05:50:01.13ああドカタ君にはまだ解らないか…
難しいこと言って、ゴメンね♪
0184デフォルトの名無しさん
2011/11/28(月) 06:57:12.81「同じ問題」の例示を求む。
0185デフォルトの名無しさん
2011/11/28(月) 07:16:41.29非nullを静的に検証することができるの?
0186デフォルトの名無しさん
2011/11/28(月) 07:34:40.180187デフォルトの名無しさん
2011/11/28(月) 08:46:24.18VB6は引数にかかわらず、浮動小数割り算が/で整数割り算が%だったなw
0188デフォルトの名無しさん
2011/11/28(月) 16:25:16.15>JavaでもEnum値で分岐するswitch文は網羅性を検証できるよ。
ほー、Javaでも静的に検査できるんだぁ....と思わせておいて、
>その後Enumでも分岐できるようになったものの、整数型の場合の動作と揃えて
>網羅していない場合もエラーにならない、そういう判断になっただけの話
これが結論か?できるのか/できないのか、どっちかはっきりしろよwww
まるで、こんな天気予報と同じだぞ
明日は晴れでしょう。しかし曇ることもあります。地域によっては雨かもしれません。
0189デフォルトの名無しさん
2011/11/28(月) 17:13:56.43静的型付けではMap<K,V>のV型の値しかデフォルト値として与えられないから
マップを引けたかどうかを返り値のみから確定させる一般的方法がない。
動的型付け言語ならば、他から参照されない軽量なインスタンスを新しく生成して
それをデフォルト値に指定するだけ。Object型とか。
静的型付け言語では、V型が新インスタンス生成可能とは限らないし、
インスタンス生成が重いと使えない。
だからJavaでは返り値のみで判定するなと警告されている。
0190デフォルトの名無しさん
2011/11/28(月) 19:31:19.96軽いクラスのインスタンスとしてデフォルト値を用意する方法にしても、
それはそう実装できるというだけの話であって、APIで強制できる一般的方法
ではない。このmapはkeyが無い場合はこの値を返しますよ。単なるダミーの
値ですから信用して使ったりしないで下さいね云々と個別に規約を文書化する
必要がある。規約を知らないと判別出来ない。知らずにデフォルト値をいじる
バカも出る。これのどこが「一般的」?
良いところ「個別の解決策」止まりだし、似たような方法は別にJavaのMap
でもMap<K, Object>とでもすれば出来る。ただvalueについて静的型付けの
恩恵を受けられなくなるから、普通はやらない。
一般的な方法というのは言語の組み込み定数としてnullとは別にundefinedを
持っているとか、keyを与えるとkeyとvalueのペアを返す関数が用意されて
いるとか、keyが無いと例外を投げるとか、どういうmapであっても常に返値
だけで判別出来る方法。
「返り値のみから確定させる一般的方法」の有無というのは要するにこう
いった定数や関数が用意されているか否かの問題であって、型付けが動的
静的云々は全く関係が無い。
Javaだったらgetが例外を投げるようにするとかキーバリューのエントリー
を引っ張って返すようなメソッドを用意するとかすれば良いし、そういう
デコレーターを書くのも簡単。
でもJava Collections Frameworkはこれらを持っていない。書こうとすれば
書けるものを何故用意しなかったか理由は知らないけれども、単に需要が
薄いと判断された事は大いに想像できる。他の言語でも持っていない例は
多いところから見ても、需要は薄そうだ。
0191デフォルトの名無しさん
2011/11/28(月) 19:32:44.98一般というのは、任意の型Vについて適用可能な手法だということ。
広く用いられているという意味ではない。
0192デフォルトの名無しさん
2011/11/28(月) 19:35:48.82> 似たような方法は別にJavaのMap
> でもMap<K, Object>とでもすれば出来る。
すまんが、正直、馬鹿すぎて笑えた。
0193デフォルトの名無しさん
2011/11/28(月) 20:12:17.30からkeyの有無を確定させる「一般的方法」を持たない。
持たない理由の推測は>>190に書いたとおり。
・ただそれを言えば動的型付けの言語だってAPIとして「一般的方法」を持た
ない言語は多い。そういう場合は手作りをする必要がある。
・Javaの場合は「APIを拡張」することで任意のVについて「一般的方法」を
導入できる。どんなアプローチがあるのかも>>190に書いたとおり。
・動的言語の場合は加えて「Vの値域を拡張」することで「一般的方法」を
導入することも出来る。具体的にはデフォルト値の導入。
・APIを拡張せずに「一般的方法」を導入出来る点は確かに動的型付け言語
のメリットかもしれない。ただAPIはそのままの代償として規約を新たに
導入する必要がある。バカ避けとしては、どうなんだろうね?
・Map<K,Object>は馬鹿で結構。馬鹿だから普通はやらない。
0194デフォルトの名無しさん
2011/11/28(月) 20:16:30.98インスタンス生成してデフォルト値として返せたら良かったね
0195デフォルトの名無しさん
2011/11/28(月) 20:26:35.68ジェネリクス導入前のJavaみたいなコードになりそうだな
その頃から使ってるから書けるけども、静的型には程遠かったなあ…
0196デフォルトの名無しさん
2011/11/28(月) 20:36:52.78Apache Commons Collectionsで出来る話とは違う話かな?
デフォルト値の指定自体はDefaultedMapで、デフォルト値を生成する
コンストラクタの指定はLazyMapで出来る。
0197デフォルトの名無しさん
2011/11/28(月) 20:58:29.27new V()が出来ればfactoryオブジェクトを用意する手間が要らなくて
良かったねってこと
0198デフォルトの名無しさん
2011/11/28(月) 21:20:15.92作ればいいだけだから、すごく小さな問題でしかないな。
0199デフォルトの名無しさん
2011/11/28(月) 21:26:47.02良く訓練されてやがるww
0200デフォルトの名無しさん
2011/11/28(月) 21:27:57.07う〜ん、確かにそれは出来ないなぁ。
替わりの策としてはファクトリを用意せずにClass<V>を渡すバージョンは
作ることが出来そうだけれども、デフォルトコンストラクタの存在確認が
実行時になってしまうのがいやんなかんじ。
0201デフォルトの名無しさん
2011/11/28(月) 21:29:03.300202デフォルトの名無しさん
2011/11/28(月) 22:04:08.800203デフォルトの名無しさん
2011/11/28(月) 22:31:06.150204デフォルトの名無しさん
2011/11/28(月) 23:16:44.91やっぱり、Javaの方がいいのか。
0205デフォルトの名無しさん
2011/11/28(月) 23:17:23.35> そしてそのリリースがさらに1年遅れようと、Scalaが安定するよりも早く
> 多くのJava開発者に関数型プログラミングをもたらすだろう。
> Javaに追い抜かれる前にScalaが体勢を立て直すのはもう遅すぎるかもしれない。
0206デフォルトの名無しさん
2011/11/29(火) 00:27:34.400207デフォルトの名無しさん
2011/11/29(火) 03:47:46.34出来る。Eclipseなどの外部ツールを使えば出来る。
明日の天気は雨ですが内陸部では晴れるでしょう。そんな感じ。
言語としてJavaはswitch文でのenumの網羅性は要求していない。
しかしコーディングの規約として網羅性を強制したいのであれば、それをツールで
支援することは何も妨げられないということ。
Cでもgccはswitch文でのenumの網羅性を検証するオプションがある。
0208デフォルトの名無しさん
2011/11/29(火) 05:01:39.17ドカタは空のdefault枝を書いて /* おまじない */とかコメントつけるだけ。
0209デフォルトの名無しさん
2011/11/29(火) 19:52:15.88そういうプログラマ個人に依存した話は却下します。
どんな言語を使おうが、その人がやるなら同じ事ですから。
0210デフォルトの名無しさん
2011/11/29(火) 23:00:34.42土カッチにもマトモなのもいれば
果てしなく杜撰とか低レベルなのも
0211デフォルトの名無しさん
2011/11/29(火) 23:38:56.00頭大丈夫?
0212デフォルトの名無しさん
2011/11/30(水) 00:00:03.75>ドカタは空のdefault枝を書いて /* おまじない */とかコメントつけるだけ。
それこそツールではじけばいいだけやん。
0213デフォルトの名無しさん
2011/11/30(水) 02:24:01.080214デフォルトの名無しさん
2011/11/30(水) 02:25:14.82実際は悪貨のほうが駆逐されてるだろ。
現実見ろよ。
0215デフォルトの名無しさん
2011/11/30(水) 04:58:11.20本当にデフォルトは処理無しな場合とどう区別する?
0216デフォルトの名無しさん
2011/11/30(水) 07:11:35.21金貨銀貨は既に過去のもの
つまり駆逐済み
0217デフォルトの名無しさん
2011/11/30(水) 09:45:24.91こんなリンクを貼らないといけないなんて中学生じゃあるまいし。
0218デフォルトの名無しさん
2011/11/30(水) 10:05:30.62理論が飛躍して言葉遊びの域に達してるだけで。
>>214は新言語が旧言語の悪いところを潰していってるのではないかと言い、
>>216は正直良く分からんが、
これまでの通貨の歴史を紐解けば今の言語が悪貨であることが示唆されると言ってるんじゃないのか。
0219デフォルトの名無しさん
2011/11/30(水) 16:51:37.54dos/windows,x86,真性ドカタと本物グラマ、
php等例には事欠かない
逆は真ではないけど
0220デフォルトの名無しさん
2011/11/30(水) 17:20:05.85これじゃねーのか
0221デフォルトの名無しさん
2011/11/30(水) 20:30:19.95概ねそのとおり。
悪貨は良貨を駆逐するなんてのはただのことわざで、根拠はない。
逆に良貨が悪貨を駆逐することもある。
ことわざってのは定理なんかではなく、そういうこともあるよね〜レベル。
逆の意味を持ったことわざだってある。絶対正しいことを言っているわけじゃない。
だから、「悪貨は良貨を駆逐する。」なんてことをいう人は、
正しいか間違ってるかを考えずに、思考停止しているだけの馬鹿と俺は判断する。
0222デフォルトの名無しさん
2011/11/30(水) 20:33:42.90勝利したものに対して「勝ったほうが負けなんだ!」って言ってるみたいな感じw
0223デフォルトの名無しさん
2011/11/30(水) 20:37:02.90ドカタの脳みそに入る言語の中では
0224デフォルトの名無しさん
2011/11/30(水) 20:47:41.840225デフォルトの名無しさん
2011/11/30(水) 20:51:47.34なぜならば機械的に動的 ⇒ 静的の変換が可能だからだ。
型が無限にあれば静的にできない可能性があるが、実用上ではありえない。
0226デフォルトの名無しさん
2011/11/30(水) 20:52:11.30勝ち組に対する僻みだからねw
0227デフォルトの名無しさん
2011/11/30(水) 20:54:46.530228デフォルトの名無しさん
2011/11/30(水) 21:15:47.32・関数の引数に型が明記されている。
・変数に型が明記されている。
・オブジェクトの生成から、型をチェックしたい箇所のコードすべてで型が明記されている。
この3つがないと、型チェックはできないからね。
コードのどこかで型情報がなくなったりしたら
意味なくなっちゃうし。
結局、プロジェクトの全部の箇所にちゃんと型を明記しないといけなくなるんだけど。
0229デフォルトの名無しさん
2011/11/30(水) 21:56:52.54動的に型を定義可能な言語の場合は?
0230デフォルトの名無しさん
2011/11/30(水) 23:56:08.45動的な型付けでしかできないメリットをコードで見せて。
0231デフォルトの名無しさん
2011/12/01(木) 02:00:48.140232デフォルトの名無しさん
2011/12/01(木) 02:07:05.000233デフォルトの名無しさん
2011/12/01(木) 02:24:05.21"11" や 2 だとおかしい。
0234デフォルトの名無しさん
2011/12/01(木) 05:48:37.92eval
0235デフォルトの名無しさん
2011/12/01(木) 06:58:10.57静的な言語よりキツいのは確か
0236デフォルトの名無しさん
2011/12/01(木) 07:18:28.53> この3つがないと、型チェックはできないからね。
できます。
0237デフォルトの名無しさん
2011/12/01(木) 08:14:36.46見ない、見たくない、聞こえない、聞きたくない.... ヤシなんだろw
0238デフォルトの名無しさん
2011/12/01(木) 08:39:19.240239デフォルトの名無しさん
2011/12/01(木) 09:53:38.42ハッシュキーに 'f1' と文字列を書くことはない。
最低限定数として定義するし Java なら列挙型を使う。
>>139
キーに対する値に生の null を使う設計が脆弱。null object pattern を使う。
>>189
軽量なデフォルトコンストラクタを持たない V をリファクタリングするには
(1) V からインタフェース I を抽出する
(2) V の利用を I に置き換える
(3) I を実装するデフォルト値用のクラス N を実装する
0240デフォルトの名無しさん
2011/12/01(木) 10:04:09.76ていうからなにかと思えば、Javaのことだった、ってのが
お約束パターン過ぎてあきれるよね。
0241デフォルトの名無しさん
2011/12/01(木) 11:25:03.25次の二つの階級の話が混じってるから同じパターンのループになってしまう。
無差別級:全ての言語で比較
ドカタ級:ドカタが使える言語で比較
だからドカタでも使える言語を明らかにした方が良い。
Javaは鉄板として、あと何があるのか。
0242デフォルトの名無しさん
2011/12/01(木) 11:30:10.700243デフォルトの名無しさん
2011/12/01(木) 12:04:50.870244デフォルトの名無しさん
2011/12/01(木) 12:29:44.44今の流れだと「使える」のレベルによってドカタかそうでないかが分類されるってより、
言語自体とドカタを結びつけようとしていて危険だろ。
0245デフォルトの名無しさん
2011/12/01(木) 12:39:13.51求人市場に案件のある言語は全部ドカタ言語だよ
0246デフォルトの名無しさん
2011/12/01(木) 12:40:04.30技術の問題じゃない。金の問題。
0247デフォルトの名無しさん
2011/12/01(木) 12:42:53.72自分の使える言語を書いていけば良いんじゃないの?
0248デフォルトの名無しさん
2011/12/01(木) 12:45:11.19常に新しいパラダイムを提唱してくる。使える使えないは二の次。
使える使えないが真の意味で実証されるのはドカタが使うようになった時で、
その時には当の研究者はとっくにトンズラして新しい研究を始めてる。
これのループ。
0249デフォルトの名無しさん
2011/12/01(木) 12:57:08.650250デフォルトの名無しさん
2011/12/01(木) 13:01:51.340251デフォルトの名無しさん
2011/12/01(木) 17:02:29.83仮にその人がいなくなっても、代わりはすぐに補充できる。
でも、代わりが利かない人ってヘッドハンティングなどで抜けたら、
代わりの補充が利かないよね。
年齢以外の要素で違いが見いだせない人がJavaには多そうってことなんだろ?
0252デフォルトの名無しさん
2011/12/01(木) 17:17:19.050253デフォルトの名無しさん
2011/12/01(木) 18:54:07.420254デフォルトの名無しさん
2011/12/01(木) 18:54:25.15最初に思いついたのはショータイム
0255デフォルトの名無しさん
2011/12/01(木) 22:39:39.44エラーだろjk
0256デフォルトの名無しさん
2011/12/01(木) 23:05:18.58evalは目的じゃなくて手段でしょ?
なんのためにevalを使うの?
Perlで例外をトラップするために使うは答えになってないよ。
0257デフォルトの名無しさん
2011/12/01(木) 23:10:54.65> だからドカタでも使える言語を明らかにした方が良い。
> Javaは鉄板として、あと何があるのか。
意味がわからん。
動的型付け言語と静的型付け言語の話だろ?
Java以外というのは静的型付け言語を言えばいいのか?
よく使われてる言語だと、C、C++、C#、VB.NET、Scala、 Objective-Cあたりだね。
動的型付け言語はよく使われてるといえるのは、Ruby、Perl、PHP、JavaScript、Pythonぐらいか?
0258デフォルトの名無しさん
2011/12/01(木) 23:47:16.22それらを知ってれば>>228のようなことは書かないと思うけど。
>>228が特別に無知だったでFA?
0259デフォルトの名無しさん
2011/12/02(金) 00:00:39.44お前型推論を誤解してないか?
型推論ってのは、型書くのを省略出来るだけで、
型を書いてるのと全く一緒なんだが。
0260デフォルトの名無しさん
2011/12/02(金) 00:01:37.04どこかに型の情報があるから。
0261デフォルトの名無しさん
2011/12/02(金) 00:05:36.47それとも明記って日本語を理解してないのか?
> ・関数の引数に型が明記されている。
> ・変数に型が明記されている。
> ・オブジェクトの生成から、型をチェックしたい箇所のコードすべてで型が明記されている。
全部間違い
0262デフォルトの名無しさん
2011/12/02(金) 00:12:12.07> 省略できるんだから明記しなくても良いってことだろ
よく見ると省略されてない。
一見省略されているように見えるが、遠くで明記されている。
それを見て推論しているだけ。
どこにも明記されていなければ、絶対にわかりません。
0263デフォルトの名無しさん
2011/12/02(金) 00:15:40.14知らないのも無理は無いよ。
Map<String, List<String>> anagrams = new HashMap<>(); // 右のダイヤモンドオペレータ内を省略可
0264デフォルトの名無しさん
2011/12/02(金) 00:17:01.41推論する方法があるとか言うべきだろ。
反論の仕方がおかしい。
0265デフォルトの名無しさん
2011/12/02(金) 00:21:32.82関数の「もっとも一般的な型」を推論できる事が保証されている
0266デフォルトの名無しさん
2011/12/02(金) 00:26:25.160267デフォルトの名無しさん
2011/12/02(金) 00:26:43.88→ プログラムのどこかで型を明記する必要がある
→ どこにも明記してなくても明記してるのと同じ ← いまここ
0268デフォルトの名無しさん
2011/12/02(金) 00:50:51.61だれがそんな事言ったんだ?
0269デフォルトの名無しさん
2011/12/02(金) 00:58:39.39MLは型は自由に作れる
MLで厳格な型推論が可能なのは、演算子多重定義やメインストリームのOO言語における
ポリモーフィズムやディスパッチの類が存在しないからだろ
端的に言うと+がintにしか定義されていないので
x + yという式を見たらMLのコンパイラはxとyがintだと推論できる
0270デフォルトの名無しさん
2011/12/02(金) 01:11:19.88一応OCamlにはクラスやオブジェクトもあって、オブジェクトを引数に取る関数が書けるけど、
構造的部分型を採用してるから型注釈は必須じゃない(列多相が型推論される)
0271デフォルトの名無しさん
2011/12/02(金) 06:34:08.19型の中にパラメトリックな多相があっても、
矛盾のないように型パラメータを具体化して
型の整合性を検証できるということ。
型宣言がめんどくさいから使うんじゃなくて、
より抽象度が高いコードを書くために使うんだよ。
やっぱドカタに静的型付けを使わせるのは壮大なムダでしかないなw
0272デフォルトの名無しさん
2011/12/02(金) 06:56:25.480273デフォルトの名無しさん
2011/12/02(金) 07:05:58.09無知を晒したから話を変えようとしてるのかな?
0274デフォルトの名無しさん
2011/12/02(金) 07:47:09.28×)ドカタに静的型付けを使わせるのは壮大なムダ
○)ドカタにJava以外を使わせるのは壮大なムダ
■ このスレッドは過去ログ倉庫に格納されています