動的言語で大規模開発
■ このスレッドは過去ログ倉庫に格納されています
>>375
それは仕様変更だろ。
TDDなら、メソッドの変更の前にテストの変更が来るし。 >>375
ルビーの勉強がんばってください、入門者さんw 動的言語ってリファレンスが読みにくくね?
みんなどうしてんの? >>381
具体的にどの言語のリファレンスが読みにくいと? pythonしか知らんが、pythonはかなりドキュメント類がしっかりしてると思うけどな。
ただまあ、マイナー言語、ライブラリは動的静的カンケーなく、結局ソースを読むことにはなると思う。 定番アプリのソースで似たようなことしてるものを探して真似る
うっかりソースを読んで入り込むとあとで変更された時にヤラれる PHPとPythonのドキュメントはしっかりしてるけど
RubyとSmalltalkのはゴミだったな smalltalkはブラウザ開いて
オブジェクトと対話しながらプログラミングしていくスタイルだから
アレで良いのだ
と、多くのスモールトーカー様は思ってる 動的言語ではないがJavaのAPIドキュメントがしっかりしすぎてる。 Smalltalkのドキュメントって何のことだろう? pythonのopencvとかnumpyのリファレンス見てみたんだけど
なんの型を入れるとなんの型が帰ってくるのか明確に書いてないからサンプル見ないと分かんない その辺はネーミングセンスでカバーするという思想だろうけど
Cライブラリのラッパーとかだと全く通用しなくなるな >>391
ipythonで?して書いてなかったらソース読んでる。 vimでKを押してdocumentがなかったら
\dを押して定義元のソースコードにジャンプしてる 下みたいコードのエラーを実行前に検出できるlint系ツールが存在する
Pythonを動的言語で括って良いものだろうか
def foo(x):
def f(g):
return g() + x
return f
def bar():
foo(1)(lambda: 'abc') 最近追ってなかったけど
pythonは型アノテーション導入の話題もあるのな。 やっぱ大規模開発には静的型があった方が
良いんだろうな >>397
typoですら動かすまで見つけれないのは地味にストレスだからな。 >>398
何十年前の常識だよそれ
今時typoすら実行前に発見できない処理系のほうが珍しい >>399
動的言語は、typoを実行前に発見できないほうが多いよ。
発見できないパターンはこれ
obj.f00 (fooの間違い)
オブジェクトのメソッドのメソッド名を間違えた時
ほぼ全ての動的言語は、実行するまでtypoを発見できない。
なぜなら後で動的にメソッドを追加するかもしれないから
実行するまでわからない。 動的言語だとtypoがわかると言っても
ローカル変数程度なんだよね。
そんな近くにある目で見てもすぐわかるようなものより
ファイルをまたいだりしている遠くにあるコードの
typoを知りたいんだが。 >>400
>なぜなら後で動的にメソッドを追加するかもしれないから
>実行するまでわからない。
そういうケースにワーニングを出してくれるだけで十分ありがたい >>400
その理屈はなんかおかしいぞ。
後で動的にメソッドが追加されるかもしれないから
typoかどうか実行時まで*処理系側では*判断できない
というだけの話。
書いている人間様はそれがtypoかどうかは容易に判断できる(気づきさえすれば)。
だから、パーズ・コンパイル時に単に未定義だと文字通りワーニングを出せばいい話で、
実際そういう機能を持つ処理系やIDEは1980年代のSmalltalkから普通にある。
typoでたまたま他の既存のメソッド名とかぶってしまった場合に、
型でtypoかどうか判断可能という主張ならまだわかる。
その場合でも、型まで一致していたら静的型言語でもお手上げだ。 typoっつーか、メソッド名を補完してたら
ウッカリ同じprefixの別のメソッド呼んじゃってた事はあるよ
でも、その間違ったメソッドが引数の型や数、戻り値の型まで一致してたことは一度も無かった >>404
補完なら、ふつう型が一致してなかったらそもそも候補に出てこないし、
まして「呼んじゃって」(つまりコンパイルが通って実行される)なんてことは
ウッカリだろうが何だろうが基本ないことだと思うけど? >>405
動的言語は型が一致しないメソッドも候補に出てくるIDEばっかじゃんSmalltalkも含めて
それにコンパイルも通るよ静的型じゃ無いんだから >>406
>>405は静的型言語の話をしているんだが?
それとも>>404は動的型言語の話なのか?
ならなんで「引数の型や数、戻り値の型まで一致」とか出てくるんだ? >>407
>ならなんで「引数の型や数、戻り値の型まで一致」とか出てくるんだ?
動的言語でも値に型はあるから >>408
へー、どの動的型付言語が言語仕様で「型」という概念が定義されているんだい? 動的型付言語を使っていて型が違うのにとか型で補完できればとか言ってる人は動的型付言語の初心者。
動的型付言語を単に型宣言しない静的型付言語として使っているだけ。 >>411
まあ初心者なら Soft typing という用語を知らなくても
しかたないだろうな >>410
a = 1
a = "a"
a = true
一行目のaの値は数値型で二行目で文字型に変り三行目でBoolean型に
なるってことで型が無いように見えて値にはちゃんと型があると言いたいんでしょ? 重要なのは値に型があることではなくて変数に型があること。
変数に型があるからこそ、その変数の型のメソッドは何かがわかる。 変数はコードに書く。コードに書くということは
静的にわかる。(変数に型がある場合)
値に型があっても、実行時にならないとわからない。
変数に入る値はいろんな型がありえるから
値に型があるだけじゃ、typoを発見することは出来ない。
いい加減「値に型がある」を反論の材料にするのはやめてくれ。
反論になってないから 変数posがあってこれが座標を表わしてるものだとしたら
list型で(x y)だったり構造体でxとyのフィールドを持ってたりy*w+xの整数だったり
色んな表現が出来るから柔軟という利点があってプロトタイプに向いてるってことじゃないの >>411
動的型言語の玄人になると、値の型と無関係な(CallするとRuntime Errorになる)メソッドが
大量に候補に出てくるような補完や、typoすら発見できないようなチェッカーに
慣らされてるから疑問にすら思わなくなるってこと? >>418
一人で把握できる範囲でプロトタイプのようなある程度使い捨てを前提に作れる
ならそれほど問題はないが、スレタイにあるように大規模開発≒複数人開発だと
静的言語に比べて動的言語だとtypoみたいな簡単なミスでも見つけづらいよねと
いうような話だと思う。 ちょろっとしたものを作るだけなら変数は全てオブジェクト
ですっていうように抽象化されている方が楽だけど、大規模開発だとそれじゃ
ダメだよねっていう話。 >>419
大量ったってさらに数文字足せばかなり絞り込めるし
typoだって前にも書いてあるとおり
未定義のワーニングで十分に思うんだが
いったい何が不満なんだ? そりゃ未定義がワーニングだからだろ。
ワークニング出たよ。
さて、そのワーニングは無視していいのかよくないのか?
typoしてワーニングが出た。あぁ、いつものワーニングかでスルー
結局ワーニングがあてにならないものになってるだろ。 >>422
いや、普段使いがSmalltalkなもんで、そんなことはない。
未定義のワーニングはtypoだった場合の候補も挙げてくれるから
実際にtypoだったらそこから選ぶだけだし。^^; SmalltalkのIDEの補完は精度が低過ぎて使えないゴミだから
プログラマは補完に頼らず自分でタイプするから
>>404みたいな問題もないんだよね >>424
そうだね。なんかこんなようなメソッド名(Smalltalkではセレクタと呼ぶ)だったなぁ…と
うろ覚えで適当に入れとくとコンパイラがあとでいちいち教えてくれるから、はいはいって直してく感じ。
補完が便利だなぁと感じるのは長いメソッド名の場合かな。
適当にだとしてもタイプするのが単純に面倒なのでその労力を省くことができるので。 >>426
ごめん。
PythonにはSmalltalkのそれを凌駕する最強のIDEがそろっているのかもしれないが、
その前にまず言語として隔靴掻痒感が否めなくて使っているとめまいがするのでパス。 >>428
Unknown variable: Smalltark please correct, or cancel:
define new class
declare global
------------------------------------------------------
Smalltalk
SmalltalkImageTest
SmalltalkEditor
SmalltalkImage
SmallLandColorTheme
SmallInteger
SmallIntegerTest
SMAccount
SMCategory
SMPackageInstallationTask
------------------------------------------------------
cancel Python「ただのテキストエディタで出来そう…」 >>419
動的型に慣れたら、大量に候補が出るような命名はしないし(凝集度)
typoすら発見できないようなチェッカーなんて使わずにマトモなチェッカーを使う。
あたりまえだろ? >>422
なるほど、warningメッセージなんて読まない達人プログラマなんですね、
すごいなあw ここまでの流れだと結論は
静的言語は初心者向け
静的言語使いは初心者 処理系作ってる連中に学が無いから、型推論できるチェッカーひとつ作れない
で、仕方なく運用(命名規則)で回避ですか
駄目システムに苦しめられてるユーザと同じ図じゃん
なお、大規模開発ではどんな命名規則でもメソッド名が増えるため破綻する模様 手元のSmalltalk環境には4万強のメソッドがあって
先にも言われているように、型推論付きとかそんな高尚な補完もないけど
使いたいメソッドが出てこなくて困ったことなんかないぞ。 >>436
まともな人がちゃんと作れば君のような目にはあわずにすむということじゃないかなあw >>436
例えばどんなメソッド名の場合に型推論できないと見つからないんだい?
おもしろそうだから答えてみてよw >>437
Smalltalkで何作ってるの?
そっちが気になる絶滅危惧言語なんだが >>438
まともな人は遥か昔Smalltalkから逃げ出したし、現在進行形でRubyからも続々と逃げ出してるよね >>440
いろいろやるけど、主にWebアプリだな。 >>437
> 使いたいメソッドが出てこなくて困ったことなんかないぞ。
コードを動かさないでだせる?
つまりアプリは動いておらずテキストエディタで書いている時。
コードを動かさないと出せないっていうのがダメなんだよね。
いろんな処理、例えば10分ぐらい処理してやっと実行される関数があったとする。
その関数の中にある条件分岐で真になるときのコード補完はできるだろうけど、
次に偽になる時のコード補完をしようと思ったら10分間待たないといけなくなる。
コードを動かさないでコード補完ができれば、待ち時間なしで
コード補完が出来るわけさ。 >>443
ごめん。要求仕様^^;がちょっとよくわからなかった。
PythonとかJavaとか>>443がよく知っている言語でいいから、
あと処理の重さは30秒くらいの適当な長さのsleepとかの代替で
どういうコードか書いてみてもらってもいい? >>443
オブジェクトが数値のときは数値関係のメソッドだけ補完に出せとか、そういう条件はあるの? >>444
じゃあJavaScriptで。
// ※aはMyClass型専用
// ただしJavaScriptは動的言語であり、aがMyClassという情報はどこにもない
function foo(a) {
a. とピリオドを入力した時点で、MyClassが持ってるメソッド一覧が表示されて欲しい
}
これがJavaなら
void foo(MyClass a) {
a. とピリオドを入力した時点で、MyClassが持ってるメソッド一覧が表示される
}
これと同じことをJavaScriptでやってほしい。
>>445
そりゃあるでしょw 当たり前だけど、a. の行にブレークポイントを置いて、
そこまで実行してからa.を出すのはなし。
その行のブレークポイントまで実行しないといけないから
時間がかかる。 >>446
なるほど
メソッド名を1文字も入力できないほど脳が不自由な人なんですね
かわいそうに >>446
MyClassのメソッド一覧ってどれぐらいのサイズ?
Smalltalkのように充実した標準ライブラリを持つ言語だと
Objectクラスだけでメソッドが488個あるから
MyClassのメソッド一覧は少なくとも500個ぐらいになって
aのクラスを特定する意味はあまりないな。
Smalltalkほどクラスライブラリが充実してないプアな言語だと
クラスを特定できるとうれしいかもしれないけど。 補完候補が単純なalphabetical orderじゃなくて
使用頻度順を学習して上から並べてくれるやつもあるので
その反論はナンセンスじゃね?
MyClassとObjectでは使われるメソッドの頻度が違うから >>446
ちょっと待ってよ。そういう話なの?
俺の理解では、
- 静的型言語は変数を型で縛っているから補完がやりやすい。
- 動的型言語で静的に同レベルを実現するのは理論的に不可能。
ということは議論され尽くされてるわけだから暗黙の了解としてよくて、
- だけど動的型言語でも型推論をしてある程度絞って出せるのはあるよね。
- Smalltalkにはそういうスマートな機能はないけど、あんまり困ったことないよ。
という流れがあったところに>>443 で、
- 実行はせず、テキストエディタで編集中のコードで問題なくメソッドは出せるのか?
ときたから、意図がよくわからないのでコードを示してくれと頼んだら、
- 実行をして a をを確定してからその情報を元にして補完をするのはナシで、
静的型言語と同じように a の関連のメソッドだけしぼって出してみろ!
という要求だったので非常に驚いている。←イマココ 標準ライブラリの大きさとObjectに数百個程度のメソッドがあることの
関係も良くわからない
標準ライブラリに少なくとも数百個もメソッドがあるんだぜスゲーってこと? >>449
> MyClassのメソッド一覧は少なくとも500個ぐらいになって
そんなもん、クラス直接のメソッドと
継承元のメソッドぐらい分けて表示するに決まってるだろ・・・。 でも>>446をよく見たら、こんなお題だったのか
> function foo(a) {
> a. とピリオドを入力した時点で、MyClassが持ってるメソッド一覧が表示されて欲しい
> }
これは静的型付言語で型推論があっても補完は無理だw これなら型補完できるよ。これが静的言語でしょ?
> これがJavaなら
> void foo(MyClass a) {
> a. とピリオドを入力した時点で、MyClassが持ってるメソッド一覧が表示される
> } >>453
へー、継承元のメソッドを分けて表示すれば解決する程度の貧弱なクラスライブラリが前提なんだー(鼻ホジホジ >>442
商用で?
Smalltalkの処理系は? 静的言語でやっているコーディングとかIDEの使い方をそのまま動的言語に持ち込んで「これができない」「あれができない」と喚きだす初心者を眺めるスレw >>456
お前バカだろw
Objectにメソッドが多すぎて邪魔って話をしてるんだが。 >>458
まあそうだね。あれができないこれができない。
たしかにそうだ。実際に出来ないもの。
で、そ、そんなのいらないんだから!
と言い返すw 技術的には型推論と補完を両立できるかどうか考えればいいと思うけど
ここで悪足掻きしてるやつは技術より心理にこだわっているふしがある
補完よいよねというマインドをつくることしか考えてない 普通にいいだろw.
補完ができれば、それを応用して
さらにいろんなことができるようになるわけだし >>462
補完うんぬんは「静的型いいよね」というマインドのための道具でしかないでしょw >>459
そんなこと言ったらこのスレが成り立たないだろ。
独立言語スレはSmalltalkだけじゃないぞ。
動的言語に貴賎はない、、、はず。 >>463
補完するスタイルと補完しないスタイルの二種類があれば
一種類よりも多くのことができる 補完するときにメソッド名を選択すると、引数や戻り値の型やドキュメントが
出てくれるのは凄く嬉しい
あと同じ機能を使うと、メソッドにカーソル当てたらドキュメントを出せるようになるから
コード読むのが捗りまくる 出来るできないで考えるからわからない。
どちらが楽にできるかどうかで考えよう。
そしてただ単に楽にできるかで考えるのもダメ一体何が楽ができるか。
つまり、書くのが楽か、読むのが楽か。
どちらを重視すべきかというと、書くよりも読むことが楽になるようにするべき。
なぜならプログラミングの作業の多くは書こに書いたコードを読んで修正することだから。
そういう時に、この変数は○○型であると書いてある方がいいわけだよ。
コメントに書くこともできるがそれだと実際のコードとコメントが
一致していない可能性がある。
コメントを書くよりも、コードでそれを表現するべき。
そうすれば人間もコンパイラも理解できる。
静的型がいいのは、そういう読むときの開発効率の高さにある。 なお、コード補完は、書くことを楽にしてくれる、
つまりタイピングを補助するものだと勘違いしている人が多いが、
実際は読むことを楽にしてくれている。
つまり、このオブジェクトにはどんなメソッドがあって、
そのメソッドがどんな機能、引数、戻り値を提供しているか
ということを確かめるために、ドキュメントやコードを
読むことを楽にしてくれる。
だから適切な補完が重要になる。
多すぎることもなく少なすぎることもなく
間違えることもない補完が重要。 >>446
ご説ごもっとも。
だから、こんな可哀想な動的大好き人間は放っておいて
静的型言語まんせースレに行って幸せを満喫してください。
>>462
型推論で静的解析が可能だとして
動的型として失うものはないのだろうか。
そういう議論なら有意義だと思う。 それ以前にさ、動的型付きとして
失ってほしくない機能って何さ?
失っても対して問題ない機能ばかりだと思うだが。 標準ライブラリや他人の作ったライブラリの全てを記憶できる変態でも無い限り
コード補完によってドキュメントを含め表示して選択出来るってのは生産する
上ではかなりのアドバンテージなんだけどね。 大昔のクソなIDEや最近のでも
動的言語に対応しているのはクソなIDEしかないから、そういう技術の進歩を
知らない原始人には理解できないことなんだよ。 動的型付きにすることで失われていることのほうが多いと思う。
それで、動的型付きにしてまで守ろうとしているものってなに? ドキュメントについては仕様書が欲しいか具体例が欲しいかによる
ただちに必要ではないことまで書かれているのが仕様書
ある時点で必要だったことしか書かれていないのが具体例
具体例から仕様を想像できるような変態は全てを記憶ではなく推理している スタートダッシュと試行錯誤じゃないの
軌道に乗ったら捨てて作りなおせばいいのよ ■ このスレッドは過去ログ倉庫に格納されています