静的型付け言語の潜在開発生産性は今の100倍 ×4
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2013/11/04(月) 22:36:14.15これが生産性を上げる最大の方法。
コンピュータは間違わない、同じ事を何度も高速に行える。
その為に、コンピュータがコードの意味を正確に
認識できる方法が必要。実行しないとわからないことは
コンピュータは認識できない。
すなわち静的型付け言語であれば、実行しなくてもわかるので
コンピュータが理解できる。そうすれば様々な
コンピュータの高度な情報支援が得られる。
コンピュータのバックアップを受け、人間の生産性は
限りなく向上する。
前スレ
静的型付け言語の潜在開発生産性は今の100倍 ×3
http://toro.2ch.net/test/read.cgi/tech/1382656209/
0232デフォルトの名無しさん
2013/11/10(日) 11:09:44.28多いと認めるんだろう?
ならお前は同じことを言っている。
0233デフォルトの名無しさん
2013/11/10(日) 11:11:03.87http://www.slideshare.net/dynamis/try-firefox-os/16
まだまだネイティブまでは遠い
0234デフォルトの名無しさん
2013/11/10(日) 11:11:04.61そこの認識も狭い。
0235デフォルトの名無しさん
2013/11/10(日) 11:13:27.910236デフォルトの名無しさん
2013/11/10(日) 11:16:07.720237デフォルトの名無しさん
2013/11/10(日) 11:16:30.62それでもCの2倍遅くて、
C#と同じくらいなんだね
0238デフォルトの名無しさん
2013/11/10(日) 11:18:36.32副作用のとらえかたが間違っている。
0239デフォルトの名無しさん
2013/11/10(日) 11:19:18.310240デフォルトの名無しさん
2013/11/10(日) 11:19:57.930241デフォルトの名無しさん
2013/11/10(日) 11:21:12.23その関数が終わるまで延期されるのと
生メモリを触ることでGCの影響を受けなくすることもできるというだけです
0242デフォルトの名無しさん
2013/11/10(日) 11:24:29.56間違ってるというのなら
間違っているという証明をした方がいいね。
0243デフォルトの名無しさん
2013/11/10(日) 11:25:30.14つまり、その関数がアプリ終了まで
ずっと動いていれば、GCの影響が
全くないってこと?
0244デフォルトの名無しさん
2013/11/10(日) 11:25:43.380245デフォルトの名無しさん
2013/11/10(日) 11:28:16.12次のページ見てもらえれば分かるけど
asm.jsそのものは数割遅い程度でNaClなんかといい勝負
でもasm.jsでは数値計算しか出来ないし
全部をasm.jsで書くのは不可能だからね
だから全体では概ね対応環境で2倍、
直接対応はしてないけどいろいろ頑張ってるChromeで3倍くらいになる
0246デフォルトの名無しさん
2013/11/10(日) 11:28:52.69証明できないくせに蒸し返すとか
それ単に悔しかっただけだろw
0247デフォルトの名無しさん
2013/11/10(日) 11:32:59.04古臭い、ではなく、狭苦しい。
ほとんど全部だよ。
> インスタンスメソッドというのは、インスタンスの内容を変更するもの。
> データが主であり、それを変更するためにメソッドを用意する。
この見識があまりに狭い。
オブジェクトというのはある役割を果たすためのものだ。
データが主?それって目的と手段がごっちゃになってる。
> インスタンスの内容を変更しないのであれば、それはインスタンスメソッドにする意味が無い。
> インスタンスメソッドはインスタンスを変更するのが目的であり、それはつまり副作用を目的としている。
インスタンスの内容に「基づいて」役割を果たせばよいのであって、内容を変更する必要はない。
>>128-129はオブジェクト自身に対するメソッド発行しか念頭にないんじゃないかと疑う。
0248デフォルトの名無しさん
2013/11/10(日) 11:34:04.21asm.jsで作った関数はJS層にエクスポートされてるネイティブ関数と同じように振る舞います
JS層からasmネイティブ関数を呼び、その返り値を受け取って
処理を続けるという形になるので、副作用の実質出来ないasm.jsの部分がずっと働くということはありません
また、GCが働かない範囲では数値や元々メモリを確保する役割のバッファへの書き込みしかしないので
いたずらにメモリを消費するということはありません
0249デフォルトの名無しさん
2013/11/10(日) 11:38:37.21「物」って意味だけどね。
役割果たすための「物」
さて物ってなに?
物以外ってなに?
0250デフォルトの名無しさん
2013/11/10(日) 11:39:43.12メッセージを物に対して送るとき、
反応するのは、送り先の物である。
これがオブジェクト指向の原則。
0251デフォルトの名無しさん
2013/11/10(日) 11:41:04.98あとOOは対象指向と言うと思う。
0252デフォルトの名無しさん
2013/11/10(日) 11:42:40.69オブジェクトに対するッセージだってことがわかるよ。
なぜそのオブジェクトに対してメッセージを送るのか?
それはそのオブジェクトに送らなければいけない
理由があるから。
0253デフォルトの名無しさん
2013/11/10(日) 11:45:36.39それはそのオブジェクトに対して
メッセージを送る必要がないということを意味する。
そういうメソッドは違うクラスにあったとしても
問題なく動くだろう。
その場合、クラスは単にメソッドの種類をグループ化する
名前空間として使われているだけにすぎない。
名前空間はクラスではない。
0254デフォルトの名無しさん
2013/11/10(日) 11:48:34.10だからそういう議論は必ずしも成り立たないんだよ。
0255デフォルトの名無しさん
2013/11/10(日) 11:53:14.17オブジェクトから関数が生えてるように見えたらメソッドだ
0256デフォルトの名無しさん
2013/11/10(日) 11:53:37.45何で変化する必要がある?
オブジェクトは自身の情報を持っている。
その情報に「基づいて」、そのオブジェクトが役割を果たす。
その情報はそのオブジェクトだけが持っているかもしれない。
その場合他のオブジェクトはその役割を担えない。
別に変化する必要はないよね。
0257デフォルトの名無しさん
2013/11/10(日) 11:53:56.57static int a=0;
static int min(int b){
if(a<b){a=b;}
return a;
}
}
じゃあめんどくさいけど反証しとく。
staticだからといって内部状態がないわけじゃない
0258デフォルトの名無しさん
2013/11/10(日) 11:55:49.870259デフォルトの名無しさん
2013/11/10(日) 12:07:19.86そういうのが「狭い」っていうんだよ。
0260デフォルトの名無しさん
2013/11/10(日) 12:08:22.47関数にこれが対象ですよとオブジェクトを送るんだと思うんだが
0261デフォルトの名無しさん
2013/11/10(日) 12:13:39.080262デフォルトの名無しさん
2013/11/10(日) 12:17:27.560263デフォルトの名無しさん
2013/11/10(日) 12:22:44.41class Postman {
void sendMail() {
}
}
Postmanオブジェクトにメイルを送ってというメッセージを送るときは
次のようになる。
Postman p = new Postman();
p.sendMail();
メッセージを送ることそれすなわちメソッドを呼ぶことなり。
0264デフォルトの名無しさん
2013/11/10(日) 12:25:09.82歴史的に先行するものが「本来」だというのは、それこそ狭い見識ですね。
0265デフォルトの名無しさん
2013/11/10(日) 12:26:39.64それだと単なる見る立ち位置の問題じゃない
もっと深い話ないの?
0266デフォルトの名無しさん
2013/11/10(日) 12:28:46.79Σd(ゝ∀・) ないよ!
0267デフォルトの名無しさん
2013/11/10(日) 12:29:26.40なるほど
ラブリーフォースアローみたいなもんですか
0268デフォルトの名無しさん
2013/11/10(日) 12:32:00.30どんなメッセージをどんなオブジェクトに送っても構わない
まあオブジェクトにレシーバーがなかったらエラーになるけど
0269デフォルトの名無しさん
2013/11/10(日) 12:42:10.16getter/setterのgetterがそうだろ。
メソッドはオブジェクトを変化されるか、
もしくはオブジェクトの状態を取得するかのどちらか。
さすがにオブジェクトに無関係な処理は
つまり引数と戻り値が全てのメソッドは
メソッドにする意味は無いけどね。
0270デフォルトの名無しさん
2013/11/10(日) 12:42:46.07http://d.hatena.ne.jp/perlcodesample/20130227/1361928810
お前らこれについてはどう思ってるわけ?その通りだと思う?
0271デフォルトの名無しさん
2013/11/10(日) 12:42:54.60> そういうのが「狭い」っていうんだよ。
「狭い」というのなら、
お前の「広い」を言えよ。
0272デフォルトの名無しさん
2013/11/10(日) 12:43:55.26そこのブログに書いてある
反論のつもりだと思ってるよ。
0273デフォルトの名無しさん
2013/11/10(日) 12:46:45.87それよりmyってなんですか
0274デフォルトの名無しさん
2013/11/10(日) 12:52:06.72ローカル変数
0275デフォルトの名無しさん
2013/11/10(日) 12:55:02.86気持ち悪いという感覚を持つべきだ
0276デフォルトの名無しさん
2013/11/10(日) 12:59:32.15>メッセージパッシングの場合メッセージとオブジェクトは互いに独立してるってだけ
メソッドとオブジェクトが独立してるのもあるぞ
プロトタイプベース言語とか
それと似てるってことか?
0277デフォルトの名無しさん
2013/11/10(日) 13:00:58.010278デフォルトの名無しさん
2013/11/10(日) 13:04:50.91数値型の種類とか、オブジェクトのクラスの種類まで決め打たれるの?
0279デフォルトの名無しさん
2013/11/10(日) 13:08:26.89型は「型にはめる」ことでやりやすくしようって試みだから
型にはめるのを良しとしなければその通り
それから、人間のためと同じかそれ以上にコンパイラのための試みだと思うから
そんなん気にしたくねーよって主張なら型がない方のメリットが上回ってくると思う
この辺は利便性が云々より環境と性格だと思う
0280デフォルトの名無しさん
2013/11/10(日) 13:15:09.40オブジェクトから独立したメソッドというのがよくわからないけど
プロトタイプベース言語そのものだったりそれに似た機構を持っていることが多いと思う
0281デフォルトの名無しさん
2013/11/10(日) 13:15:31.06> ソッドはオブジェクトを変化されるか、もしくはオブジェクトの状態を取得するかのどちらか。
オブジェクトの状態を参照して(利用して)何かするんであって、取得する必要は必ずしもない。
getterは本当に必要なのものだけに限定した方がいい。
0282デフォルトの名無しさん
2013/11/10(日) 13:20:31.29ハス公キモいよねぇ〜
letくらいつけろよ、バカ!
0283デフォルトの名無しさん
2013/11/10(日) 13:23:56.10なにいってんの?
オブジェクトの状態を変えないが、
メソッドである必要があるものを言っただけだろ。
0284デフォルトの名無しさん
2013/11/10(日) 13:25:49.11そうだね
0285デフォルトの名無しさん
2013/11/10(日) 13:27:59.590286デフォルトの名無しさん
2013/11/10(日) 13:29:01.44>引数と戻り値が全てのメソッドはメソッドにする意味は無いけどね。
こういうメソッドは意味無いこともない。
private int min(int a,int b){
return a<b?a:b;
}
0287デフォルトの名無しさん
2013/11/10(日) 13:31:02.250288デフォルトの名無しさん
2013/11/10(日) 13:31:40.48代入がある劣った言語と一緒にされちゃ困る
0289デフォルトの名無しさん
2013/11/10(日) 13:32:15.70>>269であんたは
>メソッドはオブジェクトを変化されるか、「もしくは」オブジェクトの状態を取得するかのどちらか。
と言っているが、そのどちらでもない、つまりオブジェクトを変化させないしgetterでもない
メソッドもあると言っている。
それがオブジェクトの状態を参照して(利用して)何かするメソッドだということ。
0290デフォルトの名無しさん
2013/11/10(日) 13:32:52.46それは意味が無い。
まずスコープがprivateである。
これはユニットテストが出来ないことを意味する。
ユニットテストをすることを考えると、
publicにした方がいい。
publicにすることで見えてくるもの。
それはこのクラスにあるべき機能なのかということ。
明らかに特定のクラスに依存したコードでないのだから、
簡単に移動できることがわかる。
つまりそのコードはクラスとは無関係のコードということだ。
0291デフォルトの名無しさん
2013/11/10(日) 13:33:12.250292デフォルトの名無しさん
2013/11/10(日) 13:33:24.94> private int min(int a,int b){
> return a<b?a:b;
> }
それはstaticで十分だということじゃね?
0293デフォルトの名無しさん
2013/11/10(日) 13:34:13.95うん、そして、引数と戻り値だけで完結するものは、
メソッドではないとも言ってる。
クラスは単に名前空間として利用しているだけ。
引数と戻り値だけで完結するものは
素晴らしいよね。
0294デフォルトの名無しさん
2013/11/10(日) 13:37:04.76JavaScriptのことだなそれ
0295デフォルトの名無しさん
2013/11/10(日) 13:41:18.94違うけど? どうしてそう思ったの?
0296デフォルトの名無しさん
2013/11/10(日) 13:42:02.03Math exp([] (double x) { return exp_impl(X);});
double y = exp(1.5);
0297デフォルトの名無しさん
2013/11/10(日) 13:43:10.73Mathクラスのインスタンスだと "捉えれば" いいのだ。
って言ってる時点でな・・・。
0298デフォルトの名無しさん
2013/11/10(日) 13:44:51.10もしかして、メソッド内で自身の状態を参照することを「オブジェクトの状態を取得」と表現してんの?
「オブジェクトの状態を取得」と言えば、普通外部に公開するgetterのことを想像するが。
0299デフォルトの名無しさん
2013/11/10(日) 13:45:42.02Intergerクラスのメソッドであるべきじゃないの?
Integer a = 1;
Integer b = 2;
Integer c = a.min(b);
みたいにさ。
0300デフォルトの名無しさん
2013/11/10(日) 13:47:47.67何が言いたいのか?
そりゃ実際の数学では個々の関数はインスタンスと考えられるけど、プログラム言語でも同様に実装しろと?
0301デフォルトの名無しさん
2013/11/10(日) 13:52:33.44minの意味を考えろ。属するクラスが全然違う。
Intergerクラスのメソッドなんかじゃない。
0302デフォルトの名無しさん
2013/11/10(日) 13:55:16.15オブジェクトが直接持ってる
要はobj.method()と出来るものはなんでも
そのオブジェクトのメソッドと呼んだりするな
0303デフォルトの名無しさん
2013/11/10(日) 13:58:30.10演算子を内部的にメソッドであると解釈する考え方もあるようですが、
もうそろそろ、演算子とメソッドの根本的な違いを
人類が認識するべき時かもしれませんね。
演算子とメソッドは全く違うもの。そしてminは演算子。
a 演算子 b があったとき、これをa.演算子(b) と解釈するのは間違い。
演算子とはaやbのメソッドではなく、aとbを引数にする関数
演算子(a, b) つまり関数(a, b)と解釈するのが正しい。
aとbを対等に扱うものはメソッドではなく関数で実装する。
メソッドは特定のオブジェクトに対して処理をするものでなければならない。
もし無理やりminをメソッドにするならば、a.min(b) はaよりbが小さければ、
aの中身をbに置き換えるものでなければならない。
演算子を関数として解釈するならば、三項演算子
a ? b : c を if(a, b, c) と捉えることも簡単でしょう。
四項演算子、五項演算子ってのも作ろうと思えば作れるでしょうね。
Integer i, String s の演算子+をIntegerのメソッドにするか、Stringのメソッドにするのか
悩む必要もありません。演算子=関数ははクラスとは独立しているので、
関数+(Integer i, String s) を実装すればいいだけです。
0304デフォルトの名無しさん
2013/11/10(日) 14:00:40.68a + b
↓
a.add(b)
とされるし区別ないよ^^;
0305デフォルトの名無しさん
2013/11/10(日) 14:01:39.91これほんと違和感あるわw
a + b
↓
add (a, b)
と解釈するほうが
よっぽどわかりやすいだろ。
0306デフォルトの名無しさん
2013/11/10(日) 14:05:55.970307デフォルトの名無しさん
2013/11/10(日) 14:08:27.76自機が爆弾に当たれば爆発する、
自機が仲間にあたっても何も起こらない。
自機がパワーアップアイテムに当たればパワーアップする
っていうのを実装するとき、
この処理ををどこに実装するかって問題がある。
自機に実装すればいいと思うが、
そうすると、自機は、爆弾や見方やパワーアップアイテムという
情報を知らないといけない。
つまり外部のクラスに依存してしまうということ。
これを
接触関数(自機、爆弾) {
自機.爆発();
爆弾.爆発();
}
接触関数(自機、パワーアップアイテム) {
自機.パワーアップ();
パワーアップアイテム.消滅();
}
接触関数(自機、仲間) {
なにもしない
}
とできれば、シンプルに実装できる。
0308デフォルトの名無しさん
2013/11/10(日) 14:16:38.13そっかjavascriptってすげーな
0309デフォルトの名無しさん
2013/11/10(日) 14:18:38.49それは関数のオーバーライドで済まそうっていう考えね
関数のオーバーロードが無い言語もあるし、型が緩い言語とかであっても
もっと広く適応できるメソッド的な仕組みで実現しようという試み
前者はまさに「演算子オーバーロード」だけど
後者は特定のタイプに対する演算子の振る舞いを定義するっていう
ちょっと考え方が違う
例えばaを主体について定義するとこうなる
a + b → a.add(b)
b + a → a.radd(b)
0310デフォルトの名無しさん
2013/11/10(日) 14:19:43.71見てわかるようにオーバーロードができる言語の話で
できないJavaScriptの話なんかしてないけど、
頭ダイジョーブ?
0311デフォルトの名無しさん
2013/11/10(日) 14:21:28.54a + b → a.add(b) ・・・aにbを加算する
b + a → b.add(a) ・・・bにaを加算する
普通は
a + b ・・・ aとbを加算したものを返す
0312デフォルトの名無しさん
2013/11/10(日) 14:23:14.38リストは足すものではありません!
みたいな〜
0313デフォルトの名無しさん
2013/11/10(日) 14:28:15.110314デフォルトの名無しさん
2013/11/10(日) 14:29:55.13動的型付けにはオーバーロードなんてないんですよ!!
0315デフォルトの名無しさん
2013/11/10(日) 14:31:20.430316デフォルトの名無しさん
2013/11/10(日) 14:32:30.24例として 1 + 2 という式を考えてみる
関数型の場合、(>>260が言うように)関数へ 1 と 2 という
整数オブジェクトを送ることが計算である
オブジェクト指向では、1 という整数オブジェクトへ + 2 という
メッセージを送ることが計算である
ここで、+ 2 の"+" は(演算子ではなく)メッセージの種類を示す
識別子であり、セレクタと呼ばれる
また、+ という関数オブジェクトへ整数対 (1, 2) というメッセージを
送るというスタイルでも計算を表現できる
まとめると、オブジェクト指向の中で、後者の関数オブジェクトへ
引数を送るというスタイルに限定したものを関数型と呼ぶ
言い換えると、オブジェクト指向は関数型を包含した計算モデルである
0317デフォルトの名無しさん
2013/11/10(日) 14:32:41.570318デフォルトの名無しさん
2013/11/10(日) 14:33:38.50オーバーロードがなくても型はあるんだから
実行時オーバーロードをスレば良い。
つまり、型みて振り分ければいいだけ。
add(integer a, integer b)で呼ばれたら
add_integer_integer(a, b)に移譲
することだってできるだろう?
0319デフォルトの名無しさん
2013/11/10(日) 14:34:38.35正解!
0320デフォルトの名無しさん
2013/11/10(日) 14:34:55.12オブジェクトはメッセージを受け取れない
受け取れるのは関数とはそういった類のもの
わざわざ難しく考えてるようにしか見えない
0321デフォルトの名無しさん
2013/11/10(日) 14:37:10.00それは変だよ
add_integer_integer(a, b)
という関数書いたら自動で使われるっていうのは
0322デフォルトの名無しさん
2013/11/10(日) 14:37:17.20できるの?具体的のどの言語のこと言ってるの?
0323デフォルトの名無しさん
2013/11/10(日) 14:39:22.51こういうのを手続き型っていうんですよね?
0324デフォルトの名無しさん
2013/11/10(日) 14:41:07.53型名を取得する関数はあるんだから
integerという型名がわかったら、
あとはeval('add_' + name_a + '_' name_b + '()')
を実行するだけじゃねーかw
0325デフォルトの名無しさん
2013/11/10(日) 14:43:01.33めんどっすね。
0326デフォルトの名無しさん
2013/11/10(日) 14:46:51.50call度にeval介するのか
うんうん、初心者にしては頑張ったな
0327デフォルトの名無しさん
2013/11/10(日) 14:47:31.09汎用的な関数で処理できるんだから
あとは1行書けば終わりだよ。
function add(a, b) {
return hogehoge('add', a, b');
}
このhogehoge関数を
作れない人はいないでしょ?
これだけでも出来るかもな
add = function(a, b) { hogehoge('add', a, b') }
さらに
add = createHogeHoge('add');
スタックトレース解析して関数名取得するなら
add = createHogeHoge();
0328デフォルトの名無しさん
2013/11/10(日) 14:48:39.62> call度にeval介するのか
あのー、動的型付け言語ってのは
そういうものなんですけど?
0329デフォルトの名無しさん
2013/11/10(日) 14:50:53.66http://www.slideshare.net/BrendanEich/js-resp/10
0330デフォルトの名無しさん
2013/11/10(日) 14:52:56.45その名前の関数こしらえなきゃならんのでしょ、めんどっすね。
0331デフォルトの名無しさん
2013/11/10(日) 14:54:32.32コスト考えましょうね初心者君
■ このスレッドは過去ログ倉庫に格納されています