トップページ⇒tech
1001コメント355KB

静的型付け言語の潜在開発生産性は今の100倍

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/03/03(日) 18:17:29.51
人間がやっていたことを、コンピュータにやらせる。
これが生産性を上げる最大の方法。
コンピュータは間違わない、同じ事を何度も高速に行える。

その為に、コンピュータがコードの意味を正確に
認識できる方法が必要。実行しないとわからないことは
コンピュータは認識できない。

すなわち静的型付け言語であれば、実行しなくてもわかるので
コンピュータが理解できる。そうすれば様々な
コンピュータの高度な情報支援が得られる。

コンピュータのバックアップを受け、人間の生産性は
限りなく向上する。
0232デフォルトの名無しさん2013/03/17(日) 00:41:34.20
>>229
> ローカルでもレキシカルでもどっちでもいいって、ホントにプログラマの発言かよ。

お前日本語がわからないんじゃね?

この場合は、ローカルとレキシカルの区別は付けなくてもいいとかいう話じゃなくて、
スコープが広い方が影響範囲が大変という話において、
ローカルとレキシカルはどっちも影響範囲は狭いから、
どっちでも大した違いがないって意味だろ。
0233デフォルトの名無しさん2013/03/17(日) 00:42:33.90
>>231
> で、ファイルが違ってもレキシカルに特定できるなら問題ないけど、何か?

ファイルが違っていてレキシカルに特定できる場合って?
具体的なコードでお願い。どの言語でもいいよ。
0234デフォルトの名無しさん2013/03/17(日) 00:48:22.88
>>232>>233
ヒントあげるよ
レキシカルスコープ/ダイナミックスコープ
スコープの広さはぜーんぜん関係ありませーん
0235デフォルトの名無しさん2013/03/17(日) 01:01:18.58
>>234
そんなこと知ってる。
その上で、お前がちゃんと答えを出せるか聞いてる。
0236デフォルトの名無しさん2013/03/17(日) 01:25:42.35
> ローカルでもレキシカルでもいいけど、
> 範囲が狭いなら、それは人力でもなんとかなるんだよね。

> 普通にローカル・レキシカルよりも広いスコープでしょ?
> 分かりやすく言うのなら、修正対象のファイル以外。

> ローカルとレキシカルはどっちも影響範囲は狭いから、


こんだけ馬鹿さらしておきながら

>> スコープの広さはぜーんぜん関係ありませーん
> そんなこと知ってる。

いやー、そりゃ無理すぎでしょ。3アウトですよ。
0237デフォルトの名無しさん2013/03/17(日) 01:56:38.77
Pythonの補完の話になんでいきなりダイナミックスコープが出てくるんだよ。
始末に負えない馬鹿だなこりゃ。
0238デフォルトの名無しさん2013/03/17(日) 02:30:58.24
バカというか単にレキシカルの意味がわかっていないだけでしょ。
228あたりでそんな雰囲気は漂っているが230で確定、以降は単に弄って遊ばれている。
0239デフォルトの名無しさん2013/03/17(日) 02:33:07.85
で、さっさと違うファイルでも
レキシカルに特定できる
言語いったら?w
0240デフォルトの名無しさん2013/03/17(日) 02:50:57.96
むしろ出来ない言語を挙げてくれ。
0241デフォルトの名無しさん2013/03/17(日) 02:55:33.37
Ruby、PHP、Perlあたりだな。
0242デフォルトの名無しさん2013/03/17(日) 06:46:01.54
レキシカルスコープすら理解せずに型付けの議論をしてたのか、このアホは…
0243デフォルトの名無しさん2013/03/17(日) 08:05:36.52
ファイルが違うとレキシカルに特定できないってことは、
クロージャの中で別ファイルの変数/関数を参照したり、
生成したクロージャを別ファイルの中で利用したり出来ないってことか。
すげーな。そんな言語見た事ねぇ。
0244デフォルトの名無しさん2013/03/17(日) 13:07:35.32
静的有効範囲( Lexical scope, also Static scope )
http://whatis.techtarget.com/definition/lexical-scoping-static-scoping

要約:
静的有効範囲とは、変数の有効範囲を
翻訳前にCode block内部だけに制限する管理方式。
対となる変数の管理方式として、動的有効範囲( Dynamic Scope )が存在する。
こちらは、Code blockの外部からでも変数を操作することが出来る。

注:
静的有効範囲は、一般に言うタダのScope
動的有効範囲はEmacs lispなどでも使われている方式。関数の呼び出し元によって
見える変数が変化する。このため動的という言葉が名前が付く。

で、ここで言ってるLexical scopeってなんぞえ?
0245デフォルトの名無しさん2013/03/17(日) 13:13:03.09
ちなみに、LexicalのLexとはLexerのLexと同じ。
構文を意味する。つまり構文に基づく有効範囲という意味になる。
0246デフォルトの名無しさん2013/03/17(日) 13:21:07.42
動的な局所変数なんて概念存在すんだろうか
0247デフォルトの名無しさん2013/03/17(日) 13:22:15.64
>>225
で、君が主張するレキシカルには分析できないような、静的型付けでしか不可能な補間機能というのを説明してくれたまい。
0248デフォルトの名無しさん2013/03/17(日) 13:26:29.26
>>247
そもそもなんで、ローカルスコープの話に
レキシカルが出てくるの?
0249デフォルトの名無しさん2013/03/17(日) 13:27:33.07
>>248
>>225へのレスが>>226だから
0250デフォルトの名無しさん2013/03/17(日) 13:28:26.15
>>247

void foo(KURASU kurasu) {
 kurasu.hoge(); ← KURASU型だとわかってるから補完できる。
}

void foo(kurasu) {
 kurasu.hoge(); ← 何型かわからないから補完できない。
}
0251デフォルトの名無しさん2013/03/17(日) 13:29:18.48
いやー、たぶん>>230は
静的型付けならファイルを超えてレキシカルな構造を特定できるが
動的型付けだと無理だ、と言いたかったんだと思うよ

なんでそんな発想に至ったのか理解不能だけどwww
0252デフォルトの名無しさん2013/03/17(日) 13:30:36.04
>>250
普通にできるけど?あほ?
動的型のマトモな環境使ったことないの?
0253デフォルトの名無しさん2013/03/17(日) 13:31:39.73
ファイル超えたって
普通にモジュール化とimport機能がある言語なら
普通に補完もタイポ検出も可能だよなー
0254デフォルトの名無しさん2013/03/17(日) 13:31:49.24
>>252

foo(KURASU1)
foo(KURASU2)

KURASU1にはhogeがあるが
KURASU2にはhogeがない

void foo(kurasu) {
 kurasu.hoge(); ← 何型かわからないから補完できない。
}
0255デフォルトの名無しさん2013/03/17(日) 13:33:03.40
foo(KURASU1)
foo(KURASU2)

KURASU1にはhogeがあるが
KURASU2にはhogeがない

void foo(kurasu) {
 kurasu.hoge(); ← この部分でブレークしてもKURASU2が入っている時に、KURASU1が入った場合のhogeは補完されない。
}
0256デフォルトの名無しさん2013/03/17(日) 13:33:59.41
つまり、動的型付け言語の、コード補完には
信頼性がない。
0257デフォルトの名無しさん2013/03/17(日) 13:35:20.67
動的言語の場合、補完というより候補だしてるだけだからね。
その候補以外でもコンパイルに通ってしまう。
実行時じゃないと本当にエラーにすべきかどうかわからない。
0258デフォルトの名無しさん2013/03/17(日) 13:35:28.91
>>214
環境と独立したSmalltalk言語なんていくらでもあるんですがね。
GNU Smalltalk然り、Dolphin然り、VistaSmalltalk(#Smalltalk)然り、Redline Smalltalk然り。
0259デフォルトの名無しさん2013/03/17(日) 13:36:09.88
>>254
普通にできるけど?あほ?
動的型のマトモな環境使ったことないの?
0260デフォルトの名無しさん2013/03/17(日) 13:37:48.45
>>259
じゃあやってみせてよw

ちなみに、fooの呼び出しは
fooの定義のレキシカルスコープ外に
あるものとします
0261デフォルトの名無しさん2013/03/17(日) 13:38:59.48
>>256
ばか?
コード補完に信頼性がないんじゃなくて
実際言語仕様的にそういうコードがvalidであり得るのだが?

これから君のことはKURASU君と読んであげよう。よかったね。
0262デフォルトの名無しさん2013/03/17(日) 13:39:16.35
template<class Type> void Example( const Type &value )
{
   value.Function(); //補完できない
}
0263デフォルトの名無しさん2013/03/17(日) 13:39:20.96
くっそ何も反論できない。
こうなったら!

動的型のマトモな環境使ったことないの?

(そんなの無いけどねw)
0264デフォルトの名無しさん2013/03/17(日) 13:40:10.14
>>260の神聖あほっぷりに世界が沸いたw
0265デフォルトの名無しさん2013/03/17(日) 13:40:33.86
>>262
それテンプレートじゃんw

マクロのようなものと考えればいい。
マクロがコード補完とか意味わからん。

マクロを使った時にコード補完されるから問題ないんだよ。
0266デフォルトの名無しさん2013/03/17(日) 13:40:43.65
>>263
くやしいねえ、KURASUくんww
0267デフォルトの名無しさん2013/03/17(日) 13:41:06.17
まさに>>263が正解って感じがしてきたなw
0268デフォルトの名無しさん2013/03/17(日) 13:42:21.04
やってみせられないことが
全てを物語っているよな。
0269デフォルトの名無しさん2013/03/17(日) 13:43:51.89
やってみせられないって…どうやって見せるの?
KURASU君みたいにアホ丸出しのコードをここに書き込んで
何かの証明になるとでも思ってるの?ばかなの?あほなの?
0270デフォルトの名無しさん2013/03/17(日) 13:43:55.41
ていうか、ここのKURASU君(良い名前だw)に
動的型言語でinvalidなコードを書いてみて貰ったら良いんじゃないか?

なお、invalidってのは処理系にとって未定義な振舞いで、例えばseg faultするようなヤツな
0271デフォルトの名無しさん2013/03/17(日) 13:43:58.40
> 動的型のマトモな環境使ったことないの?
ふいたw

動的型にまともな環境無いじゃん。
いつもテキストエディタで書いてるじゃん

Smalltalkだけは例外でいいよ。
あれはIDEと実行環境が一体化した変な世界だから。

それ以外の動的型言語にまともな環境はない。
あるなら知りたいくらいだ。
いい加減テキストエディタの開発やめたいんだよね。
0272デフォルトの名無しさん2013/03/17(日) 13:44:17.44
-(void)withString:(*NSString) value // 動的型付
{
  puts( [value UTF8String] );//補完できる
}

template<class Type> void Example( const Type &value ) // 静的型付
{
   value.Function(); //補完できない
}
0273デフォルトの名無しさん2013/03/17(日) 13:44:35.91
>>270
> なお、invalidってのは処理系にとって未定義な振舞いで、例えばseg faultするようなヤツな

それは違う。
0274デフォルトの名無しさん2013/03/17(日) 13:45:14.50
>>273
じゃあ、お前の定義は?
0275デフォルトの名無しさん2013/03/17(日) 13:45:21.42
>>265
詭弁だねぇ
0276デフォルトの名無しさん2013/03/17(日) 13:46:15.83
PyDev も Python tools for Visual Studio も vim (+ipython) も
環境込みで動いてる
0277デフォルトの名無しさん2013/03/17(日) 13:46:36.03
>>265
>マクロを使った時にコード補完されるから問題ないんだよ。
意味がさっぱり判らん。もっと人間に優しく説明しておくれ
0278デフォルトの名無しさん2013/03/17(日) 13:47:02.82
俺にとってinvalidというのは、実行時に必ず
想定外の動作をするコードだな。
0279デフォルトの名無しさん2013/03/17(日) 13:47:54.76
>>271
で、Smalltalk環境でできることが他の動的言語ではできない理由は?

ちなみにKURASU君が大好きそうなEclipseもSmalltalk由来だから
Smalltalkで作った環境がノーカウントだとするとEclipseもノーカウントだぞw
0280デフォルトの名無しさん2013/03/17(日) 13:48:13.56
>>273
違うというなら無効(invalid)以外の言葉で条件を定義したら?
異常終了とか。
0281デフォルトの名無しさん2013/03/17(日) 13:48:22.20
>>277
テンプレートってのは雛形。
コードそのものではなく、
コード生成機

コード生成器 → コード生成 → コンパイル

こういう流れだから、コード生成した時に
検出できるので問題ないという話。
0282デフォルトの名無しさん2013/03/17(日) 13:48:34.10
>>278
それって言語仕様や処理系にとって想定外ってことだよね
まさか言語がエスパーして人間の想定を考慮するはずないもんね
0283デフォルトの名無しさん2013/03/17(日) 13:48:43.16
>>278
「想定外」なんていう脳内仕様を要求する基準を持ち出す時点でアウトだなw
0284デフォルトの名無しさん2013/03/17(日) 13:49:10.42
>>281
補完の話してたろ都合よくすり替えるなよ
0285デフォルトの名無しさん2013/03/17(日) 13:49:29.24
>>279
それは悪魔の証明だな。

君が出来るという証拠を示せばそれで話は終わりだよ。
Smalltalk以外で。
できないなら、そういうことだ。
0286デフォルトの名無しさん2013/03/17(日) 13:50:06.86
かぶったw
まあ健康な脳を持つプログラマなら普通に気付く間違いだがw
0287デフォルトの名無しさん2013/03/17(日) 13:51:41.78
じゃあinvalidの定義「バグ、コードを修正することでしか、直せない問題。」でどうだ?
0288デフォルトの名無しさん2013/03/17(日) 13:51:43.72
>>279
Objective-CとXcodeなら出来るぞ。
0289デフォルトの名無しさん2013/03/17(日) 13:51:59.28
>>285
つまりKURASU君の主張を裏付けるためには悪魔の証明が必要だと。
なんていい加減な主張をするんだろうね、KURASU君はw
「まともな環境はない」と断言したからには、ちゃんと理由を示せよww
0290デフォルトの名無しさん2013/03/17(日) 13:52:15.05
ほう、できるというのなら、
その証拠を出すんだ。
今なら勝てるぞ!
0291デフォルトの名無しさん2013/03/17(日) 13:52:59.35
悪魔の証明どころか、れっきとした反例が出ちゃったね、KURASU君w
0292デフォルトの名無しさん2013/03/17(日) 13:53:08.05
>>289
いや、無いの証明をするのは難しいっていうのが
悪魔の証明ってやつだから。

そんなのを要求するほうが頭が悪いで話は終わるんだよ。
0293デフォルトの名無しさん2013/03/17(日) 13:53:12.70
>>287
いい加減Engrishみたいに横文字に執着すんのやめたら気持ち悪い
0294デフォルトの名無しさん2013/03/17(日) 13:54:59.83
>>290
Objective-CとXcodeなら[NSString s]と打ち込んだ所で、NStringの
selector一覧が出る。
0295デフォルトの名無しさん2013/03/17(日) 13:55:42.28
なんか勘違いして勝ったつもりの奴がいるが、
http://ja.wikipedia.org/wiki/Objective-C
弱い静的型付け
^^^^^^^^^^^^^^^^^

だぞ?
0296デフォルトの名無しさん2013/03/17(日) 13:57:15.07
>>295
落ちにワロタw
0297デフォルトの名無しさん2013/03/17(日) 13:59:10.26
Pythonならこんなモノがある。

Python Omni Completion
http://www.vim.org/scripts/script.php?script_id=1542

Features:
Dynamic type deduction (without actually evaluating statements) #動的に型を特定
Local visibility handling (will complete from all parent scopes). #親の可視範囲から型を特定
completeopt=preview support, displaying python docstrings # 略
Function argument completion (whenever possible) # 引数補完
0298デフォルトの名無しさん2013/03/17(日) 13:59:22.13
>>295
バラすなよ。
せっかくいい感じで
釣れたのにw
0299デフォルトの名無しさん2013/03/17(日) 13:59:23.98
>>295
Objective-CのCの部分は弱い静的型付けだが、
OO部分は完全にSmalltalk由来の動的型付けだ
0300デフォルトの名無しさん2013/03/17(日) 14:01:31.95
>>299
だからこういうことになるわけですね

http://ponpoko1968.hatenablog.com/entry/20101030/1288395400

> 実は、どうやら最新のバージョン2.8においても、objective-cの
> クラスやメソッドを認識する機能が実装されていないようで、
> C言語の関数しか補完候補に現れません。
0301デフォルトの名無しさん2013/03/17(日) 14:01:49.61
>>295
うんにゃそれはWikipediaの定義でしかないし、
Cの側面からみた定義でしかない。
あんたらの問題視している範囲から言えば動的型付言語だ。
じゃなにかい?Objective-Cも静的型付言語だから、
静的型付言語も実行時に型異常を起こすから危険って事でいいのかい?
0302デフォルトの名無しさん2013/03/17(日) 14:02:41.59
Objective-Cは静的型付け言語です。
0303デフォルトの名無しさん2013/03/17(日) 14:03:01.84
>>301
その下読んだ?

> 2010/11/1補記:
> どうやらobjective-Cクラス/メソッドも認識しているようです。
0304デフォルトの名無しさん2013/03/17(日) 14:03:09.92
>>300
もうXcodeは4.x時代ですが、時空の間に取り残された人ですか?
0305デフォルトの名無しさん2013/03/17(日) 14:04:23.09
つーか、型定義がある時点で静的型付けでしょ?

いや、正確にはNSStringみたいな型定義がないと
補完できないわけでしょ?
0306デフォルトの名無しさん2013/03/17(日) 14:04:26.25
KURASU君が必死にググって対抗しようとしてるのが笑える
0307デフォルトの名無しさん2013/03/17(日) 14:05:25.16
これってつまり、動的型付け言語で補完したいなら
静的型付けと同じような、型定義が必要って話になってるんじゃね?
0308デフォルトの名無しさん2013/03/17(日) 14:05:48.31
http://en.wikipedia.org/wiki/Objective-C#Dynamic_typing
0309デフォルトの名無しさん2013/03/17(日) 14:05:49.92
>>305
> つーか、型定義がある時点で静的型付けでしょ?

馬鹿すぎ
0310デフォルトの名無しさん2013/03/17(日) 14:08:25.16
>>307
>>297

>>305
翻訳時に型解決してないので、どうあがいても動的型付けです。
それがわからないなら入門書で動的と静的の違いをもう一回お勉強したら?
0311デフォルトの名無しさん2013/03/17(日) 14:10:21.78
で、Java厨は>>297をかたくなに無視してんのはなんでだ?
0312デフォルトの名無しさん2013/03/17(日) 14:11:34.76
-(void)withString:(*NSString) value // 動的型付
{
  puts( [value UTF8String] );//補完できる
}

template<class Type> void Example( const Type &value ) // 静的型付
{
   value.Function(); //補完できない
}
0313デフォルトの名無しさん2013/03/17(日) 14:12:42.95
>>311
Java厨が忌み嫌うエディタで出来るなんて我慢できないから
0314デフォルトの名無しさん2013/03/17(日) 14:15:38.65
そもそも、動的型付ならMethodが存在しなくても正常に実行できるんだけどな。
そういう事が出来ない時点で、静的型付というか(というと失礼なので)Javaは糞だよ。
0315デフォルトの名無しさん2013/03/17(日) 14:20:02.04
動的型付け言語でも型定義があれば補完できる。

型定義の重要性を再認識することになった。
0316デフォルトの名無しさん2013/03/17(日) 14:20:41.39
そうだね。でもそれは、静的、動的の問題じゃないね。スレ違いだね。
0317デフォルトの名無しさん2013/03/17(日) 14:20:58.35
>>314
それは仕様通りに動くという意味じゃないだろう?

バグが有っても、バグと認識できずに動いてしまうという話だよね?
0318デフォルトの名無しさん2013/03/17(日) 14:21:54.35
>>316
別スレってことは
別のスレを立てろって言ってるのかい?
0319デフォルトの名無しさん2013/03/17(日) 14:23:07.37
>>318
建てたければ立てればいいんじゃないの?
0320デフォルトの名無しさん2013/03/17(日) 14:23:37.00
ActiveRecordすら知らないと来た
いや、名前は聞いたことあるけど仕組みは理解できてない、か
0321デフォルトの名無しさん2013/03/17(日) 14:24:15.99
>>317
NULL objectとかListener objectとかProxy objectとか仕様通りですけど。
0322デフォルトの名無しさん2013/03/17(日) 14:24:48.30
>>318
スレタイは「レキシカルスコープも型付けも分かりません、助けて!」に決定
0323デフォルトの名無しさん2013/03/17(日) 14:25:11.89
>>320
Active Recordというよりメッセージ転送の話だよ
0324デフォルトの名無しさん2013/03/17(日) 14:26:09.03
こんなかんじでどうだ?

「型定義の重要性 〜 コーディングミス解決,補完,etc」

本質的ではないバグに翻弄される人々
タイプミスにどんだけ時間奪われたか計算してみ?

動的型付け言語であっても、型定義があることで
さまざまな問題を解決出来ます。

Objective-Cは定義が存在する動的型付け言語の一つです。
0325デフォルトの名無しさん2013/03/17(日) 14:27:19.38
>>321
NULL objectとかListener objectとかProxy object 以外では
仕様通りじゃないということですか?
0326デフォルトの名無しさん2013/03/17(日) 14:27:54.86
>>324
いいねそれw
それでいこう。
0327デフォルトの名無しさん2013/03/17(日) 14:28:07.01
>>323
そんなの実用的じゃないって返されないように有名な適用例をあげてみた
0328デフォルトの名無しさん2013/03/17(日) 14:28:16.63
型定義が存在しない言語となると、
javascriptとself、shell scriptぐらいか。
はようたててこい
0329デフォルトの名無しさん2013/03/17(日) 14:29:04.99
>>325
鳥でなければ空は飛べないのですか?
0330デフォルトの名無しさん2013/03/17(日) 14:29:33.25
Active Recordは設計がおかしい。

ModelとActive Recordはis-a関係でないのに
Active Recordを継承してModelを作っている。

実用されているが、間違った例だ。
0331デフォルトの名無しさん2013/03/17(日) 14:30:05.95
>>328
LazyKも入れよう
■ このスレッドは過去ログ倉庫に格納されています