動的言語の問題点、大規模開発でテスト工数が増大
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2012/04/24(火) 05:02:52.54非常に遅いため、Rubyで作成したアプリケーションの納品をためらったことがあります。
Rubyはプロトタイプ作成用に使い、納品用にJavaで作りなおさなければなりませんでした。
RubyとRailsのプロジェクトが数千行の規模を超え、チームに新しいメンバーを追加したときに、
動的言語の問題が明らかになって来ました。私たちは、コーディングの時間の半分をテスト作成の
費やさなければならなかったのです。Railsによって得られた生産性の向上は、テスト作成の作業に
失われてしまいました。作成したテストの多くは、Javaであれば不必要なものでした。テストの大半は、
リファクタリングによってメソッド名やパラメータの数を変更した際に、呼び出し元が
正しく変更されているかを確認するためのものでした。
また、Rubyでもチームメンバーが2名から4名であれば、メンバー間のコミュニケーションは
非常にスムーズでした。しかし新しいメンバーをチームに参加せせようとすると、
これまでチームで培ってきたノウハウを新しいメンバーにうまく伝えることが出来なかったのです。
0153デフォルトの名無しさん
2012/06/07(木) 00:38:15.04実際昔は、C++はC言語に変換されていた。
0154デフォルトの名無しさん
2012/06/07(木) 00:39:53.68関数型言語に変換するのは難しいだろうね。
関数型言語は、手続き型言語に変換しやすだろう。
その言語はおそらく機能的に劣ってる。
0155デフォルトの名無しさん
2012/06/07(木) 00:58:13.33変換されてたけど、簡単じゃないよ。
びよーんすっぽすっぽ先生が書いてるけど、cfrontという実装があるから
というのを「簡単に変換できる」と思うのは、よくある誤解。
>>154 の論理に従うと、あらゆる言語は機械語に変換できるから、
あらゆる言語は同じくらい劣っている、ということになるな。
0156デフォルトの名無しさん
2012/06/07(木) 00:58:48.85じゃあお前は、何から何が簡単だと思うんだ?
0157デフォルトの名無しさん
2012/06/07(木) 04:11:50.80なぜなら、韓国語は日本語にない機能を使って記述されるからである
ゆえに、日本語は機能的に劣っている
0158デフォルトの名無しさん
2012/06/07(木) 06:52:10.60Cでオブジェクト指向プログラミングができる人なら、C++ -> C は簡単。
0159デフォルトの名無しさん
2012/06/07(木) 07:02:02.30よく韓国人に「日本語でおk」ってレスをされるw
0160デフォルトの名無しさん
2012/06/07(木) 07:21:22.18例外は?RAIIは?テンプレートはどうすんの?
0161デフォルトの名無しさん
2012/06/07(木) 07:36:19.42コンパイラが実装しやすい言語は機能が少ないってことだろ
0162デフォルトの名無しさん
2012/06/07(木) 08:24:38.11理解できない機能はカウントされないから
「理解できない機能が多い」という事実を「機能が少ない」と認識してしまう
0163デフォルトの名無しさん
2012/06/07(木) 08:42:53.74例外は戻り値(引数)を使う方法で機械的に変換可能だし、
RAIIは単に処理を割り込ませればいいだけ。
テンプレートはただのマクロにすぎない。
ある言語からある言語への変換の話は
元の言語が何かは全く関係なく、
変換後の言語が、手続き的に記述できる言語ならなんでもいい。
副作用が簡単に記述できない言語には変換しにくい。
0164デフォルトの名無しさん
2012/06/07(木) 11:05:34.740165デフォルトの名無しさん
2012/06/07(木) 11:07:00.19思い込んでるのかな、このJava厨は。
だったら、自分がHotSpot VMの実装についてどれだけ理解しているか、
考えてみればいい。
0166デフォルトの名無しさん
2012/06/07(木) 11:22:25.43今の話の流れはC++っすよw
0167デフォルトの名無しさん
2012/06/07(木) 12:40:58.41一行目と三行目の間に論理の飛躍というか崩壊があるんだが?
0168デフォルトの名無しさん
2012/06/07(木) 13:27:10.03157と同じ主張のプログラミング言語版が少し上にあるわけだが?
そいつに言えよ
0169デフォルトの名無しさん
2012/06/07(木) 13:59:00.23A言語がB言語に変換し易い ⇒ A言語は機能的に劣ってる。
A言語は機能的に劣っていない ⇒ A言語がB言語に変換しがたい。
正しく使うと
日本語は韓国語に変換しがたい。
なぜなら、日本語は機能的に劣っていないからである。
0170デフォルトの名無しさん
2012/06/07(木) 14:25:04.01ネトウヨはニュー速にでもいけ
0171デフォルトの名無しさん
2012/06/07(木) 14:34:30.340172デフォルトの名無しさん
2012/06/07(木) 15:01:46.220173デフォルトの名無しさん
2012/06/07(木) 16:02:35.66「ある言語からある言語への変換の話は 元の言語が何かは全く関係なく、(>>163)」が
Java厨の頭の中では矛盾無く両立するわけ?
0174デフォルトの名無しさん
2012/06/07(木) 16:06:07.23>だから異なるパラダイムの言語間での変換は難しいし、
これが正しいなら、
>もし「自分の使ってる言語は他言語に変換し易い」と感じるのならば、
>その言語はおそらく機能的に劣ってる。
じゃなくて
>その言語はおそらくパラダイムに大きな違いが無い
だろ?
0175デフォルトの名無しさん
2012/06/07(木) 16:40:38.07Java ⇒ Ruby は簡単
Ruby ⇒ Java は困難
なぜならクロージャもダックタイピングも無いJavaは機能的に劣ってるから
RubyのところはSmalltalkでもPythonでも同じだよ
0176デフォルトの名無しさん
2012/06/07(木) 18:22:53.390177デフォルトの名無しさん
2012/06/07(木) 19:47:29.39機能は関係ないだろ
タイプセーフでコンパイラが型がわかるから別の言語に変換できるんだろ
機能が違ったら変換できないなんていう理論は、
特定のロジックをかけないプログラミングがあるといってるようなもんだ
意味がわからない。
0178デフォルトの名無しさん
2012/06/07(木) 20:03:31.59おいおい、同じロジックが原理的に書けるなら
簡潔に書けるか冗長にしか書けないかの違いは無視できるってか?
0179デフォルトの名無しさん
2012/06/07(木) 20:17:09.81入力文字数だけみて開発の生産性を語るバカがおおくて驚く。
高機能なIDEなしに、効率よく開発できるわけがないってのに
コードの短さ至上主義の宗教がRuby
>冗長にしか書けないかの違いは無視できるってか?
もっさりなのは無視できるってか?w
0180デフォルトの名無しさん
2012/06/07(木) 20:35:43.40みんなが簡単にクロージャ生成して
メソッドの引数に渡したり戻り値で返したりしてるとき、
Java厨だけはしこしこインターフェース定義して
型書いてんでしょ?馬鹿じゃね?
0181デフォルトの名無しさん
2012/06/07(木) 20:57:40.82JavaやC#の文句言うのは
まともな速度でうごくプログラムかけるようになってからにしろよな
Rubyでは一生無理だろうがw
0182デフォルトの名無しさん
2012/06/07(木) 21:38:22.99あれではダメというなら、処理系書くやつが悶絶しながら実装することになる
0183デフォルトの名無しさん
2012/06/07(木) 21:39:37.84順調にゴミ化していってるな
0184デフォルトの名無しさん
2012/06/07(木) 22:53:09.06開発効率も実行効率も良いんだが、
これって複数の言語を使える事が最低条件だからなー。
単一言語しか使いこなせないボンクラにはJavaがお似合い。
0185デフォルトの名無しさん
2012/06/07(木) 22:54:18.86> 同じオブジェクト指向パラダイムでも
>
> Java ⇒ Ruby は簡単
> Ruby ⇒ Java は困難
>
> なぜならクロージャもダックタイピングも無いJavaは機能的に劣ってるから
> RubyのところはSmalltalkでもPythonでも同じだよ
ダックタイピングなんてリフレクションで簡単に実装できる。
0186デフォルトの名無しさん
2012/06/07(木) 23:01:39.79Javaにクロージャーがないと何が出来ないと思ってる?
無名クラスでできないことを5つあげてみよ。
0187デフォルトの名無しさん
2012/06/07(木) 23:03:39.45小規模使い捨てスクリプトなら動的言語の圧勝。
これでいいじゃんか?
公平な結果だろ。
0188デフォルトの名無しさん
2012/06/07(木) 23:04:38.25イテレータがRubyだけのものと思っている奴もいたww
まつもと氏も各所でRubyは開発の効率がいいとか嘘ついてるから
初心者はかんたんにだまされてしまう
0189デフォルトの名無しさん
2012/06/07(木) 23:12:36.390190デフォルトの名無しさん
2012/06/08(金) 06:55:53.335つも上げる必要無いよ
「簡潔なコードが書けない」これがJava最大の欠点
Java厨はコードの簡潔さが重要でないかのように言うけど
本当に重要じゃなくて、無名クラスで問題ないなら
Java8でクロージャを入れようなんて議論してない
0191デフォルトの名無しさん
2012/06/08(金) 08:09:50.16おまえがコードの短さしか見てないだけだろw
そんなに簡潔なコードがかけるのなら、
なぜ実行速度が速くできないんですかwww
裏で冗長なコードが走ってるから遅いんだろ
RubyはJavaの11分の一以下のスピードだ
静的な言語の足元にも及ばない。
PHPやPythonの半分以下の速度しかでないのはどうするんだ
0192デフォルトの名無しさん
2012/06/08(金) 08:30:46.860193デフォルトの名無しさん
2012/06/08(金) 08:37:04.54お前の言うことからはっきりしたのは2点
無名クラスはクロージャの代わりになる。
Java8で簡潔なコードが書けるようになる。
0194デフォルトの名無しさん
2012/06/08(金) 08:37:15.91Pythonのreduce()やRubyのinject()でもいいけど
勿論あらゆる型に対して使えるようにジェネリクスは必須ね
0195デフォルトの名無しさん
2012/06/08(金) 08:40:58.88ここで議論されてる
http://code.google.com/p/guava-libraries/issues/detail?id=218
0196デフォルトの名無しさん
2012/06/08(金) 12:27:22.02import java.util.*;
interface function<T> { public void func (T x); }
abstract class Foo { int n; abstract int foo(); }
class Bar extends Foo { Bar (int x) { n = x; } int foo() { return n + 1; } }
class Baz extends Foo { Baz (int x) { n = x; } int foo() { return n * 2; } }
class Main {
public static void runClosure (function<Integer> f) {
for (int i = 0; i < 1; i++) { f.func(i); }
}
public static void main (String args[]) {
final Foo[] x = new Bar[]{ new Bar(0) };
runClosure(new function<Integer>() {
public void func(Integer n) {
System.out.println(x[0].foo());
x[0] = n % 2 == 0 ? new Bar(x[0].foo()) : new Baz(x[0].foo());
}
});
}
}
0197デフォルトの名無しさん
2012/06/08(金) 12:55:22.71Javaウンコすぎるwww
0198デフォルトの名無しさん
2012/06/08(金) 12:58:34.84つまり静的と動的の問題ではなくオブジェクトの問題だ
0199デフォルトの名無しさん
2012/06/08(金) 14:05:54.900200デフォルトの名無しさん
2012/06/08(金) 16:16:30.630201デフォルトの名無しさん
2012/06/08(金) 19:53:36.64グダグダと型を書く必要があって
コンパイル時チェックまでしたあげくに
実行時型エラーで落ちるクソ言語Java
0202デフォルトの名無しさん
2012/06/08(金) 20:01:34.38わかります
0203デフォルトの名無しさん
2012/06/08(金) 23:21:50.19これを止めるには時間の概念や代入の概念をガラガラポンしないといけないですね
0204デフォルトの名無しさん
2012/06/08(金) 23:48:59.63でも人間を信用しないなら言語を変えるしかない
0205デフォルトの名無しさん
2012/06/09(土) 00:36:57.48なんでそんなに冗長に書いてるの?
わざとわかりにくく書いてない?
Javaでクロージャと言ったらこうでしょ。
http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Ordering.html
Ordering<String> byLengthOrdering = new Ordering<String>() {
public int compare(String left, String right) {
return Ints.compare(left.length(), right.length());
}
};
0206デフォルトの名無しさん
2012/06/09(土) 00:43:17.57Ordering<String> byLengthOrdering = new Ordering<>() {
public int compare(String left, String right) {
return Ints.compare(left.length(), right.length());
}
};
0207デフォルトの名無しさん
2012/06/09(土) 00:50:20.81これぐらいの量なら充分小さといえるね。
しかし、書く人によってここまで
説明の量が違うとはw
0208デフォルトの名無しさん
2012/06/09(土) 00:53:05.16http://japan.internet.com/developer/20080603/26.html
0209デフォルトの名無しさん
2012/06/09(土) 02:03:14.73>>206は型推論で少し短くなってるけど。
それよりも>>196は型安全じゃなくてループ回数を増やすと
例外で落ちる。
0210デフォルトの名無しさん
2012/06/09(土) 02:16:15.17> クロージャのところのコード量は>>196も>>205も変わらん。
うん。知ってる。
だからこそ短く書いてみせた。
これでJavaはコードが長いと勘違いしている人が
単に読んでないだけだってあぶり出されるw
0211デフォルトの名無しさん
2012/06/09(土) 02:21:30.41Javaの無名クラスで出来ると言いたいんじゃないかと。
クロージャの重要な特徴のひとつだし。
>>196が長いのは
・メソッドfooの振舞いをポリモーフィズムで入れ替え可能
・クロージャは呼び出すたびに結果が違う(副作用有り)
・クロージャが外部スコープの変数を書き換え
と色々やってるからで、意外と他の言語で書いても長くなりそうだ。
副作用が在るから関数型でもすっきり書けないし。
0212デフォルトの名無しさん
2012/06/09(土) 02:34:11.80例えばPythonで同じコード書いたら凄く短い。
byLengthOrdering = lambda x,y: cmp(len(x), len(y))
だけど、>>196は代入があるからPythonのラムダじゃ(たぶん)書けない。
0213デフォルトの名無しさん
2012/06/09(土) 03:01:57.68空気は読まない。
http://ideone.com/p8v3x
0214デフォルトの名無しさん
2012/06/09(土) 03:23:26.38> 例外で落ちる。
wwwwwwww
0215デフォルトの名無しさん
2012/06/09(土) 06:36:08.450216デフォルトの名無しさん
2012/06/09(土) 07:47:05.58ホントにJavaの型チェックはゴミだな
http://ideone.com/H3cXr
0217デフォルトの名無しさん
2012/06/09(土) 08:15:48.97java5くらいの時点で入れとけよって思うよ
ジェネリクス使用クラスを可変長引数にしたときのアレも
さっさとどうにかして欲しい
でも静的言語の方が気が楽
>>90の静的手続き型言語:大規模ドカタ開発に同意だわ
経験浅い要員にJavaScriptとかやらせるとこっちが死ぬる
0218デフォルトの名無しさん
2012/06/09(土) 08:30:21.51>>206で短く書けてると思ってる事に一番驚いたわwww
0219デフォルトの名無しさん
2012/06/09(土) 09:08:38.63sortBy ((.length).(compare.length)) xs
とか
sorted(xs, cmp=lambda x,y: cmp(len(x),len(y)))
のように使ってるわけよ
上のコードのクロージャのところに>>206のような冗長なコードを
ぶち込んだら可読性落ち過ぎだろ
高機能なIDEがあればカバーできるレベルの話じゃないわ
0220デフォルトの名無しさん
2012/06/09(土) 09:25:47.31Java8までクロージャの機能がないんだから、
コードの長短を比較するのはナンセンスだろ。
>>219
多少、短くかけても実行時に遅かったら意味がないだろ。
冗長とバカにしてるそのコードよりもスクリプト言語は遅い。
0221デフォルトの名無しさん
2012/06/09(土) 09:46:37.41Collections.sort(ls,
new Comparator<T>(){
public int compare(T a, T b) {
return a.length() - b.length();
}
}
);
が
Collections.sort(ls,
(a, b) -> a.length() - b.length()
);
と書ける
0222デフォルトの名無しさん
2012/06/09(土) 10:41:28.50異なる型のラムダ式毎にSAM Typeを定義する必要があるんでしょう?
0223デフォルトの名無しさん
2012/06/09(土) 10:51:52.64同じく話の流れを無視してHaskellで書いてみた。
http://ideone.com/72ySa
0224デフォルトの名無しさん
2012/06/09(土) 11:05:34.15SingleAbstractSingleArgument< A, SingleAbstractSingleArgument< B, C > >
0225デフォルトの名無しさん
2012/06/09(土) 11:24:00.45既存interfaceやjava.util.functionsで対応出来ないものはそうなる
ただの構文糖衣だし
0226デフォルトの名無しさん
2012/06/09(土) 11:29:58.02> 異なる型のラムダ式毎にSAM Typeを定義する必要があるんでしょう?
今まで何種類の「異なる型のラムダ式」を書いたことがある?
ラムダ式ってのその用途から、引数の型は単純で
ライブラリとGenericsを使えば、すでに定義済みであることが多いよね。
そこ、気にするところじゃないよ。
0227デフォルトの名無しさん
2012/06/09(土) 11:38:01.790228デフォルトの名無しさん
2012/06/09(土) 11:43:11.59引数や戻り値はあんまり必要ないしね。
必要な場合っていうのは例えば、
Collections.sort(ls, ← これのこと。
コレクションが渡された時にそのコレクション内の項目ごとに
クロージャーを呼び出すってときに、引数を伴ったクロージャが必要になる。
で、項目一つを引数に呼び出すとき(map等)は、クロージャの引数は一つ
で、項目二つを引数に呼び出すとき(compare等)は、クロージャの引数は二つ
引数三つ、四つもどこかのライブラリで定義されていたと思うが忘れた。
型の違いはGenericsで吸収できるし、まあ要するに、
異なる型のラムダ式毎にSAM Typeを定義する必要があるということは
気にすることではないということ。
0229デフォルトの名無しさん
2012/06/09(土) 11:43:55.67誰もそんな事言ってないよ。
0230デフォルトの名無しさん
2012/06/09(土) 12:04:21.11え?ダサい?だってJavaだもん
http://gee.cs.oswego.edu/dl/jsr166/dist/extra166ydocs/extra166y/Ops.html
0231デフォルトの名無しさん
2012/06/09(土) 12:07:26.43バカですか? genericsで数個に統一できます。
バカのみがJavaをダサいと言う。論破完了w
0232デフォルトの名無しさん
2012/06/09(土) 12:10:19.67馬鹿って言ったら可哀想だよ。
本気で言っているとしたら、馬鹿だけどね。あはははは。
0233デフォルトの名無しさん
2012/06/09(土) 12:30:43.420234デフォルトの名無しさん
2012/06/09(土) 12:33:17.01C++のテンプレートやC#のジェネリクスとは異なるJavaのジェネリクスで
コストに折り合いを付けるならこうなる
0235デフォルトの名無しさん
2012/06/09(土) 12:34:24.29無理しなくていいよw
そんなこといってもJava使いには見えないからw
0236デフォルトの名無しさん
2012/06/09(土) 12:37:25.81馬鹿が自分定義のJavaはこうだって言ってるだけ。
誰も使ってないものを持ってきてもな。
それじゃJavaを貶められないよ。
0237デフォルトの名無しさん
2012/06/09(土) 12:39:48.04馬鹿過ぎて痛々しいレベルだわ
>>234がコスト持ち出してフォロー入れてる時点で気付けよ
0238デフォルトの名無しさん
2012/06/09(土) 12:42:29.51恥ずかしい奴だ
0239デフォルトの名無しさん
2012/06/09(土) 12:45:45.85比べるならC#
0240デフォルトの名無しさん
2012/06/09(土) 12:48:23.250241デフォルトの名無しさん
2012/06/09(土) 12:49:41.01・オートボクシングによるプリミティブ型からオブジェクト型への変換は
コスト的に許容できないケースがある
という理由によって>>230の定義になってるわけだが
>>231>>232>>235>>236はプリミティブ型にもジェネリクスが使えると思ってるアホ
0242デフォルトの名無しさん
2012/06/09(土) 12:56:45.10オートボクシングを使えばいい。
コストに関して言えば、オートボクシングを使ったとしても
動的言語よりも速い。
論破完了www
0243デフォルトの名無しさん
2012/06/09(土) 12:58:55.56・Javaはヌルポあるし、それ以外でも実行時型エラーを簡単に起こせるよ!
・ラムダ式の糖衣構文はJava8まで待ってね!今はJava7だよ(ドカタ開発では未だにJava4の場合すら……)
・プログラマのレベルは底辺だよ!まともなプログラマはScala使ってるし!
というわけで、静的型付け言語の比較するときにJavaを使うのは辞めましょう
弱い者いじめは良くない事ですよw
0244デフォルトの名無しさん
2012/06/09(土) 13:00:28.87実行時にしかわからないエラーがあるのだから
当たり前の話。
実行時にしかわからないエラーってのは
対応に時間が掛かる。
だから静的に分かるようにし
減らすってのが重要なんだよ。
お前は論点がわかっていない。
0245234
2012/06/09(土) 13:02:53.34http://ideone.com/P5SxK
>sum=1774919424 time=275msec
>sum=1774919424 time=3984msec
定義側はジェネリクスを使った方が楽になるが
使用側のコーディングコスト及び実行コストが高くなる
そして都度定義するより標準で>>230のような定義があった方が便利
0246デフォルトの名無しさん
2012/06/09(土) 13:06:17.18>オートボクシングを使ったとしても、動的言語よりも速い
Javaの中の話なのに完全に意味不明。
0247デフォルトの名無しさん
2012/06/09(土) 13:11:32.82それはJavaは他の言語と比べて
速いのは当たり前ということか。
0248デフォルトの名無しさん
2012/06/09(土) 13:12:51.80Javaが他と比べてダサいって話なんだから
Javaの中の話ではない。
よってオートボクシングを使えばぜんぜんダサくないし、
それでも他の動的言語よりも速い。
0249デフォルトの名無しさん
2012/06/09(土) 13:17:33.99老害乙
0250デフォルトの名無しさん
2012/06/09(土) 13:30:27.44>>234-237 >>241は>>230のリンク先の設計意図である
プリミティブとジェネリクス&オートボクシングの話
他言語は関係ない
0251デフォルトの名無しさん
2012/06/09(土) 13:35:55.05スレタイ見ろよ。
0252デフォルトの名無しさん
2012/06/09(土) 13:39:43.75■ このスレッドは過去ログ倉庫に格納されています