X



【JavaScript】スクリプト バトルロワイヤル55【php,py,pl,rb】 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
0472デフォルトの名無しさん
垢版 |
2017/03/03(金) 07:12:07.86ID:4qcBtzlj
>>471
動的型信者が静的型をdisるときによく言う「静的型の方が型が決まってるから実装が楽だが〜」
みたいなのを真に受けてるのかな
自分で簡単な言語を実装してみたらわかるよ
問題は型が静的か動的かよりも静的コンパイルの実装コスト
0473デフォルトの名無しさん
垢版 |
2017/03/03(金) 12:07:08.08ID:ivKlbKhz
静的コンパイルはコンパイル系と実行系で処理系が2重になるのが複雑
あらかじめ仕様をきっちり決めておかないと手戻りが多発するからスクリプターのノリで適当に作るのは困難
0475デフォルトの名無しさん
垢版 |
2017/03/03(金) 17:08:10.47ID:bWq8JKgn
仮に動的型のほうが静的型のよりも
最適化を含めるとなると難しいんだったとしても
それはまったく無駄な努力だからな
あと、動的方言語を静的に解析してエラーを見つけるのは難しいんだけど
それも無駄な努力だからな
静的型にすれば済む話
問題を直接解決しようとせず、周りをウロウロして何とかしようとするのは無駄
最近の言語に静的型が多いのは、誰も無駄な意味のない努力をしたくないから
動的型は、何か、ズレてるんだろう
砂糖と塩を輸送するのにブレンドして輸送する感じ
もしかしたら輸送費は安くなるかもしれないが
後で分離する手間考えたら分けて輸送したほうが良い
動的型の型を静的に解析するのはまさにそれに等しい行為
手間が増えるだけ
0476デフォルトの名無しさん
垢版 |
2017/03/03(金) 17:15:56.85ID:bWq8JKgn
静的型言語の実装の難易度を基準とすると
動的方言語は、とりあえず動けばよいってレベルなら超楽勝
しかし実用になるレベルにするのに
まじめに最適化を実装しようと思うと途端に難易度は跳ね上がり超絶難易度になる
間は無い
うま味がないってこと
誰も手を出さなくなったわけだ
0478デフォルトの名無しさん
垢版 |
2017/03/03(金) 17:28:09.10ID:bWq8JKgn
GoogleのV8エンジンとかは、技術的に本当に興味深く凄いなぁと思う反面
あんな苦労は絶対したくないし
言語仕様のほうをどうにかしたほうが手っ取り早いのは確実
本当に動的型言語は何するにしても無駄に壮大で大変だなぁ
静的型言語が全ての答えなのにね
0479デフォルトの名無しさん
垢版 |
2017/03/03(金) 18:31:58.34ID:BNfiYHeO
V8はC++で書かれているけど、
Chrome含むGoogleのC++はマクロで魔改造されてる。
C++のマクロだけじゃなく、Pythonも使ってソースコード置き換えをしてる。
結局「全ての答え」などというものはない
0480デフォルトの名無しさん
垢版 |
2017/03/03(金) 21:12:00.24ID:wq3/hASM
全ての答えおじさんは自分で言語作ったりするの?
ただのユーザだったらうけるんだが
0481デフォルトの名無しさん
垢版 |
2017/03/03(金) 21:45:28.70ID:aYsFsxPN
動的言語を速くする努力なんて無駄だっていうけど
Javaが速くなったのはV8と同じ技術の流用だろ?
0482デフォルトの名無しさん
垢版 |
2017/03/04(土) 13:07:22.03ID:TytE5WQL
むしろJavaが先駆者というかJIT技術の長年の代表者かな
でもJavaとV8は実際やってることは全くと行っていいほど違う

何故かと言うとJavaは結局コンパイルしてバイトコードにした時点で実際の最適化の殆どは済んでいる、実際はJITはオマケのコンパイル言語だ
そこから少しだけプロファイルを取ったり、各環境向けに最適化するが、微々たるもの
そもそもバイトコードにした時点で情報が結構失われるからそこからJITするのに限界がある構造

でも静的なのでそんなチャレンジングなことをしなくても大体のケースで十分に最適化できるので
バイトコードサイズを小さくする方を取ってるが、実際幾つかのケースでV8含む完全ソースが手元にあるJITに負ける
一方V8は実行時というか実行前から実行中までずっと最適化し続けるJITをやや超えるもの
0483デフォルトの名無しさん
垢版 |
2017/03/04(土) 15:50:13.16ID:W8crb5iK
Javaなんかコンパイラがどんなに良質なバイトコードを吐いたところでJITを切ったら使いものにならないよ
0489デフォルトの名無しさん
垢版 |
2017/03/05(日) 07:40:06.85ID:c4lSj3ER
>>488
それベンチマークに特化したコードでの話じゃね?
それならJavaでも似たような差がでるよ
0490デフォルトの名無しさん
垢版 |
2017/03/05(日) 19:03:52.33ID:ONGjQtv5
>>489
良いことなのかも知れないけれど、昔のインタプリタの頃のとてつもない低速度忘れちゃったんだな
0496デフォルトの名無しさん
垢版 |
2017/04/16(日) 00:02:02.80ID:AmA5ei6y
大体型を書くのが面倒ってのも良くわからないし、型推論とかもあるのにな
あと型が書いてあったほうが読みやすい場面も多々あるし
機械にもわかりやすくて人間にもわかりやすくて、丁度よいじゃないか
あとほか宣言があると・・・宣言は型だけじゃなくスコープの宣言でもあるわけでして
宣言なし言語はスコープが気持ち悪いことになってるのが多いよなw

それからダックタイピングは本当に必要なのかどうなのか
静的型であってもジェネリックやテンプレートやオーバーロードがあれば
静的なダックタイピングは可能なわけで、しかもタイプセーフだし
動的なダックタイピングなどという危険極まりないものが本当に必要なのか?
ダックタイピングは静的に解決できる範囲で楽しめばよいだろうよ
それですら黒魔術とか言われるのにな

あと、WebAssemblyな、結局C++などの静的型言語を中間言語にしたものを
ブラウザで読み込んで機械語に変換して実行しようよっていう
どこまで行っても結局型が判明しているほうが最適化しやすいよね
CPUの進化が鈍化してきているし、物理的限界が近いことも考えれば当然の流れだな
0497デフォルトの名無しさん
垢版 |
2017/04/16(日) 05:04:24.13ID:O+EWztiU
WASMでDOM操作とか夢のまた夢だし、
そもそもJavaでのDOM操作も実情はきつかったし
別にWebで無くてもいいような1つのアプリケーションを作るんなら
型は有用だけど、何かと何かをくっつけたり、加工したりするための
スクリプト言語としては全くの不要だよ
0498デフォルトの名無しさん
垢版 |
2017/04/16(日) 07:06:11.63ID:aIkdKg/w
>>496
> それからダックタイピングは本当に必要なのかどうなのか
> 静的型であってもジェネリックやテンプレートやオーバーロードがあれば
> 静的なダックタイピングは可能なわけで、しかもタイプセーフだし

ダックタイピングのこと分かってないだろ
0499デフォルトの名無しさん
垢版 |
2017/04/16(日) 09:52:33.87ID:SqhlDt4o
ダックタイピングはそれをプログラマが活用するのではなく
動的言語における多態性の(安易な)実装手法にすぎない
0500デフォルトの名無しさん
垢版 |
2017/04/16(日) 10:22:58.46ID:XyqfpBE9
という完全に誤った理解が蔓延しているというお話し
0501デフォルトの名無しさん
垢版 |
2017/04/16(日) 10:23:01.86ID:AmA5ei6y
>>495のURL先は皆読んでくれたかわからんが
掛け違えたボタン感が本当にすごくて
最初の一歩を間違えるとこんなにも面倒なんことになるのかって感じ
北朝鮮はどこまで進化しても北朝鮮ってことなんだろうよ
うすら寒い理想の未来を語るところもよく似ている
過去に生きて、未来を語って、現在に生きてないって感じ
まさに掛け違えたボタンで、「現実」のボタンをスキップして飛ばしている
胡散臭い宗教とかもそんな感じだよね
たぶん「現実」に不満がある人を集めるのが目的だから
過去の技術を使って、未来を語ってみせて、騙くらかすって事なんだろうな
これがまさしく、走り続けないと終わる、の意味だろう
でももう流石に誰も騙されないよね
麻疹みたいなものだから、学生さんは一度はそういう目に合うかもだが
0502デフォルトの名無しさん
垢版 |
2017/04/16(日) 10:25:51.21ID:AmA5ei6y
もしくは、ボタンを掛け違えていることに本人だけが気付いていなくて
誰も追いついてこないな〜なんて思っていたら
実はみんなもっと遠いところで高度なことをやっていた、ってパターンか
誰も追いついてこないんじゃなくて、フォロワーが居ないってことなんだけどね
0503デフォルトの名無しさん
垢版 |
2017/04/16(日) 11:27:58.86ID:cCOM2/u0
ダックタイピングというのは、(人間が)ガーガーと
アヒルのモノマネをすれば、アヒルとみなして扱おう
という発想から生まれたもの
0504デフォルトの名無しさん
垢版 |
2017/04/16(日) 15:33:13.73ID:aIkdKg/w
>>501
ダックタイピングのことを何も分かってない人間がいくら言おうと説得力はゼロだよ
0505デフォルトの名無しさん
垢版 |
2017/04/16(日) 16:41:45.39ID:AmA5ei6y
残念ながら>>499が正解なんだな〜
俺も、もし何かの都合で自分で言語を作る必要性に駆られたら
そうするだろうね、実装が圧倒的に楽だから

つまり、自分で言語を作って、自分で使うんなら
現代においてもなお、動的型はありうるんだよ、これが
言語を作る手間と時間もコストとして換算して
トータルで労力を最小にしたいから
どこでバランスするかの問題

もしくは自分はもっぱら言語を作るのがメインで、使うのは他のやつって場合も
自分だけが楽できれば良いという身勝手な発想に行き着いたのなら、ありえる
自分は静的型言語でその恩恵を十分に得ながら言語開発して
他人は自分の作った言語で苦しむっていう
人として最悪な感じにはなるけど、まぁ最終的には良心の問題
金もうけのためだったり仕事って事なら仕方ないけど
人生の目標にしたら只の嫌がらせだな

それはそれとして、既存の言語を使うだけなら
わざわざ手抜きな言語をあえて選択する意味はないよ
0507デフォルトの名無しさん
垢版 |
2017/04/16(日) 16:45:25.04ID:cCOM2/u0
ダックタイピングはジェネリクスではなく
インターフェースで代替するもの
0508デフォルトの名無しさん
垢版 |
2017/04/16(日) 16:49:53.76ID:aIkdKg/w
>>507
その通りだね

そしてインタフェースをいちいち付けてまわるのは非常に面倒臭いこと
自分で作るクラスならまだ何とかなるが、使ってるライブラリのクラスだとそうもいかない
0509デフォルトの名無しさん
垢版 |
2017/04/16(日) 16:54:54.02ID:cCOM2/u0
> そしてインタフェースをいちいち付けてまわるのは非常に面倒臭いこと

めんどくさい? ダックタイピングではインターフェースがないから
代わりにコメントで同じ情報を書かないといけないじゃん。

インターフェースの情報(コメント含む)を書かないで
それが仕様かどうか分かってもらえると思ってんの?
0510デフォルトの名無しさん
垢版 |
2017/04/16(日) 17:00:32.58ID:aIkdKg/w
>>509
コメントなら書くか書かないかは開発者が選べる
それを「低レベルコード生産要素」と見るか「プログラマの自由を保証」と見るかは
ポジションによる

Matzなんかは後者の立場なんだろうし、日本のSIのような人月計算でレベルはおかまいなしのような
プロジェクトに関わってるような人から見れば前者になるんだろうね
0511デフォルトの名無しさん
垢版 |
2017/04/16(日) 17:01:19.16ID:AmA5ei6y
「静的な」ダックタイピングはジェネリックとオーバーロードで実現可能
という風に書いたのにこれが理解できないのではどうしようもない
きっと静的と動的の違いも理解できてないんだろう
静的なダックタイピングはタイプセーフだし
本当にうまい落としどころだなぁって思う
何もかもが静的型に都合がよいように回ってて、ちょっと怖いね
とはいっても俺も何でもかんでも型で解決しようってのはあまり好きじゃなくて
一つのアイデアが上手くいくと一気に乗っかっていく感じは何か過剰というか
ただ、そうはいってもダメなものがダメなことには変わりないんだけどね
0512デフォルトの名無しさん
垢版 |
2017/04/16(日) 17:01:47.01ID:cCOM2/u0
>>510
> コメントなら書くか書かないかは開発者が選べる

言い換えると、
コメント書きたくない、仕様書を書きたくない。
コード読まないとわからない。
というコードを書きたいってことか?

ひどいな。だから可読性が下がるんだよ。
0513デフォルトの名無しさん
垢版 |
2017/04/16(日) 17:03:04.51ID:aIkdKg/w
>>511
ぜんぜん違う
ほんとダックタイピング分かってないんだな
ID:cCOM2/u0 なんかはその辺分かってるから議論になるけど、お前にゃ無理だよ
0514デフォルトの名無しさん
垢版 |
2017/04/16(日) 17:07:46.06ID:aIkdKg/w
>>512
Matz の有名な言葉に「ソースがドキュメントだ.バグも完全に記述されている」ってのがあるからねぇ
冗談半分だとしても、思想としてそういう方向なんだろう

本気半分の言い分としては、ソース読んだだけでちんぷんかんぷんなコードはその時点で怪しいと思え
って感じだろうか
0515デフォルトの名無しさん
垢版 |
2017/04/16(日) 17:08:31.24ID:cCOM2/u0
インターフェースは契約プログラミングの一種でもあるんだよ。
インターフェースを定義することは事前条件を定義することにあたる。
事前条件を記述することで、予め(プログラムを実行しなくても)バグがあることがわかる。

実行パスは無限と言ってもいいほどあるから、実行しなければ
わからない問題を検出するのは時間がかかる。

だけど、条件を満たすかどうかを調べるために、
実行そのものが必要なければ、短時間で問題が検出できる。

コンピュータが理解できる方法で、しかも実行せずにわかることと
コメントという人間しか読めない方法で書くのとでは全然意味が違う
0516デフォルトの名無しさん
垢版 |
2017/04/16(日) 17:09:43.45ID:AmA5ei6y
静的型において動的な多態にインターフェースを使うのは当たり前
動的なことは危険な香りがするから、インターフェースで制約する
これも丁度よいぐらいの落としどころなんだよ

静的な多態はジェネリックとオーバーロードでダックタイピングも可
動的な多態はインターフェースを通して安全に
どちらの場合もタイプセーフ

よくできているよね〜
0517デフォルトの名無しさん
垢版 |
2017/04/16(日) 17:10:37.85ID:aIkdKg/w
>>515
そういう方向でバグを減らすというのもひとつの方向性としてはいいんじゃない?
単なる思想の違いというだけで、そういうのが嫌いな人が作った言語だって別に悪いわけじゃない
0518デフォルトの名無しさん
垢版 |
2017/04/16(日) 17:12:57.07ID:aIkdKg/w
>>516
だからお前はダックタイピング分かってないんだからもういいよ
staticおじさんのように、分かってない機能は全部けなす方向性の人間と議論になんかならんからな
まずお前にすすめるのはリーベルGの「高慢と偏見」を読めってことだ
0519デフォルトの名無しさん
垢版 |
2017/04/16(日) 17:13:47.39ID:cCOM2/u0
>>517
> そういう方向でバグを減らすというのも

そういう方向で"も" な

バグを減らすテクニックはいくつもある。
静的言語なら、そのテクニックが増えるわけだ

動的言語でできるバグを減らすテクニックは、静的言語でも使える。
さらにプラスして、静的言語ではコンパイル時に実行することなく
バグを減らすことが可能になる。

これは明らかにバグを減らすために追加された機能といえるだろう
0520デフォルトの名無しさん
垢版 |
2017/04/16(日) 17:15:16.10ID:aIkdKg/w
>>519
そのために生産性やプログラマの自由が減るというトレードオフがあるけどね
そのトレードオフのどっちを取るかはポジションで決めればいいだけの話
0521デフォルトの名無しさん
垢版 |
2017/04/16(日) 17:16:58.16ID:AmA5ei6y
ちなみにダックタイピングは、ダックのように振舞うものは、ダックとして扱える
って言ってるだけで
静的に解決するか、動的に解決するかは、別の問題であり
当然静的なダックタイピングは、ある

>ダック・タイピング
>https://ja.wikipedia.org/wiki/%E3%83%80%E3%83%83%E3%82%AF%E3%83%BB%E3%82%BF%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0
>C++のtemplateはダック・タイピングの静的版である

残念だったなwww
それともWikiを書き直すか?
0522デフォルトの名無しさん
垢版 |
2017/04/16(日) 17:18:10.05ID:aIkdKg/w
>>521
俺はテンプレートに関しては何も言ってないが?
ジェネリクスはちゃうやろって言ってるんだが
0523デフォルトの名無しさん
垢版 |
2017/04/16(日) 17:20:02.41ID:cCOM2/u0
>>520
> そのために生産性やプログラマの自由が減るというトレードオフがあるけどね

減ってないよ。逆に高くなっている。
っていうか、あんた書くときのことしか考えてないでしょ?w

プログラミングっていうのは書くよりも読むことのほうが遥かに多い。
だから、可 "読" 性 が重視される。

読みやすいコードは生産性を大きく上げる
0524デフォルトの名無しさん
垢版 |
2017/04/16(日) 17:27:15.74ID:0ImhO/qF
>>521
× C++のtemplateはダック・タイピングの静的版である
○ C++における型消去はダック・タイピングの静的版である

明らかに間違ってるから直しとけよ
0525デフォルトの名無しさん
垢版 |
2017/04/16(日) 17:29:05.78ID:aIkdKg/w
>>523
それは違うな
コメントなら引数を「与えられる方」だけ書けばいいが、インタフェースは引数を「与える方」にもそれを強制する
そしてこれは結構面倒な作業だ

もちろん、引数として変なものを与えてしまう可能性も出てしまうが、それと上記の面倒さをどっちを取るかは
それぞれの人が決めればいい
0526デフォルトの名無しさん
垢版 |
2017/04/16(日) 18:04:26.80ID:AmA5ei6y
現代に生き残りし貴重なサンプルだとは思うが
「何が面倒か」までは書かないんだよな
結局、何でもかんでも渡すわけにはいかないのは同じこと
どのみち仕様を満たさなきゃならん
ダックならダックの仕様を満たさなきゃならん
ダックの仕様を満たすように書かなきゃならないのと
ダックのインターフェースを満たすように書かなきゃならないことは
実質問題大差ない
大差ないか、むしろインターフェスがあった方が何をすべきかよくわかるぐらいだ
仮にこのケースでほんの少しだけ動的型が便利だったと仮定しても
静的型の、型安全性、リファクタリングのしやすさ、タイポなどの些細なミスの検出
型が書いてあることによるドキュメンテーション、最適化のききやすさ
あと宣言があることによるスコープの細かさ
これらすべてを投げ捨てるほどの差はない
動的型のメリットといえばもはや動的なメタプログラミング的な何かぐらいしかないが
そんな黒魔術はどうでもよいし、はっきり言ってgoto文と変わらない
0527デフォルトの名無しさん
垢版 |
2017/04/16(日) 18:10:54.82ID:AmA5ei6y
こういうと彼はきっとこう思う
静的型は互いに別々の出どころのライブラリ間で
インターフェースに互換性がないから困る、と
しかし、そんなことは動的型でも同じこと
0528デフォルトの名無しさん
垢版 |
2017/04/16(日) 18:14:22.59ID:cCOM2/u0
>>525
クラスだけ与えられて、
さてこのクラスはどこで使えるでしょう?
みたいなクイズして楽しいか?

このクラスが持っているインターフェースは何かって
ちゃんと書いていれば、そのインターフェースを使える場所も
明確にわかるだろ
0530デフォルトの名無しさん
垢版 |
2017/04/16(日) 18:20:36.92ID:aIkdKg/w
>>528
アプリケーションの全クラスが自分の管理下にあればそれも可能かもしれんな
でも実際は様々なライブラリを使うことは避けられないし、各ライブラリのクラスに後から自分が欲しい
インタフェースを追加することはできないことがほとんど

C#やScalaなんかはそういうこともできるみたいだが、今度は可読性が落ちるのでここぞというときの
秘密兵器扱いだな
0531デフォルトの名無しさん
垢版 |
2017/04/16(日) 18:26:41.26ID:cCOM2/u0
>>530
各ライブラリのクラスに後から自分が欲しいインターフェースを追加して、
正しく動く保証はあるのですか?

そもそもそんなことする必要ありませんよね?
0532デフォルトの名無しさん
垢版 |
2017/04/16(日) 18:29:04.31ID:cCOM2/u0
手段が目的になってしまってるんだよなw

何がしたいのかは言わない。
ライブラリのクラスに後からインターフェースを追加することが
目的なんだって臆面もなく言ってしまうw
0533デフォルトの名無しさん
垢版 |
2017/04/16(日) 18:34:11.12ID:aIkdKg/w
>>531
あるよ

たとえばあるライブラリがAというクラスのオブジェクトを返したとする
これを別のライブラリか自分で作ったクラスのの引数として使いたいけど、その引数はBという
インタフェースを要求する

Aというクラスは字面の上ではBというインタフェースを満たしているのだが、Bというインタフェースを
implement しているわけではない

さてどうしよう
Bというインタフェースを持つクラスを自分で定義してコピーする?こんな余計なことしなきゃいけない
のは生産性の低下以外の何物でもないわな

これは一例であって他にも同様の例はいくらでもある
0534デフォルトの名無しさん
垢版 |
2017/04/16(日) 18:43:08.06ID:cCOM2/u0
>>533
なんでAというクラスが、Aとは全く関係のなく作られたBというインターフェースを
たまたま運良く満たすなんて自体が起きるんだよw

ありえないだろ。

それよりか引数が違うのに、同じ名前のメソッドを定義してしまっていた
どうしようって思うほうが可能性高いわw
0535デフォルトの名無しさん
垢版 |
2017/04/16(日) 18:46:33.36ID:cCOM2/u0
Aというクラスは字面の上ではBというインタフェースを満たしているのだが、
Bのバージョンアップでインタフェースが変わってしまった。

だけど、Aというクラスがたまたま古いBのインターフェースと
一致していたという前提をどこにも書いていなかったので、
動かなくなる原因の判明に時間がかかった。

そのためにコメントをしっかり書くようにした。

A は B interface を implements しているよと
0536デフォルトの名無しさん
垢版 |
2017/04/16(日) 18:50:50.79ID:aIkdKg/w
>>534
ありえるんだよ、これが
しかもしょっちゅう
(俺は静的型言語でも開発してるからよく出くわすよ)

たとえば、Serializable なんか典型じゃないかな
そのまま Serialize したいのになんで Serializable インタフェース持ってねぇんだよ!
みたいなのはほんといくらでもあるよ
0537デフォルトの名無しさん
垢版 |
2017/04/16(日) 18:53:05.94ID:cCOM2/u0
このようにダックタイピングを使うとその場しのぎで直ぐに対応できるように思えるけど
長い目で見れば、可読性の低下を招き、メンテナンス性、生産性を下げることになってしまう。

書いたら終わり、メンテナンスが不要な書捨てのプログラムぐらいにしか
使わない方がいい。

そして、書捨てのプログラムをよく書くのはインフラ系が多い。
インフラ系で必要とされるのはオブジェクト指向も必要ない
数行程度のスクリプト。シェルスクリプトよりは書きやすいぐらいの
理由しか持ち合わせてない

アプリの開発には長期間メンテナンスされるので可読性が重要
0538デフォルトの名無しさん
垢版 |
2017/04/16(日) 18:56:36.72ID:cCOM2/u0
>>536
> そのまま Serialize したいのになんで Serializable インタフェース持ってねぇんだよ!

そのクラスがSerializeする機能を実装してないからだろ?
0539デフォルトの名無しさん
垢版 |
2017/04/16(日) 19:04:01.20ID:cCOM2/u0
http://rubytips86.hatenablog.com/entry/2014/03/19/184940

Rubyでこのシリアライズとデシリアライズを担うライブラリがMarshalモジュールだ。
注意点としてMarshal.dumpでは、無名のクラス・モジュールのオブジェクト、
システムがオブジェクトの状態を保持するIOなど、
Procなどいくつかのインスタンス、特異メソッドを定義したオブジェクトはシリアライズできない。
0540デフォルトの名無しさん
垢版 |
2017/04/16(日) 22:32:15.20ID:AmA5ei6y
第一だよ
全然関係ないライブラリ同士でたまたま字面の上で
メソッド名が一致しているクラスがあるっていう
偶然の一致があったとしても
その動作振る舞いまでもが完全に一致していて
動作的にコンパチブルかどうかは分からないよ
想定してないんだからさ
おおよそ慣例というか習慣というか、その言語ではふつうそうするって
何らかの決まり事みたいなものがあるのなら問題ないかもしれないが
そういう場合は言語側やファウンダメンタリーなライブラリが
インターフェースを定義してくれているから、それ使えばよいわけで
やっぱり関係ないんだよ

そういうメソッド名と振る舞いの両方が偶然にも一致
っていう奇跡偶然に頼るってのが
まさにおまえ自身が>>530で言ってる

>アプリケーションの全クラスが自分の管理下にあればそれも可能かもしれんな

そのものなんだよ、まったくのブーメラン
0544デフォルトの名無しさん
垢版 |
2017/04/17(月) 00:16:09.41ID:W0pN1+cl
要するに、後付で色々したい場合はダックタイピングの方が楽なんだよ。
ただし、全てを見通せるのなら最初からインタフェースにしておいた方が美しいのも事実。

現実的にはJavaScriptはUI用で酷く書き換えを強いられる為、
ダックタイピングの方が向いている。(と俺は感じている)
逆に、仕様がかっちり決まっている場合は型ありでも特に苦労しないし、
数値計算等のバグ出ししにくい状況では型があった方が安心ではある。
(期待値が作りにくい、見た目でバグと分からない)
ただ、UIならバグは見て分かるし、ダックタイピングでも問題ない。
動的言語はパターンを当てないとバグ検出出来ないけど、
UIなら「変更が依頼された」=「パターン持ってる」ってことだし。
0545デフォルトの名無しさん
垢版 |
2017/04/17(月) 01:28:08.77ID:8mjeDRwA
真面目にダックタイピングをやろうとする行為は、型やインタフェースを定義するのと違いがない
だからrubyでダックタイピングを考えてプログラミングしてる人なんているわけない
0546デフォルトの名無しさん
垢版 |
2017/04/17(月) 03:12:15.72ID:LB/3uUQe
>>544
あの、精神論でごまかさないでください?
何一つ、ダックタイピングのほうが良いという理由を
言っていませんよ
0547デフォルトの名無しさん
垢版 |
2017/04/17(月) 07:17:22.30ID:W0pN1+cl
>>546
良い悪いを議論する事じゃないよ。
結局は、どう思うか、どう感じるか、でしかないから。

型には型の得失があるし、ダックタイピングにしてもそう。
選べる状況なら好きな方選べばいいし、無理ならグダグダ言っても意味無いだろ。

利点を感じないのなら、これまでそういう状況に遭遇したことがないか、
或いはそもそもそっち派ではないか。
いずれにしても使わないってことで問題はない。
利点説明おねだり君なんてウザイだけだから止めろ。

http://yohshiy.blog.fc2.com/blog-entry-244.html
未確認飛行の人も同じようなことを言っていたと思ったけど見つからなかったから上記で。
結論出したいのならこの辺だと思うよ。

>>545
ガチでダックタイピングの利点を享受しようとすると、
型に留まらず世界が統一されていないといけないので、実は型よりも難しい。
そしてJavaScriptもそれに対応出来ていない。理由は標準化している奴らが馬鹿だから。
sizeとlengthが混在してるでしょ。
あれ、どっちでもいいけどどっちかに統一されてないといけない。

だから真面目にダックタイピングをやっている奴なんていない、というのは俺も思う。
0548デフォルトの名無しさん
垢版 |
2017/04/17(月) 09:32:26.96ID:LB/3uUQe
> そしてインタフェースをいちいち付けてまわるのは非常に面倒臭いこと

めんどくさい? ダックタイピングではインターフェースがないから
代わりにコメントで同じ情報を書かないといけないじゃん。

インターフェースの情報(コメント含む)を書かないで
それが仕様かどうか分かってもらえると思ってんの?
0549デフォルトの名無しさん
垢版 |
2017/04/17(月) 09:43:33.93ID:oCHN+Sd+
>>540
同じインターフェースを実装してても、それは引数と戻り値の型が一致するだけで
動作振る舞いがコンパチブルかどうかは保証してくれないけどな
JavaやC#みたいなショボい言語では
0550デフォルトの名無しさん
垢版 |
2017/04/17(月) 21:03:29.03ID:LB/3uUQe
>>549
interfaceは"インターフェースを"保証してくれるもので
インターフェース以外は別の話なのは当たり前だと思うが?

「お前型を保証してくれるんだろ?
バグがないことまで保証してくれよ」

っていうのと同じぐらい無茶なこと

普通保証の対象しか、保証しませんってw
0552デフォルトの名無しさん
垢版 |
2017/04/17(月) 23:27:50.92ID:LB/3uUQe
しょぼくない言語なら、
動作振る舞いがコンパチブルかどうかを保証してくれるんだろう?
0553デフォルトの名無しさん
垢版 |
2017/04/18(火) 00:29:01.98ID:n/IUHgwq
>>544
> 要するに、後付で色々したい場合はダックタイピングの方が楽なんだよ。

メソッドや関数のオーバーロードが可能なら静的型でも変わらなくない?
0554デフォルトの名無しさん
垢版 |
2017/04/18(火) 01:27:12.80ID:xAHUlHha
>>553
いや、それだと全部用意しないといけなくなるでしょ。
ダックタイピングだと必要なところだけ用意すればいいし、つまみ食いも出来る。その分楽。

丁度C++のスレが同じ事を言っているけど、
http://echo.2ch.net/test/read.cgi/tech/1490917669/137-
そりゃ全てのオブジェクトが isScrollable や isSerealizable を持っているのが美しいだろうさ。
しかしそれは通常は余計に手間が増えるだろ。
インタフェースが肥大化するか、基底クラスが肥大化するかで。

だったらJavaScriptみたいに、
var obj_serialized = (obj.serialize)? obj.serialize() : null;
とか、
SomeObj.prototype.serialize = function(){};
とか、出来たら融通は利くでしょ。少なくとも「今」やりたいことは出来るようになる。
それが後々逆に足を引っ張ることになるかどうかは腕次第でしょ。

ただし、どっちが楽かという話であって、
出来るか出来ないかで言えば、同じだよ。同じ事を逆からアプローチしてるだけだから。
JavaScriptについて言えば、
初期状態は全ての名前のメソッドを定義してあるが、実装してない状態だと言える。
だから未実装ならundefinedが返ってくるし、実装済みなら使える。
C++とかだと、初期状態は全く定義がなくて、自分で全て追加しないといけない。
でも全てのダックタイピングを可能にしようとしたら、
型消去するなりして全てのインタフェースに対応しないといけなくなる。
これってJavaScriptの初期状態と同じでしょ。

C++のテンプレートは空回り感が酷い。
UIなんて張り切って実装しても意外に糞だったりするので、
とりあえず実装してから確認したいってのはある。
そういう時はJavaScriptみたいな、とりあえずサクサク実装出来る言語の方が向いている。
0555デフォルトの名無しさん
垢版 |
2017/04/18(火) 02:34:37.34ID:ibb6Zkrz
>>554
シリアライズのことしか考えてなくて、しかもシリアライズメソッドさえあれば
何でもかんでも簡単にシリアライズできるんだって思ってるみたいだけど、
まず前提として、いかなる言語も汎用的なシリアライズはなという話をしようか?

これが大前提なので、あとからシリアライズメソッドつければ、
シリアライズできて便利ーにはならないんだよ。
通常シリアライズメソッドは後から追加できないものと考えるべき。

例外的に可能なものもあるけど、あとからシリアライズメソッドを追加できるならば、
obj.serialize() ではなく、Serializer.serialize(obj) とやることで目的は達成できる。
あんたがやろうとしているのは、単にシリアライズ処理を
インスタンスメソッドにしたいと言っているだけ。
0557デフォルトの名無しさん
垢版 |
2017/04/18(火) 07:25:53.47ID:V4ah9bya
>>554 C++のテンプレートは空回り感が酷い。 とりあえず実装してから確認したいってのはある。

激しく同意する。

An one-liner で書けるようなものでは、型の恩恵などない。Local,global の峻別さえ無意味だ。そのようなときは duck typing で書かねば損だ。

逆に duck typing で一万行を超えてくると、強烈に型が欲しくなる。
0558デフォルトの名無しさん
垢版 |
2017/04/18(火) 07:30:18.04ID:V4ah9bya
>>554 そういう時はJavaScriptみたいな、とりあえずサクサク実装出来る言語の方が向いている。

俺は JavaScript(というより TypeScript) を使っていない。昔一舐めしただけだ。それ
に本格的に手を出すべきか迷っている。意見を貰いたい。

JavaScript を押す人たちのコードを見ていると、Python のほうが三倍程度は濃密な
コードで書けそうに見える。その理由は質の良いライブラリが揃っていることにある。

例えば N 重ループの iterator を Python ならば下のように書ける。JavaScript で、
こんな濃密なコードを書けるだろうか。

N=3; import itertools as md; list(md.product(*[range(3)]*N))
===============================
[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 1, 0), (0, 1, 1), (0, 1, 2), (0, 2, 0),
(0, 2, 1), (0, 2, 2), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 1, 0), (1, 1, 1),
(1, 1, 2), (1, 2, 0), (1, 2, 1), (1, 2, 2), (2, 0, 0), (2, 0, 1), (2, 0, 2),
(2, 1, 0), (2, 1, 1), (2, 1, 2), (2, 2, 0), (2, 2, 1), (2, 2, 2)]
0559デフォルトの名無しさん
垢版 |
2017/04/18(火) 09:47:58.51ID:1155c42j
>>550
そんなショボいものしか保証してくれないの?
まったく安心して使えないね
動的型付けと大差ないじゃん
0560デフォルトの名無しさん
垢版 |
2017/04/18(火) 09:54:21.27ID:1155c42j
動作を保証しないから問題だって言った(>>540)直後に
動作を保証しなくて何が悪いと返せる(>>550)って凄いねw
そのチンパンジー並みの記憶力は賞賛に値するよ
0561デフォルトの名無しさん
垢版 |
2017/04/18(火) 21:12:55.65ID:xAHUlHha
>>558
俺はPythonは知らないのでJavaScriptとの比較は出来ない。
ただPythonはクロージャに難ありなので今後も使う気はない。
改行が強制されるのも気に入らない。

JavaScriptは書いてて気持ちがいいんだよ。
理由は簡単で、全て具だから。
型等の動作には関係ない物がないから、動作に集中出来る。
なるほどMatzが目指したのはこれだったのか、というのは分かった。
だから俺が次にやるとしたらRubyだね。

今のところ、俺は型自体はは要らないという結論だ。
名前通りの型しか付けないので、見りゃ分かる。
ただ、現実として、実行前にタイプミスを見つけてくれないから困っている。
ダックタイプや動的に使う場所なんて限られているのだから、
そういう場所に対してワーニング出してくれるだけでいいんだが。
そのためのリントを探してはみたものの、
JavaScriptのリンターはそんな方向では全くなかった。

あと、C++が糞なのはクラスは全て独立で親クラスを掴めないことだ。
だから細かくクラスを階層化出来ない。というか、やると余計に手間が増える。
ここら辺はJavaでは改善されていて、明示的に掴めるし、
JavaScriptではデフォで掴んでる。(レキシカルスコープ)
粗結合を目指すのならJava方式がいいし、
お気楽を目指すのならJavaScriptの方がいい。

ところで初心者はそういう「短く書ける方がイイ」みたいなことをよく言うが、
君が本当に一万行のコードを書ける奴なら、それは意味無いと分かるだろ。
そしてそれをここで聞くのも意味無い。
だって俺の腕前なんて未知数だし、ここでは無駄に吠える初心者も多いし。
一般論としては、Pythonはキャズムを越えているっぽいから、
学んでも無駄にはならないと思うよ。
0562デフォルトの名無しさん
垢版 |
2017/04/18(火) 21:41:20.30ID:xAHUlHha
ああすまん、質問はPythonではなくて、JavaScriptを学ぶべきか?だったか。
俺が勘違いしてた。

これは俺は正確には答えられないね。
俺は他言語使えるわけではないし。
そもそも道具なんだから、今困ってなければ学ぶ必要はないだろ。

新しいプログラミングを学びたいというのなら、
結局どの言語も似たり寄ったりの方向に進化しつつあるし、
とりあえず「進化している言語」を一つ追跡しておけば問題はないだろ。
一番速いのは多分Rubyだろうし、この点ではPythonは遅いほうだよ。
同様に、この点でJavaScriptを選択する意味はない。

逆に、今使うというのなら、グダグダ言う意味もないだろ。
Web環境ではJavaScript以外の選択肢はないんだし。
0563デフォルトの名無しさん
垢版 |
2017/04/18(火) 22:41:32.37ID:ibb6Zkrz
>>560
> 動作を保証しないから問題だって言った(>>540)直後に
> 動作を保証しなくて何が悪いと返せる(>>550)って凄いねw

なんの動作?

ねぇねぇ、なんの動作?

わざとぼやかしてるでしょwww
0564デフォルトの名無しさん
垢版 |
2017/04/18(火) 22:42:21.03ID:ibb6Zkrz
あとそれから>>540は俺じゃないからねw
IDすら見えない?

チンパンジーになみの理解力だった?w
0565デフォルトの名無しさん
垢版 |
2017/04/18(火) 22:43:49.88ID:ibb6Zkrz
>>561
> JavaScriptのリンターはそんな方向では全くなかった。

TypeScriptがお前が望むものだよ
型を導入したJavaScriptだ。
いまあちこちで普及してる。
0566デフォルトの名無しさん
垢版 |
2017/04/18(火) 22:45:23.23ID:ibb6Zkrz
>>561
> ところで初心者はそういう「短く書ける方がイイ」みたいなことをよく言うが、
> 君が本当に一万行のコードを書ける奴なら、それは意味無いと分かるだろ。

え? なんで?

同じ一万行なら、短く書ける方がより多くの機能を実装できるから
やっぱり短いほうが良いじゃんw
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況