X



次世代言語23 Go Nim Rust Swift Kotlin TypeScript
レス数が1000を超えています。これ以上書き込みはできません。
0002デフォルトの名無しさん
垢版 |
2021/11/28(日) 17:09:04.49ID:zG9nrje+
▼スレタイ言語ランキング
1位:Rust(22回 Part1〜)
2位:Go(16回 Part1〜)
3位:Kotolin(15回 Part4〜)
4位:TypeScript(15回 Part7〜)
5位:Swift(11回 Part7〜)
6位:Haskell(7回 Part7〜)
7位:Scale(5回 Part1〜)
8位:Elixir(4回 Part1〜)
9位:Dart(3回 Part9〜)
10位:Julia(3回 Part14〜)
11位:Nim(3回 Part21〜)
12位:Erlang(2回 Part1〜)
13位:Crystal(1回 Part14〜)
14位:Bosque(1回 Part17〜)
15位:V(1回 Part19〜)
0007デフォルトの名無しさん
垢版 |
2021/12/01(水) 20:56:51.44ID:hrJpZ9c9
JavaScriptはブラウザが解する言語がそれしかないから人気と言うか使わざるを得ない
0010デフォルトの名無しさん
垢版 |
2021/12/01(水) 21:50:01.36ID:kIBZKc1x
rubyやobjective-cより下の13位から上がるどころか新規のdartに抜かれて14位に落ちてるんだがwwww
0012デフォルトの名無しさん
垢版 |
2021/12/01(水) 23:04:28.42ID:dwiuqH4z
DartにはFlutterっていうキラーアプリがあるからね
みんなFlutter使いたくてDartを使ってるだけっしょ
0013デフォルトの名無しさん
垢版 |
2021/12/02(木) 00:48:53.78ID:1aORNnKD
>>6
> ・Rust
>  過去2年間、他のどの言語よりも急速にユーザー数を伸ばしている。
>  Rustを使う開発者は、2019年第3四半期には40万人だったが、2021年第3四半期には110万人に達し、ほぼ3倍に増えた。

すごい勢いで増えているね。
0014デフォルトの名無しさん
垢版 |
2021/12/02(木) 01:20:43.38ID:DzaJCHIY
rustは元がゴミすぎて3倍近く増えても順位は上げられずdartに瞬殺されて順位落としてるじゃんwwww
0016デフォルトの名無しさん
垢版 |
2021/12/02(木) 01:40:17.24ID:/aa76ADO
Flutterらへんのカテゴリは、システムプログラミングらへんとはユーザ数が桁違いだからな
0019デフォルトの名無しさん
垢版 |
2021/12/02(木) 09:23:40.40ID:DzaJCHIY
flutterなんて流行り始めてしばらく経つけどほとんど出てきてないし、どの言語もguiのbindingくらい持っているんだが
dartは昔から何かと出てきたけど、flutterで注目されて爆発したイメージ
何にせよrustは元々ゴミで注目された今もゴミということ
0022デフォルトの名無しさん
垢版 |
2021/12/02(木) 11:01:41.70ID:tDBmLQtJ
数だけで優劣が決まるならJSの圧勝だね
Rust理解できない子が、大歓喜するのも仕方がない
0023デフォルトの名無しさん
垢版 |
2021/12/02(木) 12:01:49.37ID:/aa76ADO
でも >>6 の データを見ると、SwiftやGoの半分ほどもRust開発者いるの? って思ってしまうなあ
自分の身近が偏ってるだけで、どこかにはRust開発者がたくさんいるんだろうか
0025デフォルトの名無しさん
垢版 |
2021/12/02(木) 12:52:13.85ID:ZpHx+XCK
rustで書かなきゃならんほどランタイム速度必要なとこなんてほぼないけどな。
組み込みにはメモリデカすぎだし、数値計算、アルゴリズム分野じゃ共有のめんどくささから使われんし、
本当にごくごく一部しか使い道がない。
ほとんどはファッションでrust理解してる俺すげーーしたいだけのカスユーザーだろ。
0026デフォルトの名無しさん
垢版 |
2021/12/02(木) 13:02:43.82ID:uPC6Zyta
現状C++じゃない領域にも適用しようといてるん?
個人的にはエンジニアの底上げになってうれしいけど
0027デフォルトの名無しさん
垢版 |
2021/12/02(木) 13:10:28.97ID:KDPeqseB
discodeはバックもフロントもgoからrustに移行したな
遅延がサービス品質に直結してるようなアプリなら移行する価値があるんだろう
0028デフォルトの名無しさん
垢版 |
2021/12/02(木) 13:12:35.29ID:t0ccWHUc
逆にフロントエンドだけでなくバックエンドもDartで書こうという話も出てる
書けるようになったから書いてねという発表があった程度だけど
0030デフォルトの名無しさん
垢版 |
2021/12/02(木) 13:48:49.03ID:7kQFmmWN
>>25
それはアンチ的視点だからそんな偏った見方になってしまうのであって
現実にはどの分野でもRustに置き換えるとかなり高速化されるか
あるいは旧C/C++分野ではかなり安全化されるのでその両分野からじわじわと話が出てる
0031デフォルトの名無しさん
垢版 |
2021/12/02(木) 13:56:00.28ID:Axtkc4m/
実際にはRustほどのパフォーマンスがいらなくても
型が強くてそこそこ速いって選択肢があまりないんだよな
Goくらいの速度でいいとしても、あの言語機能には
耐えられないって場合はRustになってしまう
ランタイムありで良ければJVM系とかC#もいいんだけど
0032デフォルトの名無しさん
垢版 |
2021/12/02(木) 14:41:59.12ID:/aa76ADO
C++の巨大プロジェクトは絶対にメモリ関連のバグがたくさんあるからな・・・。
0033デフォルトの名無しさん
垢版 |
2021/12/02(木) 14:54:42.94ID:DzaJCHIY
C++とtypescriptやってる人は大抵rustもやってそう
>>25の意見は正しいと思う
rust推しだったけど意味不明な推しが多くて最近はもうgoでいいって思った
0034デフォルトの名無しさん
垢版 |
2021/12/02(木) 15:11:50.02ID:1aORNnKD
>>31
それはある
強力な型の扱いや関数型言語に近い性質などが非常にプログラミングしやすくてRustは言語のセンスが良い
高速になるとか安全になるとかはオマケとして付いてきたw
0037デフォルトの名無しさん
垢版 |
2021/12/02(木) 16:28:07.24ID:1aORNnKD
NimはRustのような値付きenum及びそのパターンマッチングがないから使えん
Nimだとオブジェクトバリアントが限界で機能不足
0038デフォルトの名無しさん
垢版 |
2021/12/02(木) 16:32:00.04ID:DzaJCHIY
どちらもどうでもいいよそんなの趣味の範疇
オマケだというならgoの圧勝で終わり
0041デフォルトの名無しさん
垢版 |
2021/12/02(木) 16:50:41.52ID:/aa76ADO
パフォーマンスどうでもよくて、そういう好みなら、ScalaとかHaskellが合うかもね
0043デフォルトの名無しさん
垢版 |
2021/12/02(木) 17:12:39.13ID:/aa76ADO
そうね、Rustはいろいろなシンタックスが用意されててすごいよ

パフォーマンスがどうでもいいなら、borrow checkerとかで安全にしてるRustより、
GCを使いつつ参照透過性を保つHaskellのほうがいろいろ整然とされてて見通しが良い気がする

まあいろいろ好みや、向き不向きとかあるだろうけど
0045デフォルトの名無しさん
垢版 |
2021/12/02(木) 18:08:26.45ID:Axtkc4m/
Nimも機能少ない方だから、Goでいいじゃんってなりがち
そういう意味ではGo/Rustの次世代って難しいな
GoとRustでシンプルと複雑の限界まで振ってあるから
その中間解を取ってしまうと中途半端になるという
0046デフォルトの名無しさん
垢版 |
2021/12/02(木) 18:51:26.15ID:KvHBMpNF
goはテンプレート有れば私的には文句ねぇが現今のinterfaceのアプローチと異なる且つ重複する部分が多くきな臭いよね
ただまぁあそこまで洗練されたcoroutine featureは他に見ないしgcの改良だけでもいいかなとも思う
0047デフォルトの名無しさん
垢版 |
2021/12/02(木) 19:24:47.38ID:DzaJCHIY
nimはオリジナリティがなく器用貧乏な感じ
golangだけでなくどの言語も独自の進化を続けているだけで機能不足なわけじゃない
rustは高速性と安全性を取ったら何も残らないゴミクズ
0048デフォルトの名無しさん
垢版 |
2021/12/02(木) 19:39:44.60ID:bf1zh15c
元rust推し装うの笑う
もう流れはとめられんよ
0049デフォルトの名無しさん
垢版 |
2021/12/02(木) 19:42:44.71ID:7kQFmmWN
>>47
Go信者は根拠なくデタラメに他言語たちを罵倒するのはどうして?
理解できないから具体的に指摘できないため?
0050デフォルトの名無しさん
垢版 |
2021/12/02(木) 19:57:21.48ID:CTB0TicX
あわしろ氏はRustを使うべきと言ってる。
0051デフォルトの名無しさん
垢版 |
2021/12/02(木) 21:14:08.06ID:DzaJCHIY
元々rust推しなのは事実だからなw
ただ俺が推してるのはごくごく一部の高スループットや巨大データを扱うサーバーやデータベースなどの分野であって
OSなどハード寄りや普通のアプリで向いているとは思っていない
rustの流れなんて誰も作ってないし意識もしてないと思う
自然に流れが出来るなら流れに任せるけど違和感しかなければ推せなくなる
根拠がないのは客観的な話ではなく、主観をそのまま言ってるからだよw
あと俺はgo推しじゃないし、汎用なやつだと消去法で総合的にgoのコスパが一番いいと思ってるだけ
0052デフォルトの名無しさん
垢版 |
2021/12/02(木) 21:28:41.46ID:1aORNnKD
>>51
具体的にRustを使って何が問題なのかをどうぞ
コピペでは無理な具体的かつ詳細な説明をお願いします
0053デフォルトの名無しさん
垢版 |
2021/12/02(木) 22:01:59.81ID:4Bycw8L4
Nimは言語自体の機能は必要最低限にしてtemplateやmacroでユーザが自由に言語の機能を拡張できるようにしようという考えだから。
0054デフォルトの名無しさん
垢版 |
2021/12/02(木) 22:14:35.17ID:DzaJCHIY
分かるだろw 議論しても荒れるだけだから無駄
大雑把に言って初心者に難しい理由の説明しづらいルールが多いから一般向けに流行らないということ
nimについてはそうだね
0055デフォルトの名無しさん
垢版 |
2021/12/02(木) 23:08:40.70ID:kbiEbenW
ゴミクズとまで言い切った割には普通の話だな…
PythonやJSから入った初心者に勧めるならそりゃGoだろう
0056デフォルトの名無しさん
垢版 |
2021/12/02(木) 23:59:00.94ID:DzaJCHIY
そうだよ大雑把な話でないと定義や粒度が合わなくてそもそも話せないからな
あとrustから「高速性と安全性を取ったら」って前提を抜かないでゴミクズだけ引用しないでくれ
0057デフォルトの名無しさん
垢版 |
2021/12/03(金) 00:16:18.89ID:MdLkNSga
こいつネット記事で聞き齧った程度の
浅いことしか言えてないし
実際はrustで hello world 書いたことすら無さそう
0059デフォルトの名無しさん
垢版 |
2021/12/03(金) 04:23:17.06ID:uToCzuWA
何をもって「安全」とするのやら
非同期回りも含めるとスクリプト系だいたい全部アウトになります?
0060デフォルトの名無しさん
垢版 |
2021/12/03(金) 04:45:15.91ID:DrOtnAT7
なんのことやらしらんけど、Rustや他の参照透明性のある言語のことを言いたいのかな
0062デフォルトの名無しさん
垢版 |
2021/12/03(金) 08:53:10.36ID:kWOLQTcK
>>59
マルチスレッドでのデータ競合を入れるならコンパイル型もほぼアウト
実際静的にチェックできるのはRustくらいじゃない?
Goなんかはgoroutineで気軽にデータ競合しうるから、コンパイル時にチェックできるといいんだけどなぁ
0065デフォルトの名無しさん
垢版 |
2021/12/03(金) 09:15:22.04ID:UM4QUqUK
またしょうもない定義の話になってるし・・・
分かれよw 変なところに噛み付いてないで自分の意見をちゃんと言え
0066デフォルトの名無しさん
垢版 |
2021/12/03(金) 12:02:53.40ID:RidNMi7I
rustは言語処理系書きやすい
安全性とか高速さは関係なくて代数的データ型が使いやすければ他の言語でも代替はできるとは思うが
rustが一番使い慣れてるのでrustで書いている
0069デフォルトの名無しさん
垢版 |
2021/12/09(木) 01:13:30.58ID:5YfzBk4D
このスレの言語で挙げられてる問題すべて解決してるものある?
NimはCにコンパイルされるからブートストラップの問題も対応アーキテクチャの問題もなくなるのかな?
0071デフォルトの名無しさん
垢版 |
2021/12/09(木) 12:38:32.33ID:9kW8IukA
むしろブートストラップの問題が表面化してる点はもうrustの圧勝って話に見える
0072デフォルトの名無しさん
垢版 |
2021/12/10(金) 10:43:45.25ID:6OnwijQi
>>69
Nim言語のコンパイラはNim言語で書かれているんだけどCコンパイラさえあればビルドできるようになっている。
Nimコンパイラをソースコードからビルドするときは、Nimのコンパイラから出力されたC言語のNimのソースコードのリポジトリnim-lang/csources_v1をビルドしてから最新のNimコンパイラをビルドするようになっている。
https://github.com/nim-lang/Nim#compiling
0073デフォルトの名無しさん
垢版 |
2022/01/26(水) 05:57:30.61ID:22SsmXBb
サーバーサイドは本当にGoが丁度いいな
typescriptと構文にてるし、node.jsから移行しやすいのが最高
0074デフォルトの名無しさん
垢版 |
2022/01/26(水) 20:59:23.59ID:lCcD9DKz
NimがGoとRustの間を縫って次世代トップに躍り出る予感
巨大IT企業のバックアップが付けば一気に跳ねると思う
0075デフォルトの名無しさん
垢版 |
2022/01/26(水) 21:09:35.46ID:dhhZJlzR
GoやRustと比べると言語としての魅力がよくわからないんだよな。
オフサイドルールスキー専用言語?
0076デフォルトの名無しさん
垢版 |
2022/01/26(水) 21:25:25.23ID:4Kazumf5
Nimなんか別に誰も使ってないし特に期待もされてないでしょ
世の中に山ほどある俺言語の一つに過ぎないよ
0077デフォルトの名無しさん
垢版 |
2022/01/26(水) 21:59:22.52ID:VTF5khmL
Nimはわざわざ選択する理由がないんだよな
楽に書くならGoだしちゃんと書くならRustなわけで
もうちょっと特徴が欲しい
0078デフォルトの名無しさん
垢版 |
2022/01/26(水) 22:07:13.93ID:EiswyKlB
1. 実行速度、バイナリサイズ、メモリ使用量
→CトランスパイルなのでCに近い値

2. 安全性
→メモリ安全性高い

3. 生産性
→スクリプト言語並み

4. 機能性
→シンプルな機能と、強力なメタプログラミング

Nimは1・2と3の両立性が高く、比肩する言語が無い
3と4は常にトレードオフなので正解が無いが、Nimの割り切り方は良い
0079デフォルトの名無しさん
垢版 |
2022/01/26(水) 22:16:29.06ID:EiswyKlB
GoもRustも実行速度とメモリ使用量が大きすぎるし、C/C++は生産性や安全性に問題が大きすぎる
その打開策としてNimを使う事ができる

複数言語を使い分けるよりも、1つの言語でまかなえるならば、学習コストや再利用性の面から越したことはないしね
0080デフォルトの名無しさん
垢版 |
2022/01/26(水) 22:23:32.14ID:EiswyKlB
ただ他の言語と違ってコミュニティが貧弱すぎるのが欠点
言語性能自体とは直接の関係はないが、こればっかりは痛い
大手企業とか人気ソフトに使われる様なきっかけが無いと永遠に人気に火がつかないままだと思う

Go/Dart/KotlinはGoogle、Rust/JuliaはMozila、SwiftはAppleの後押しがあるけど、Nimは一切そういうの無くて、コアな人気だけが細々と支えてる状態
0082デフォルトの名無しさん
垢版 |
2022/01/27(木) 00:32:14.69ID:9sHDXdIz
>>78
1と2ってGo/Rustくらいの世代だとほぼ標準装備なんだよね
そりゃ多少の優劣はあるだろうがアプリの特性差やプログラマのスキル差から考えると誤差
そうすると構文が一部の人にマッチするって部分しか残らない感じ
0084デフォルトの名無しさん
垢版 |
2022/01/27(木) 09:32:04.47ID:P89ZTXWu
nimはd言語の二の舞
0085デフォルトの名無しさん
垢版 |
2022/01/28(金) 09:21:04.21ID:GM/JWe9P
nimは、goと比べると今風の書き方が出来るのが良いかな。
でも、コミュニティが弱いのが辛い。
0086デフォルトの名無しさん
垢版 |
2022/01/31(月) 06:52:54.15ID:NqM0xBel
https://kdy1.dev/posts/2022/1/tsc-go
tscの型チェック機能をgoで書き直すらしい、vercelが支援してるみたい
初めはテストとしてrustで書き直して型チェック速度が62倍になって
ただ、rustで書き直すのは適していないと考えてgoに移植することを選択したと

フォーラム https://news.ycombinator.com/item?id=30074414
0087デフォルトの名無しさん
垢版 |
2022/01/31(月) 07:42:59.19ID:qlFEomu1
>>86
要約

一部Rustで書き直してテストしたら62倍速となり当然速かったけど
tscのコード全体がGCに依存しまくっているため移植ではなく全面書き直しとなってしまう
そこで妥協案としてGCで動作するGoへ移植することにした
0088デフォルトの名無しさん
垢版 |
2022/01/31(月) 09:04:41.29ID:MPqeYEvw
こんなもん本家の開発についていけなくなって早晩放棄されるのが目に見えてるだろ
まだRustだったらMSが支援してくれる可能性もあったかもしれないけどね
完全に手段が目的化している不毛なプロジェクトの典型だな
0089デフォルトの名無しさん
垢版 |
2022/01/31(月) 09:05:57.74ID:Ph6Okw9C
SASS なんて、元々のRuby から、
多言語でも使えるように、C++ のnode-sass(LibSass)へ移植したけど、
開発が難しすぎるから、頓挫した

今は、Dart Sass

Dartもマイナーな言語だし、
TypeScript か何かで作らないと、また開発に行き詰るかも

C/C++, Rust など実行速度が速い言語は、開発が難しすぎる。
可読性が悪く修正できないので、開発費・開発期間が増える
0090デフォルトの名無しさん
垢版 |
2022/01/31(月) 10:12:07.29ID:qlFEomu1
>>89
C/C++の可読性の悪さは
Rustで改善されていてとても使いやすくなっている
GC依存で設計された既存システムをそのまま移植するのは無謀だが
最初からGCに依存せずに設計が可能でありRustなら可読性が問題になることはない
0091デフォルトの名無しさん
垢版 |
2022/02/01(火) 01:49:52.13ID:vhj8p7kX
自分はRustのCargoとその気になればunsafeで自由に書けるのが気に入ってる
Rustはとにかく美しいと思うな
0092デフォルトの名無しさん
垢版 |
2022/02/01(火) 01:53:40.31ID:0bEAn4zq
たしかに、Cargoらへんのエコシステムに関してはC++とは勝負にすらならないな
npmを反面教師にしたのかな、よくできてるよね
0093デフォルトの名無しさん
垢版 |
2022/02/01(火) 14:13:16.30ID:Az2aYbYt
Rustが美しいと思うのはどういう点なのか、具体的に聞きたくなる。これはC/C++と比べてる話じゃなく現代的な言語の話で
無駄にタイプ量が多くマクロと言語が一貫してなく、アトリビュートも独立しおり言語との一貫性が全くない
0094デフォルトの名無しさん
垢版 |
2022/02/01(火) 14:17:41.49ID:Az2aYbYt
例えば const fnやコンパイル時定数などはコンパイル時にコードを動かして計算したりするが、一方でアトリビュートで
#[cfg(unix)]とかやったりして思想がバラバラ、まあ破綻はしてないしC/C++のマクロなんかと比べれば100倍ましだけど
0095デフォルトの名無しさん
垢版 |
2022/02/01(火) 14:19:22.77ID:fJKShZ3h
>>93
型推論も賢く強力な静的型付け言語なのにタイプ量は少ない
アトリビュートが言語本体と独立していて区別しやすくプログラミングする上で見やすい
0096デフォルトの名無しさん
垢版 |
2022/02/01(火) 15:56:11.68ID:aP+3H5wQ
>>93
マクロと言語が一貫してる言語ってどういうイメージなんだろう
Lispしか思い浮かばなかったけどさすがに違うよね
0097デフォルトの名無しさん
垢版 |
2022/02/01(火) 19:27:41.48ID:vhj8p7kX
>>92
Cargoが良すぎて今まではちょっとしたスクリプトをPythonで書いてたのだけど
そういうのも全部Rustで書くようになってしまった

>>93
むしろこのアトリビュートが好きで
同一ファイルにtestをちゃちゃっと書けるのだったり
あーこれこれ、こういうのが欲しいんだよってのがほぼ全て揃っている

大小様々なソフトウェアを書くためにやっと人類が手に入れた言語かなって
だがなんかマンセーしすぎてスマソ
0099デフォルトの名無しさん
垢版 |
2022/02/02(水) 20:32:31.23ID:yDHN0aKU
>>93
マクロはRustの言語ルールを満たしていなくてよいところが要点
その定義文法も変換が主たるものだから別記法が理に適っている

>>98
Rustは強力な静的型付けにより安全と効率を両立させている
結果としての型名が長くなることがあっても
強力な型推論およびトレイト静的実装型宣言により実際の型名を記述する必要がない
その例は極端な特殊な例にも関わらず同様にして最終型名を記述せずに済んでいる
0100デフォルトの名無しさん
垢版 |
2022/02/03(木) 02:33:37.86ID:u6HUT2aq
もしかしてrustってめちゃくちゃ完成度高くね?
バックエンドだけじゃなくて
wasmでブラウザのフロントエンドにも進出してくるっぽいし
typescriptのシェアも奪いそう
0101デフォルトの名無しさん
垢版 |
2022/02/03(木) 11:10:49.98ID:6/uRDE/t
Go人気らしいけど嫌い
やっぱりC++使いはRustに行くべきなんかな
0105デフォルトの名無しさん
垢版 |
2022/02/03(木) 18:00:00.71ID:I6DodtQJ
アルゴリズム自体の記述には自然言語か疑似言語かpythonみたいなスクリプト言語使うのが多いのでは

「アルゴリズムを書く」ってアルゴリズムを使ったプログラムを書くという意味?
そうだとしたら対象が広すぎるのでもうちょっと具体化して欲しい
0107デフォルトの名無しさん
垢版 |
2022/02/03(木) 18:07:41.52ID:I6DodtQJ
アルゴリズムと一概に言ったってソートみたいなのは別にrustでも普通に書けるでしょ
どういうアルゴリズムを実装しようとして困ったのか教えて欲しい
0108デフォルトの名無しさん
垢版 |
2022/02/03(木) 18:24:36.45ID:2zDY1ewV
じゃあB-tree、赤黒木、ダイクストラ、フィボナッチtree、なんでもいいから書いてみりゃいいよ。
0110デフォルトの名無しさん
垢版 |
2022/02/03(木) 18:59:23.99ID:Ajxf7YAY
変な日本語だな
アルゴリズムの勉強には向いてない、ということを言いたいんだろうけど
0111デフォルトの名無しさん
垢版 |
2022/02/03(木) 19:05:25.62ID:2zDY1ewV
どうでもいいイチャモンづけにこだわるやつだな。。
だから実際組んで見ろって。。何もしないくせに。
0112デフォルトの名無しさん
垢版 |
2022/02/03(木) 19:12:44.13ID:I6DodtQJ
新しいrustの弱点の話聞けるかと思ったら結局いつものグラフ構造の話だったので興味を失ってしまっただけです
0113デフォルトの名無しさん
垢版 |
2022/02/03(木) 19:23:59.05ID:5yAN5s9n
>>112
Rustでキューとかスタックとかって便利に使えるの?

所有権の関係で、要素をいじるときはpopしてから操作するのかしらん?
0114デフォルトの名無しさん
垢版 |
2022/02/03(木) 19:34:47.62ID:I6DodtQJ
>>113
普通は get_mut に類するメソッドが用意されててコレクションから取り出さなくても編集できるはず
同じコレクション内の他の要素への参照を持たせようとすると難しいかもね
0115デフォルトの名無しさん
垢版 |
2022/02/03(木) 19:51:02.49ID:5yAN5s9n
>>114
サンクス。
さすがにスタック・キュー(所有者)に要素の操作を移譲するようなことはしないか。実用上は妥当なところか。
0116デフォルトの名無しさん
垢版 |
2022/02/03(木) 19:57:30.61ID:uKT4xKIF
>>113
言語と切り離して論理的に考えた時に
安全な構成と操作ならばRustでも簡単
危険な構成や操作ならばRustでは出来ない(unsafe使えばCと同じ操作が可能)

さらに加えて
危険な構成や操作に成り得るが
限られた一貫した用い方をしている限り安全な場合
新たな型を作って危険な操作を内部に閉じ込めてしまい
安全な操作のみ外部に提供することで利用者はunsafeを用いずに済むことができる
Rustの標準ライブラリもそのようにして作られている
0118デフォルトの名無しさん
垢版 |
2022/02/04(金) 00:36:32.80ID:uF1Qc9S6
>>117
そこはグラフも表現できないクソ雑魚言語乙ってあおるべきなのになんで下手くそな人格攻撃してしまうのか
0119デフォルトの名無しさん
垢版 |
2022/02/04(金) 12:24:28.50ID:gER3CGZG
具体的にするならミュータブルなグラフ構造をスレッドセーフに扱うのは人類が思っている以上に難しいことで、それを言語側の制約で扱うならこうならざるを得ないくらい難しい問題だ、ということではないの?
0120デフォルトの名無しさん
垢版 |
2022/02/04(金) 13:24:42.43ID:ZD21CbAH
例えば何かノードをたどっている最中にいつの間にか戻り先が変わってるとかいちいちケアしてコード書けないから、結局排他処理やスナップショットすりなんらかの工夫が必要
データ構造の操作だけ完璧に仕上げても応用きかないからそこまで深く考える必要ない
0121デフォルトの名無しさん
垢版 |
2022/02/04(金) 15:25:21.40ID:ZnSz9FK0
そうね
スレッドセーフを諦めれば他の言語に近いくらいに簡単にできるのではないか
0122デフォルトの名無しさん
垢版 |
2022/02/04(金) 15:44:53.55ID:E1vT/glc
C言語→Rustするトランスパイラーですべて解決じゃね?
Rustだからメモリも安心安全だぞ
0123デフォルトの名無しさん
垢版 |
2022/02/04(金) 17:43:24.41ID:7ZNTSlZY
>>95-99
今どきのコンパイル型言語で型推論が強力でない言語なんてありますか?#[attribute(key = "value", value2)]とか書いててタイプ量は少ない?
最近は自作のアトリビュートが書けるようになりましたが、普通は言語サブセットは小さくして、そのサブセット言語でアトリビュートを実現してれば
このように無理やりカスタムアトリビュートを出す必要はなかった。
一番の最低なところはCargoだと思う、これのせいでコンパイルが異常に遅い。Pythonでもpipやデコレーターはありますがホントにマンセーですね
マクロの定義文法も変換が主たるものだから別記法が理にかなっているとの事ですが、設計段階では、そんな事は一言もホアレは
言ってません。0.2でクラスが導入され、0.3でインターフェースが導入され、0.4でトレイトが出来てクラスが削除された。1.0以降も酷い互換性の
破壊が続いて、安定しだしたのは1.20以降です。
個人的に気に入らないのはfunctionはfnとするのにmutableはmutと使用頻度が高いものがfnよりタイプ量が多い事。「::」も無意味に
2回打たせる意味が分からない。アトリビュートも#[...]とか異常に無駄。ほかの言語のようにパターン束縛表現があるので@は使えませんが
「#」だけで良いでしょう・・・
確かにマクロ呼び出しは「!」とわざと区別するように思想が影響していますが、マクロ中の$はマクロ展開ではコンパイラを単純化させて
コンパイルを速くするためだけにプログラマへ負担を押し付けているだけです。ただ「!」もNeverと別の意味があり、暗黙の型強制なんて
わざと敷居を高くすることに言語設計者は考えているとしか思えない
Occamで最初のバージョンが作られたけど、インデントスタイルのオフサイドじゃなくC/C++風にしたのは、好みで{}スタイルを好む人が
多いから(タイプ量は増えますが)許容範囲でしょうが・・・
0124デフォルトの名無しさん
垢版 |
2022/02/04(金) 17:50:56.66ID:ZD21CbAH
趣味・好みじゃなくて問題があるという話なら
なぜ本家じゃなくここに書くw
0125デフォルトの名無しさん
垢版 |
2022/02/04(金) 18:12:52.54ID:3IKuZnie
0.2からおっかけてたのならattributeの文法議論の時にそれ主張しとけば良かったのに

あとcargoのせいでコンパイルが遅くなるというのはどういうこと?
パッケージマネージャーがあるせいでcrateが細分化されてリンク時間が延びることを言いたい?
0126デフォルトの名無しさん
垢版 |
2022/02/04(金) 19:21:26.70ID:b3SZZj/4
>>123
Rust 1.0がリリースされた2015年よりも昔の0.x時代の話で叩いても無意味ですぜ
あとは1文字タイプ量が多いとかどうでもよい話ばかり
言語機能については批判がないということはRustの優秀性を認めてるわけか
0127デフォルトの名無しさん
垢版 |
2022/02/04(金) 23:40:44.00ID:V2NB9pIC
Rust並に実行速くて
Rustよりもプログラミングしやすい言語がない
結果として現時点でのベストな選択肢はRust
0128デフォルトの名無しさん
垢版 |
2022/02/05(土) 00:06:09.72ID:zObCURfd
c言語の型宣言も後置にしてくれねーかな。
0129デフォルトの名無しさん
垢版 |
2022/02/05(土) 08:13:51.74ID:N1G1oPSC
Rustの唯一の欠点は、メモリ管理をしないといけないところだな。
ここも選択肢を用意してくれれば良いのに。
0131デフォルトの名無しさん
垢版 |
2022/02/05(土) 12:03:26.16ID:N1G1oPSC
そうは言っても、メモリ管理したい人って需要少なくない?
今のままでは、C.C++代替以上にはなれない気がする。
0133デフォルトの名無しさん
垢版 |
2022/02/05(土) 13:14:08.46ID:vyyfl1Q+
言うほどメモリ管理してるか?RAIIとスマポに頼りっきりのくせに
参照カウンタとかもはや実質的に確定的ですらないやん
0134デフォルトの名無しさん
垢版 |
2022/02/05(土) 14:54:37.48ID:WBcMnxrA
>>133
そこはC++も同じだけど
C++よりも更にメモリ管理の記述が少なく済むのがRust
それでいてコンパイルが通った時点でメモリやデータ競合などの安全性が保証されるのがRust
0135デフォルトの名無しさん
垢版 |
2022/02/05(土) 15:02:39.39ID:WBcMnxrA
その上でRustは現代的なプログラミングパラダイムが洗練されて採り入れられているため書きやすい
つまりちょっとしたメモリ管理を意識してプログラミングするだけで他より数倍〜十倍速くなることもあるのだから
例えばサーバー経費を何分の1に激減させつつレスポンスも良いという実利的なメリットにも効いてくる
0136デフォルトの名無しさん
垢版 |
2022/02/05(土) 17:29:39.72ID:T2gEmbbx
>>133
> 参照カウンタとかもはや実質的に確定的ですらないやん

原理的には確定的やん
GC有り言語でガベコレタイミングに苦しんだことあるやつなら
ハッキリとRAIIとGCの間に線が引ける
0137デフォルトの名無しさん
垢版 |
2022/02/05(土) 17:48:34.36ID:WBcMnxrA
>>136
不要となったら直ちにデストラクタが呼ばれる点で優れてるよな
GC言語ではそれが出来ないので後始末の記述を毎回書くことで一部補うかその機能がないか
0139デフォルトの名無しさん
垢版 |
2022/02/05(土) 20:00:06.29ID:WBcMnxrA
RAII言語は必要があれば言語の枠外でGCライブラリなどを用いてGC利用も可能
その逆にGC言語はRAII利用が不可能
0141デフォルトの名無しさん
垢版 |
2022/02/05(土) 21:10:31.12ID:FjY4Ra8B
循環参照もプログラマが自分でWeak<T>使ってなんとかするっていう言語だ
面構えが違う
0142デフォルトの名無しさん
垢版 |
2022/02/07(月) 00:03:08.00ID:VGiKPeyV
>>126
で、Rustって駄目ブラウザ以外に何作れんの?お前何作ってんの?内容ゼロで優秀性なんて言い出すウンコのコード見せろよ
0144デフォルトの名無しさん
垢版 |
2022/02/07(月) 02:07:52.70ID:AIR0UfFP
数年前ならいざ知らず未だにRustに実用プロダクトあるのという
煽りは痛い人になっちゃったな
0145デフォルトの名無しさん
垢版 |
2022/02/07(月) 03:24:58.20ID:P1hmcD3J
なんかRuby界隈みたいに知識のアップデート止まってる人たち多いね
もうRustなんてそこら中で使われまくってんのに
0146デフォルトの名無しさん
垢版 |
2022/02/07(月) 09:18:42.53ID:EcWsuH+Z
Rustは低レイヤやライブラリから徐々に侵食していく感じだからなかなか気付かれにくいかもね
Cのライブラリと思ってたら実装はRustに置き換わってた、とかよくある
0148デフォルトの名無しさん
垢版 |
2022/02/07(月) 12:54:30.50ID:E3rdzbcC
自分はGNOMEとFirefoxしか知らんな
既存の実装がrustに置き換わるというよりrustで書き直された代替実装が登場してる印象
0149デフォルトの名無しさん
垢版 |
2022/02/07(月) 12:56:04.35ID:E3rdzbcC
VSCodeの検索にripgrepが使われるようになったのも広義の置き換えとは言えるか?
0150デフォルトの名無しさん
垢版 |
2022/02/07(月) 13:02:36.93ID:AIR0UfFP
この手の手合はそんなものは下らない一般的じゃないと
言い続けるだけだからなあ
0151デフォルトの名無しさん
垢版 |
2022/02/07(月) 13:48:06.41ID:/AGVY34O
curlとかpycaもかな
この手のは最初に入るときはレガシープラットフォーム対応の問題とかで話題になるけど
一度入ってしまうと採用が広がっても特に取り上げられることはないからなぁ
0152デフォルトの名無しさん
垢版 |
2022/02/07(月) 14:27:21.78ID:Y0LlvzrX
pythonのファンシーコンソール風ゲームライブラリであるpyxelの実装がrustで書かれてて、お?ってなったわ
0153デフォルトの名無しさん
垢版 |
2022/02/07(月) 15:19:33.56ID:yxxEmbcM
その言語で書き直された〜みたいなことが話題になるうちはほぼ広がってないと考えて良いわ。
0155デフォルトの名無しさん
垢版 |
2022/02/07(月) 17:52:12.40ID:JxckRG42
>>150
「よくある」とやらの根拠に興味あるだけだから心配すんな
絶対批判したり非難したりしないからリラックスして述べてみ
0156デフォルトの名無しさん
垢版 |
2022/02/07(月) 18:19:47.49ID:AIR0UfFP
>>155
最近じゃITニュースサイトでも
Rustで書き直しましたという記事がちょくちょく出てることに
興味もないレベルだと次世代言語スレは難しくない?
0157デフォルトの名無しさん
垢版 |
2022/02/07(月) 22:00:41.23ID:E3rdzbcC
>>153
スクリプト言語のボトルネック部分をCで書き直さしたなんてよく話題になるからCもマイナー言語ということで良いか?
0158デフォルトの名無しさん
垢版 |
2022/02/07(月) 22:12:11.68ID:jZIVUuZq
Rustは現代的なマルチパラダイムが洗練されて採り入れられているためプログラミングがしやすい
それなのにCやC++のように最高速で動いてくれて快適かつリソースや経費の節減となってくれる
さらにオマケとしてメモリ安全やデータ競合安全などの保証まで付いてくる
0159デフォルトの名無しさん
垢版 |
2022/02/07(月) 22:14:03.66ID:ybgdxcXS
まあまあ他人に期待するのではなく自分で何か書けばいいだけでしょ
今なら車輪の再発明と叩かれることもないだろう
0161デフォルトの名無しさん
垢版 |
2022/02/08(火) 01:03:57.80ID:v5+/0O15
いうほどランタイム速度を必要とするようなアプリ、どいつもこいつも書いてないってのが現実。
はったりかましたバカはよくいるけど。
0162デフォルトの名無しさん
垢版 |
2022/02/08(火) 01:36:44.45ID:VTVvKaZV
だいたいのアプリはAPI呼び出しの塊だからアプリ自体が実行時間のボトルネックになることはレアかもね
0166デフォルトの名無しさん
垢版 |
2022/02/09(水) 13:58:40.10ID:YiTBO+kR
>>164 CからRustに書き直されることはあっても逆は無いから当然だろ
0167デフォルトの名無しさん
垢版 |
2022/02/09(水) 21:57:32.65ID:FZ8wgwBk
まっ、Cはこれだけ広範囲に使われているからね。基礎教養みたいなもの。
知っていて、使えて当たり前。

Rustでなにか画期的に高速化されるわけでもないし、コーディングの量が圧倒的に減るわけでもない。Pythonのように特定分野で格段の強みがあるわけでもなし。
メモリ安全性といっても、それが課題になってくるほど大きなプロジェクトに関わってるわけでもないしなぁ・・・

組み込み的にはオブジェクト志向な方がハードウェアと馴染みがいいって感じもあるかな。
0168デフォルトの名無しさん
垢版 |
2022/02/09(水) 23:51:15.16ID:Th41z547
>>167
>メモリ安全性といっても、それが課題になってくるほど大きなプロジェクトに関わってるわけでもないしなぁ・・・

俺のやってるプロジェクトは小さい自慢かよ
0169デフォルトの名無しさん
垢版 |
2022/02/10(木) 02:47:32.09ID:rtSKPHyc
>>167
オブジェクト指向の方がハードウェアとなじみが良いというのはどういうこと?
カプセル化とか継承とか、もしかしたらメッセージパッシングとかがハードウェアの抽象化に適しているということ?
0171デフォルトの名無しさん
垢版 |
2022/02/10(木) 12:40:20.38ID:tTxcUdMu
デバイスドライバーみたいなソフトウェアだと、linuxのVFSみたいなインターフェイスを意識するのが普通だから
オブジェクト指向や関数ポインタ渡しが普通。
動的に操作方法を変える必要性が大きいものはこういう仕組みは必要になる。
0172デフォルトの名無しさん
垢版 |
2022/02/10(木) 12:43:32.46ID:ED4fd292
そういやRustって、コールスタック重視なのになんで所有権移動をデフォルトにしたのかね?

スタックにデータがあるなら、戻ってくるのを想定して借用をデフォルトにした方が効率良い気がするけど。
0174デフォルトの名無しさん
垢版 |
2022/02/10(木) 19:06:35.96ID:pZ8EtH2T
>>172
そこはRustでは最適化される
例えば大きな構造体 struct Foo { 略 } があったとして
fn main() {
let foo = sub1();
}
fn sub1() -> Foo {
let foo1 = sub2();
return foo1;
}
fn sub2() -> Foo {
let foo2 = Foo { 略 }; // 上述の大きな構造体
return foo2;
}
と多段の関数の深いところから大きな構造体を返すとする
(注: 他言語の人にもわかりやすく敢えて「return」を明記してます)

Rustではこれは最適化されて
深いsub2()の変数foo2の格納場所はmain()のスタックの位置となる
特に今回の場合だと次々に渡していくだけなので
変数foo2のアドレスとfoo1のアドレスとfooのアドレスは一致する
(もちろんこのコードでヒープは一切利用されない)

つまり返り値(の格納場所)をポインタ渡ししているのと同じことになる
C言語ではそれを自分でコードとして記述しなければならないが
Rustでは概念上や記述コード上は「値返し」でシンプルにわかりやすく
実行コードでは最適化されて「返り値の格納場所を参照渡し」になる
もちろん小さな型を返す場合は実行コードも効率よく「値返し」のままである
0175デフォルトの名無しさん
垢版 |
2022/02/10(木) 19:53:19.62ID:HLYz9uYe
>174
いや、RVOの話じゃなくて、
スタックにあるオブジェクトの所有権を関数呼び出し先に移動するのを
デフォルトにした設計的な意図は何なんだろう
という話。

継続を第一級オブジェクトとしてサポートするのでもなければ
サブルーチンはいずれリターンしてくるんだから、スタックに積んだ
オブジェクトも呼び出し先に所有権を移動しないで持ち続けるのが
自然な感じがするんだよね。
それをわざわざ移動してスタックの奥で破棄する(=スタックに残骸が残る)
ようにしたのはなんでかね、と。
0176デフォルトの名無しさん
垢版 |
2022/02/10(木) 20:19:32.65ID:rtSKPHyc
>>175
ヒープにあるオブジェクトだと deep copy にコストかかるから shallow copy (move) をデフォルトにして
コストかかる処理はソースコード上明確になるようにしたかったからだと思う
0177デフォルトの名無しさん
垢版 |
2022/02/10(木) 20:31:58.46ID:HLYz9uYe
>176
Rustもなんだかんだ言ってヒープ使用を想定している、ということかね。
それなら所有権移動をデフォルトにした理由は判る。
0178デフォルトの名無しさん
垢版 |
2022/02/10(木) 20:36:51.31ID:zC9/cVAd
https://www.reddit.com/r/rust/comments/fa9pkp/what_is_the_motivation_behind_default_move/
このスレで作者が答えているけど、すでに参照を示す&が広く使われてるのにデフォルトを借用にすると、moveを示すために「非参照演算子」みたいなものが必要になって整合性が取れないから、とのこと
あとはスタックにどう置いてどうアクセスするかはコンパイラの最適化の問題であって
言語のセマンティクスとは別、みたいな話も
0179デフォルトの名無しさん
垢版 |
2022/02/10(木) 20:48:03.49ID:pZ8EtH2T
>>175
Rustではそんな無駄なことはしていないので大丈夫
まずメソッド定義は以下の3つの方法がある
(1) fn method1(self: Self, 引数)
(2) fn method1(self: &Self, 引数)
(3) fn method1(self: &mut Self, 引数)
Selfは自分の型を示す特別な型であり省略して以下のように略記も可能
(1) fn method1(self, 引数)
(2) fn method1(&self, 引数)
(3) fn method1(&mut self, 引数)
ここで>>175が最初に言っている方法は(1)のケース
参照しか利用しないメソッドなれば(2)のように定義して所有権は移動しない
参照を利用して書き換えるならば(3)のように定義して所有権は移動しない
そして所有権を移動させたいメソッドのみ(1)の定義を用いる
この3つの区別があるためRustでは無駄なことは起きない
0180デフォルトの名無しさん
垢版 |
2022/02/10(木) 21:34:34.23ID:3aizDYBf
>>174
Rustは所有権がはっきりしてるためコンパイラが安全に最適化をガンガン出来る点が良いな
しかもプログラマーはそれを意識せずにRustのセマンティクスだけ把握して書けば後はコンパイラが勝手に最適化してくれる
これがC/C++だと自分で戻り値の場所を確保して自分でポインタを渡していき競合安全性も含めて自分でメモリ管理しなければならない
CG言語だとスタック上はあきらめてヒープで確保して返して後始末はGC任せ
Rustが有利
0181デフォルトの名無しさん
垢版 |
2022/02/10(木) 21:40:15.72ID:3aizDYBf
>>178
どちらかに指定が必ず必要なのだから
ライフタイムを管理する必要のある参照の方に&指定する現方法が大正解だな
参照にはsingle writer XOR multi readersのルール義務もあるしな
0182デフォルトの名無しさん
垢版 |
2022/02/10(木) 21:50:15.02ID:ZN2u8Rs1
ある程度は既存のメジャー言語と作法を揃えないと、タダでさえヤバい学習曲線がさらにとんでもないことになるしねえ
0183デフォルトの名無しさん
垢版 |
2022/02/10(木) 22:07:58.55ID:pZ8EtH2T
可変参照と可変じゃない参照の区別が安全性保証の要になっているため
参照の方に記号を付けるのは理に適っている
いずれにしてもC/C++で安全に書く時はそれら含めて意識せざるをえない
それがRustでは様々な点でかなり楽になっているのだからC/C++より学習が大変ということはない
0184デフォルトの名無しさん
垢版 |
2022/02/11(金) 12:06:27.49ID:vAEawTbN
>>178
なるほどねぇ。
個人的にはconst refを標準にして非参照演算子を用意するのも有りだと思うけど
(変数そのものの状態変更を呼び出し元で明記するという意味で)
そのあたりは作者の設計思想だからなぁ。

ただ、コンパイラの最適化と言語のセマンティクスを切り離すのは単純すぎる気が。
>>180みたいな話もあるんだし。
0185デフォルトの名無しさん
垢版 |
2022/02/11(金) 12:49:33.03ID:MSfgatap
>>184
参照を返す関数を書いてみればわかる
参照の方が特殊な存在であり記号は何でもよいが記号を付けるべき存在だとわかる
そして適切な記号としては微妙に概念が一部重なるC言語の&を選んだのも適切
0186デフォルトの名無しさん
垢版 |
2022/02/11(金) 13:38:34.47ID:vAEawTbN
>>185
もともとコールスタック(>>172)の話をしているのに、ヒープデータ前提の参照戻し関数の話をされてもねぇ。
Rustが「効率的にするという約束はしているが、コールスタックとかヒープとかは関係ない」というスタンスなら別だけど。
0187デフォルトの名無しさん
垢版 |
2022/02/11(金) 13:47:41.99ID:MSfgatap
>>186
ほら理解できていない
まずは実際にプログラミングしてみなさい
ヒープなんか一切用いなくてスタック上しか使わなくても参照返しは必ず起きるしライフタイムの管理が必須となる
0188デフォルトの名無しさん
垢版 |
2022/02/11(金) 14:39:24.16ID:vAEawTbN
>>187
そこまで言うんだったら具体的なコードを例示してくれない?
「参照返しは必ず起きる」と理解できるような普遍的なコードで頼むよ。
0189デフォルトの名無しさん
垢版 |
2022/02/11(金) 15:19:57.69ID:HTnX1mLl
>>187
>ヒープなんか一切用いなくてスタック上しか使わなくても参照返しは必ず起きるしライフタイムの管理が必須となる
これは嘘だろ。実際fortranはヒープ使わないし、変数の寿命なんて問題は考えなくて済む。
そういう意味じゃめっちゃ安全。
0190デフォルトの名無しさん
垢版 |
2022/02/11(金) 16:01:25.44ID:6Qn4bKwU
>>188
数値配列の処理や文字列の処理でよく起きますね
例えばイメージしやすい例だと入力文字列から前置文字列と後置文字列に挟まれた文字列を返す関数
// 【input_str】 = 【prefix_str】 + 【output_str】 + 【postfix_str】
fn get_str_between<'a>(input_str: &'a str, prefix_str: &str, postfix_str: &str) -> Option<&'a str> {
let start_index = input_str.find(prefix_str)? + prefix_str.len();
let end_index = input_str[start_index..].find(postfix_str)? + start_index;
Some(&input_str[start_index..end_index])
}
このように引数に複数の参照が来る時に参照を返す場合はライフタイムの明記をします
この例だと関数が返す参照は引数のinput_strのライフタイムと同じですよと伝えることで
この返り値がさらにどこか別の関数で使われたりあるいは構造体に格納されたりしても出自がわかり安全なわけです

ちなみに文字列処理はヒープエリアを一切使わなくても
スタック上の配列(ex. ArrayString)やstaticエリアだけでも完結できますからその突っ込みは無しでよろしくw
0191デフォルトの名無しさん
垢版 |
2022/02/11(金) 17:17:31.83ID:vAEawTbN
ああ、データ自体を外部から参照する関数なら参照返しも普通か。>>186自体は間違いだな。

ただ、>>184(参照・実体の表記法/関数呼び出し規則)とはあんまり関係していない気が……やっぱり、Rustの設計思想が>>178だからというのが結論に思えるなぁ。
まあ、このあたりをいじくると、所有権を持つ変数が必ずひとつ存在するRustの設計思想からいじくらなきゃいかんような気がするから、Rustじゃ無理か。
0192デフォルトの名無しさん
垢版 |
2022/02/11(金) 18:27:07.40ID:6Qn4bKwU
>>191
そこはRust限定の話ではなく一般的な話だと思う
参照というのはあくまでも実体があってこそ生きていられる存在
だから実体を保有する変数がどこかに必ず存在していて
その実体が参照よりも長生きしていないとダングリングポインタになってしまう

(ここからはRustの話)
したがって実体の方を本体として無記号にし
それに依存している存在にすぎない参照の方を&記号で示している
0193デフォルトの名無しさん
垢版 |
2022/02/11(金) 23:20:00.56ID:3T2kJORw
>>189
すべての関数呼び出しが末尾再帰であれば、呼び出しにあたって現在のスタックフレームを保存する必要はないから、中途半端な
手続き言語で分かった風に語りだす人は、どこかおかしい。コンピューターサイエンスとか齧ったことは無さそう。Rustをやってる人の
こういう語りは言語の発展の邪魔でしかないね
0195デフォルトの名無しさん
垢版 |
2022/02/12(土) 01:31:10.49ID:/iL1/Dd6
Go言語の作者Rob Pike氏が2015年に発表した「Go言語が成功した理由は何なのか?」で
> mapやfilterのような機能は言語の表現力を高めるものであり、 書いていて楽しい言語 に繋がるわけだが、
> これはそのトレードオフとなるメンテナンス性が高く扱いやすい言語という点をを犠牲にするだけでなく、
> (極めて素晴らしい方法で実装しない限り)コンピューターリソースを非常に消費するものだ。
と述べていて当時はその通りに思われてGoでは毎回for文で書くことがシンプルで良いとされてきた
しかしその後Rustのイテレータ実装ではfor文とほぼ同様に速く動かせるようになり
for文で毎回ごちゃごちゃ書くよりメンテナンス性もよく扱いやすいとわかった
0197デフォルトの名無しさん
垢版 |
2022/02/12(土) 02:36:04.74ID:/tMtoFMY
どうみても言語の否定じゃなく、どうでも良いようなことを延々と語りだすそいつの思考の人格・性格的否定だろうに。
こんな読解力も何もない奴ばっかか・・・
0198デフォルトの名無しさん
垢版 |
2022/02/12(土) 14:28:17.06ID:772ADf0k
>>195
Rust開発者は天才だから仕方ない
0199デフォルトの名無しさん
垢版 |
2022/02/12(土) 16:13:21.86ID:zOhO24og
所有権という概念を生み出したrustの人(名前わすれた)は天才だよ
効率性と安全性を同時に実現してる
これを関数型言語の人が生み出せなかったのは謎すぎる
0200デフォルトの名無しさん
垢版 |
2022/02/12(土) 16:49:53.94ID:8ted8XK+
Ruby にはLazy があるから、無限配列でも、iterate できる

実行順序を変える。
書いた通りに前から実行しない
0202デフォルトの名無しさん
垢版 |
2022/02/12(土) 18:09:28.52ID:/iL1/Dd6
ライフタイムによって本体だけでなくその参照の正当性まで保証できるようになったわけだ

>>200
Rustのイテレータは受動的に遅延生成だから無限生成もできるけど
勝手に実行順序を変えるようなことはなくプログラマーが書いた通り
0203デフォルトの名無しさん
垢版 |
2022/02/12(土) 18:33:27.41ID:zd9UI5Og
>>199
あいつら本当はラムダ計算をしたいのに実現出来なくて仕方なくチューリングマシン考えてる妥協の民だからそんな発想なさそうw
0204デフォルトの名無しさん
垢版 |
2022/02/12(土) 18:34:57.60ID:gzu2Ubp4
>>199
関数型言語は同一データの共有が極めて多く発生するため、GCなしの実装は実用的ではない
参照透過な言語ならメモリの共有さえしなければいいわけでGCなしの実装は極めて容易だけど、無限のメモリを必要とする
0205デフォルトの名無しさん
垢版 |
2022/02/12(土) 19:00:19.19ID:gHUJ4QZw
関数型はGCが問題になるような途中過程の実行タイミングのシビアな用途に使われないからってのも大きな理由だと思う
性能面で言えば、ガベージの数が命令形に比べて桁違いに多いからいちいち参照カウントとかやってたらクソ非効率だろうし
0206デフォルトの名無しさん
垢版 |
2022/02/12(土) 19:37:20.77ID:8ted8XK+
Ruby で普通の繰り返しは、a が無限要素だと、aで止まる

a.b.c
つまり、aの要素数ループ、bの要素数ループ、cの要素数ループの順番

それが、Lazy では、実行順序が変わって、
aの1つ目の要素、bの1つ目の要素、cの1つ目の要素
aの2つ目の要素、bの2つ目の要素、cの2つ目の要素
となる

つまり、aが3要素とすると、a1a2a3・b1b2b3・c1c2c3 が、
a1b1c1・a2b2c2・a3b3c3 に変わる
0207デフォルトの名無しさん
垢版 |
2022/02/12(土) 21:05:09.08ID:y1lBAL19
>>201
確かに所有権っぽいことならC++でもそれっぽく書けはする
ライフタイムは最初なんじゃこれって思ったけど
我慢して書いてみると見事に"missing piece"を埋めてくれた
0208デフォルトの名無しさん
垢版 |
2022/02/12(土) 23:41:53.37ID:UjqaVtZ/
我慢して書いてみるって発想は
ルールを守るよりも抜け道を探してそうなハッカーの発想とは対照的だね
0209デフォルトの名無しさん
垢版 |
2022/02/12(土) 23:51:27.76ID:x20bdFcp
>>206
当たり前のことを書いてるだけじゃん
Rubyではlazy導入で遅延処理となり必要最小限だけをようやく処理できるようになったけど
例えばRustでは最初からそのlazyになっている
だからイテレータを連鎖した時に途中に毎回の無駄な一時配列が生成されることもない
それゆえRustではガベージが途中で生じずスタック領域のみ使用で連鎖でき軽くて速い
0210デフォルトの名無しさん
垢版 |
2022/02/13(日) 03:57:54.17ID:BBswpWkz
array::mapは複製が生じるだろ、普通はarr.map(...).map(...)は使わないにしてもlazyだから無駄な一時配列が
生成されることもないとか言い過ぎだ。ちゃんとドキュメント読んでんのか?そもそも一時的な集合要素が必要に
なるのはアルゴリズム次第であり、”理解してないのに”信じてしまう事は愚かすぎる
0213デフォルトの名無しさん
垢版 |
2022/02/13(日) 04:24:59.24ID:8v/TbvES
array::mapで複製は生じるけどイテレータがlazyか否かの議論には何も関係ないよね
mapはOption::mapなどと同じでイテレータとは関係なくコレクションやコンテナの中身を写像する関数であって、イテレータにも同様の意味を持つ関数が用意されているというだけ

>>209 のイテレータだから無駄なものは作られないは言い過ぎで反例はありそうに自分も思うけど、イテレータじゃないものを持ち出すのは例として適切ではない

イテレータそのもののせいではないが borrow checker のせいで余計なアロケーションが必要になる場合はある
以下の記事の最後の方のコード例なんかが一例
https://fasterthanli.me/series/making-our-own-executable-packer/part-6
0214デフォルトの名無しさん
垢版 |
2022/02/13(日) 04:25:50.19ID:OAT58Vuo
>>210
array::mapはイテレーターではありません
配列から配列への単なる変換です
| pub fn map<F, U>(self, f: F) -> [U; N] where F: FnMut(T) -> U
arrayでのこの定義を見ればイテレーターではなく返り値の型が配列だとわかるはずです
ちゃんとドキュメントを読みましょう

イテレーターを使えば以下のような例において
Rustでは無駄な一時配列が生成されることはありません
[6, 4, 7, 3, 5, 9, 2, 1, 8]
.iter()
.map(|n| n * n * n)
.filter(|n| n > &300)
.for_each(|n| println!("{n}"))
0215デフォルトの名無しさん
垢版 |
2022/02/13(日) 04:39:02.47ID:8v/TbvES
<[T ; N] as Iterator>::map() のドキュメントを参照してlazyなことの裏取りをしようとしたら array::map() にたどり着いちゃったのかな
だとしたら rustdoc が分かりづらいのが悪い
0216デフォルトの名無しさん
垢版 |
2022/02/13(日) 04:44:32.73ID:8v/TbvES
<[T; N] as Iterator> なんて存在しなかった
正しくは
<<[T; N] as IntoIterator>::IntoIter as Iterator>::map
または
<std::slice::Iter as Iterator>::map
だった

こんなの初学者わかんないよね
0217デフォルトの名無しさん
垢版 |
2022/02/13(日) 04:50:04.12ID:OAT58Vuo
>>213
イテレーター連鎖の途中で「無駄な一時配列が生成されない」は常に正しいです
ただし「そのイテレーターの機能として必要不可欠な無駄ではない」一時配列(Vec)を利用するイテレーターは存在します
いずれにせよ無駄な一時配列が生成されることはありません
0218デフォルトの名無しさん
垢版 |
2022/02/13(日) 05:06:50.08ID:OAT58Vuo
>>213
そのリンク先の記事を読ませていただきましたが
借用ルール(single writer xor multiple readers)違反が原因でその回避のため途中collect()しているだけでした
具体的には&self.objectsで借用中なのに&mut selfと定義されているself.get_object()を呼び出しています
したがって今回の問題とは無関係ですね
0219デフォルトの名無しさん
垢版 |
2022/02/13(日) 05:14:01.48ID:8v/TbvES
>>217
「無駄な一時配列」の意味するところがあまり腑に落ちてなかったのだけど、
例えばイテレーターアダプターを呼び出す場合に、全要素列挙して配列で返す方式ではなく、
必要に応じてイテレーターアダプターのIterator::nextが呼ばれて、
さらにその中から元となったIteratorのnext()が呼び出されて...
と、lazyに必要な分だけ呼び出される仕組みになっているということが言いたかったわけね

>>218
はい、イテレータというかborrowの制約なのでlazinessとは関係ない話ですね
0220デフォルトの名無しさん
垢版 |
2022/02/13(日) 05:43:50.33ID:OAT58Vuo
>>219
Rustの配列(array)はスタック上に置けるようコンパイル時サイズ固定なのはご存知ですよね
したがってイテレーターがもし一時配列を吐くもしくは使おうとすると必然的にサイズ可変のVec利用となりヒープを使うことになってしまいます
ところがRustの標準ライブラリのイテレーターは core::iter::Iterator すなわちcore::はヒープが無い環境でも動作可能を意味します
つまり『Rustの標準ライブラリのイテレーターは一時配列(Vec)を絶対に使わない』ように設計されているのです
一方で外部のライブラリにおいてはデータが全て完全に揃わないと動作できない機能を持つイテレーターの場合に「必要不可欠な無駄ではない一時配列(Vec)」を用いるケースがあります
0222デフォルトの名無しさん
垢版 |
2022/02/13(日) 15:59:57.41ID:qi1oHAf6
上で出ていたこれなら配列は複製されない
Rustはそんな無駄なことはしない

>>214
> [6, 4, 7, 3, 5, 9, 2, 1, 8]
> .iter()
> .map(|n| n * n * n)
> .filter(|n| n > &300)
> .for_each(|n| println!("{n}"))
0223デフォルトの名無しさん
垢版 |
2022/02/13(日) 16:43:01.35ID:BBswpWkz
そのように書くのはあなたであって"Rustだから"というのは明らかな間違いです。無駄な事をしているのはあなたであってRustではありません
0224デフォルトの名無しさん
垢版 |
2022/02/14(月) 23:03:20.89ID:T9mSH3bb
Rustのイテレータは他と機能も同じ以上なのにプログラミング言語最速
さらにヒープを使わずOSもないベアメタル環境でも動作可
0226デフォルトの名無しさん
垢版 |
2022/02/15(火) 18:02:19.14ID:OW1Pu+wt
>>225
次世代言語スレで2年も前のリンク持ってこられても、、、
0231デフォルトの名無しさん
垢版 |
2022/02/15(火) 19:44:03.28ID:s9A1ir2/
Rustは言語仕様が汚くライブラリもいまいちなので
同じような概念できれいな文法の言語が欲しい
0237デフォルトの名無しさん
垢版 |
2022/02/15(火) 22:22:48.94ID:57mqcwZM
>>231
Rustは言語仕様が洗練されていて綺麗なので気に入った
Option / Result に ? や
match / if let / while let あたり
諸悪の根源の null / nil / undefined などが無くなり清らかになった
0240デフォルトの名無しさん
垢版 |
2022/02/15(火) 23:21:29.87ID:tssMbTRA
>>227
今年って西暦何年?
0241デフォルトの名無しさん
垢版 |
2022/02/15(火) 23:21:53.24ID:57mqcwZM
>>238
英語でmutの語感覚ははラテン語mutare(変化する)から来ていて
mutable以外にもpermutationやtransmutationなど変化を感じさせる語源だから良いと思うけど
0243デフォルトの名無しさん
垢版 |
2022/02/16(水) 14:26:20.55ID:ntLj+IC3
>>227
>2020年の記事なんですけど
>2020年が2年前な訳が無いんですけど

言ってることがわからないんだけど。
もしかして異世界からアクセスしてる人か?
0244デフォルトの名無しさん
垢版 |
2022/02/16(水) 14:54:32.66ID:3pG+9+g8
オッサンの時間の流れは早すぎて、もう2022年になったとは思えない
っていうジョークだろう

もうどうでもいいよ
0245デフォルトの名無しさん
垢版 |
2022/02/16(水) 16:41:34.23ID:oWbPDf/g
>>242
むしろResult型は美しく大元は数学の圏論のモナドから来ている
HaskellのMaybeモナド = ScalaのOption = RustのOption = 有か無かの二択
HaskellのEitherモナド = ScalaのEither = RustのResult = AかBかの二択
そしてRustではOptionもResultも値格納付きenum(=タグ付きunion)で表現している

RustのResultもEitherと同じくAまたはBの二択にも使えるが
9割以上の使用方法では特に Aを正常値 Bを異常値(エラー値) として用いる
そのため enum型である Result<T,E> は タグOk(T) と タグErr(E) で構成されている
ここで Tは正常値の型T を示し Eはエラー値の型E を示している

つまり Result<T,E> は2つの型を合成して1つの新たな型として扱うことが出来る
これにより様々なエラー処理が非常に簡単となり各演算(and, or, 変換(map), default値)や
Resultを要素とするイテレータの各演算(map, filter, fold, collect)の各Result版を統一的に扱える

単純にエラー時に上位へエラーを伝播させる場合もRustでは単純となる
例えばGo言語では正常値valとエラー値errの多値で返し以下のようになる
 val, err := func()
 if err != nil {
  return err
 }
Rustでは以下の「?」オペレータ1文字追加でよい
 let val = func()?;
ここでfunc()はResultを返しておりそれがエラー値Err(err)の時はその値で即return
そして正常値Ok(val)の時の処理のみに記述コードを専念できる
0246デフォルトの名無しさん
垢版 |
2022/02/16(水) 18:27:24.16ID:UmvV858q
>>245
そういうレベルの話じゃなくて単にパターンマッチの構文が見慣れないから読みづらいってだけだと思うよ
やってることはファイルをopenしてみて、失敗したらファイルを作成するってだけで何も難しいことはしていないので
0247デフォルトの名無しさん
垢版 |
2022/02/16(水) 18:59:25.56ID:3pG+9+g8
モダンな言語ならパターンマッチ構文とか当たり前だし、慣れるべきとしか思わんよな
0248デフォルトの名無しさん
垢版 |
2022/02/16(水) 19:05:31.46ID:9J2Avx3b
んなことはない
switchの中にswitch入れてる不気味なケースと同じで理解の妨げとバグの温床になっている
0249デフォルトの名無しさん
垢版 |
2022/02/16(水) 19:06:54.11ID:9J2Avx3b
そのうちmatchの中にmatch入れるな見たいなルールが出来て
それが当たり前になるw
0250デフォルトの名無しさん
垢版 |
2022/02/16(水) 19:08:51.82ID:9J2Avx3b
> Err(ref error) if error.kind() == ErrorKind::NotFound => {
ここが
Err(ref error.kind() == ErrorKind::NotFound) => {

こうなっていない時点でrustは汚い
0251デフォルトの名無しさん
垢版 |
2022/02/16(水) 19:24:55.51ID:9J2Avx3b
そもそもがさあ
他の言語のライブラリにあるファイルオープン時に指定したファイルがなければ作って開いてくれるようなオプションないのか?
0252デフォルトの名無しさん
垢版 |
2022/02/16(水) 19:38:23.34ID:J05fEVeY
>>250
それこそクソ構文にしか見えないけど採用してる言語あるの?
Point(x, y) if 0 < x && x < 5 => {
みたいなガード条件書けなくない?
0254デフォルトの名無しさん
垢版 |
2022/02/16(水) 20:09:46.22ID:4BNkCNLv
>>250
Errはenum Resultのタグだからそれは理解が間違っている

>>251
無くても必要なら一瞬で書けるから困らない
例えば関数にするならこのようになる
fn open_or_create(path: impl AsRef<Path>) -> io::Result<File> {
File::open(&path)
.or_else(|err|
if err.kind() == ErrorKind::NotFound {
File::create(path)
} else {
Err(err)
}
)
}
このようにorを使う方が見やすく分かりやすい
matchでOk(x) => x, となったらorと覚えればよい
0256デフォルトの名無しさん
垢版 |
2022/02/16(水) 20:58:53.96ID:bx/iMnwF
C#はここ十年さわってないので分からんけど
> Err(ref error.kind() == ErrorKind::NotFound) => {
みたいに書けるってこと?
そもそもC#にパターンマッチなんかあったやろか?
switchがせいぜいあるだけでは?
あと型もletでdestructできるやつじゃなくて
せいぜい (変数 is 型) でシコシコ調べていくだけでは?
0257デフォルトの名無しさん
垢版 |
2022/02/16(水) 21:00:56.89ID:UmvV858q
>>250 のkind() は構造体のフィールドとのマッチじゃなくてメソッドの戻り値との比較だから
パターンとして取り扱えるようになるべきではないと思う
構造体のフィールドなら普通にパターンマッチできるよ
0258デフォルトの名無しさん
垢版 |
2022/02/16(水) 21:07:22.97ID:UmvV858q
>>251
File::options()
.write(true)
.create(true)
.open("hello.txt")
で済む話ではあるから例が微妙というのはあるかもね
0259デフォルトの名無しさん
垢版 |
2022/02/16(水) 21:19:06.45ID:9J2Avx3b
見返してみると
Err(ref error.kind() == ErrorKind::NotFound)ではなく

Err( ErrorKind::NotFound)
とかけたほうがいいなと
0260デフォルトの名無しさん
垢版 |
2022/02/16(水) 21:25:48.26ID:9J2Avx3b
上のソースは海外の有名なサイト???からほぼ丸パクリなんだな
そっちも突っ込みどころ満載のソースなんだけどパクったほうはさらにおかしくなってる

変なところだらけ
これとか
let f = File::open("hello.txt");
let f = match f {

それに引き続いたこれ
match File::create("hello.txt") {

そして
Err(e) => panic!("Tried to create file but there was a problem: {:?}", e),

これ
Err(error) => {
panic!("There was a problem opening the file: {:?}", error)
},
0262デフォルトの名無しさん
垢版 |
2022/02/16(水) 21:41:12.68ID:oWbPDf/g
>>253
Rustでも複数マッチングは当然できる
例えばorの概念
let v = match (p, q) {
 (true, _) => "前者",
 (_, true) => "後者",
 (_, _) => "失敗",
};

>>255
matchをorで書き換えなら254で合ってる
目的達成だけならoptionsを使う258で合ってる

>>259
そういう単純なエラー型を自分で設計して使うならそれでOK
今回は std::io が返すエラーだから Err(struct io::Error { ...(フィールド非公開) }) となる
つまり Err(err) で受けて err.kind() で種別を取り出すことになる
なぜこうなっているのかは理由があるのでソース std/io/error.rs を読むべし
0263デフォルトの名無しさん
垢版 |
2022/02/16(水) 21:51:01.16ID:4BNkCNLv
>>260
その変数のシャドーイングも二段階のmatchもpanic!の使用もそれ自体は間違っていない
君は文句をつけることと間違った動かないコードを出すことしかできていない
こちらは改善案として二段のmatchではなくResultをorする>>254というシンプルで動くコードを示した
0264デフォルトの名無しさん
垢版 |
2022/02/16(水) 23:07:11.77ID:9J2Avx3b
視点がずれてる

変なところが多い=美しくないと言ってるんだけど
意味のあるシャドーイングならわかる
変数使って受けてるのに次ではmatchダイレクト

panicを一行で書いたりブロックをつけて書いたりちぐはぐ

書いた奴は馬鹿なんだろう
0265デフォルトの名無しさん
垢版 |
2022/02/16(水) 23:09:17.43ID:9J2Avx3b
クソど素人にこれだけ書かれるのは馬鹿なんだろうしそれも理解できないのはどうなんだ?
0266デフォルトの名無しさん
垢版 |
2022/02/16(水) 23:12:09.22ID:4BNkCNLv
批判だけならバカでもできる
具体的な代案を出せるかどうかが全て
これはどの世界でも同じ
0267デフォルトの名無しさん
垢版 |
2022/02/16(水) 23:14:11.42ID:9J2Avx3b
いやいや
何を例としてるか全然わかってなかったろ?

具体的に書かれて初めてわかったろ?
そういうところだよ
汚いソースすらわからないんだろ?
0271デフォルトの名無しさん
垢版 |
2022/02/17(木) 08:14:31.32ID:eL25V27g
>>257
>>250は単一化あたりを想定しているんだろ。
本来なら
Err(ref error),
error.kind() == ErrorKind::NotFound

Err(ref error) and
error.kind() == ErrorKind::NotFound
あたりだけど。
0272デフォルトの名無しさん
垢版 |
2022/02/17(木) 08:14:54.96ID:2OHfN1Ec
もう十分だよ
初心者にありがちな「言語仕様が汚い発言」でしかないのがわかったからもういいよw
0273デフォルトの名無しさん
垢版 |
2022/02/17(木) 23:22:49.91ID:S7RVNfva
彼は当初Rustの言語仕様が汚いと主張
それが無理筋だとわかると誰か個人が書いたサンプルコードが汚いと主張を変更
ところがそれも修正案すら示せず敗走か
0274デフォルトの名無しさん
垢版 |
2022/02/18(金) 11:21:48.86ID:TQ4wtLA6
初心者にありがちな発言
「コンパイラのバグ」
「言語仕様が汚い」
「バリバリ書く」
0276デフォルトの名無しさん
垢版 |
2022/02/18(金) 23:43:37.82ID:dAarluib
まだ富士山2合目な発言「美しい言語、感銘を受ける」 「コンパイラが教師」 「初心者にありがち」
0278デフォルトの名無しさん
垢版 |
2022/02/19(土) 09:03:05.11ID:Wd6uYUeM
Objective-Cはちょっとしか触ったことないけどすこ
mac開発で使ってる人からすると欠点が見えてくるのかな?
0283デフォルトの名無しさん
垢版 |
2022/02/19(土) 20:52:26.77ID:TtXtFDlb
そういえばC#やってからJavaに触ると.NETフレームワークの設計が如何によく出来てるかを思い知る
0284デフォルトの名無しさん
垢版 |
2022/02/19(土) 21:05:14.30ID:Wd6uYUeM
OSXが出てから一般向けの参考書が本屋に並ぶとか信じられないことになったが
昔は図書館の奥底まで潜らないと本が出てこなかったり
興味あるけどなんか手を出せる状況になかったなObjectice-Cは
linuxにgnustep入れてちょこちょこっとサンプル動かして満足してた
いやほんとAppleのおかげでだいぶ脚光当たったなマジで
0285デフォルトの名無しさん
垢版 |
2022/02/19(土) 23:02:34.03ID:MxDJywIC
Obj-CはどうかしらんけどSwiftはまあ良いと思う
依存がでかいときのビルドはつらすぎだけど
0286デフォルトの名無しさん
垢版 |
2022/02/20(日) 09:06:02.64ID:42OaaAY/
>>283
具体的にどういうところがでしょうか?
興味あります
1つか2つ例を挙げていただけると幸いです
0289デフォルトの名無しさん
垢版 |
2022/02/21(月) 15:07:07.57ID:WLj3vt4d
波かっこによるブロックのため、
    }
   }
  }
 }
でディスプレイを無駄に占有されて可読性が減る事と
文末のセミコロン(C系)やコロン(Python等)強制で無駄にタイピング量が増えるのが嫌なのですが(強制でなければむしろ好き)、
あれらって、どんな魅力が有るのですか?
javascriptでデータ量を減らせて難読化できるメリットはわかりますが・・・・。
ちなみに自分は{}もpython.nimの様なインデントによるブロックで良いと思うし、
function()はfn()で良いし、println()はp()で良いし、arrayOf(1,2,3)は(1,2,3)で良いと思います。
0290デフォルトの名無しさん
垢版 |
2022/02/21(月) 15:49:13.16ID:8WYOAA82
C言語の出始めは関数名とか省略していて可読性悪いとか言われてたなぁ。
0292デフォルトの名無しさん
垢版 |
2022/02/21(月) 16:38:51.99ID:Y2/ni7CQ
記号=読めない
英単語=読める
みたいな批判は古いけど今でも一理ある

char **argv;
pointer< pointer<char> > argv;
0294デフォルトの名無しさん
垢版 |
2022/02/21(月) 17:32:22.70ID:NEAxhla5
頻度が高いものほど短くていい
意味不明な記号でもいい
*こそがまさにそれで
*こそがまさにC言語の象徴
0295デフォルトの名無しさん
垢版 |
2022/02/21(月) 18:20:09.87ID:Vy+crfrM
>>289
Lispスタイルの }}}} はどう?
シンタックスハイライトや自動インデントなどで後続の文のネストのレベルは適切に調整されるという前提で
0296デフォルトの名無しさん
垢版 |
2022/02/21(月) 20:53:51.80ID:QHx0/ciw
>>289
だからおのずと深いネストや長い関数を避けるようになる教育的効果がある。

とかpython信者が言うんだよな
0297デフォルトの名無しさん
垢版 |
2022/02/21(月) 21:43:40.53ID:8WYOAA82
どうせお前らは嫁や彼女のおっぱい見てオッパイソンとか内心思ってるんだろ。
0298デフォルトの名無しさん
垢版 |
2022/02/21(月) 23:34:00.09ID:yT3SkRwP
Lispは基本すべてが()で
関数の終わりは
))))))
とかなりがち
スーパーカッコ
]
というのも提案されたが流行らなかった
カッコを閉じると対応するカッコを自動で示してくれるのが
よかったのかなあ(viの show match)
プログラムが大きくなるとどっちにしても一画面では
収まらなくなるし

識別子の名前を短くすると一見してなんだか分からないし
プログラムが大きくなるとわけが分からなくなりやすい

一応理由はある。経験則だけど
0299デフォルトの名無しさん
垢版 |
2022/02/22(火) 00:58:19.88ID:A1/uSbXB
>>295 Lispスタイルという名前がついていたのは知りませんでした。Thanks。
昔、それをやった時に「{と}の対応がわかりにくい」 => 「}のつけ忘れで謎のバグを誘発」という結論に達しました。
だから{と}で囲む事自体が無い言語が良いなと思っています。もちろんendで閉じるのも面倒です。

>>289 {}でブロック形成する言語のメリットは「対応するカッコにジャンプ」機能が有るエディタでは多少メリットが有りますが、エディタに「ブロックの先頭・末尾に移動」機能が有ればインデントでブロック形成する言語も互角なので、あまり意味がないメリットかもしれませんね。
0300デフォルトの名無しさん
垢版 |
2022/02/22(火) 01:37:03.17ID:Uj7UhjXB
>>299
Lispスタイルというのは世の中にそういう用語があるのではなくて
単にLispでよくやられているように〜ということが表現したかっただけ
紛らわしくてすまん
0301デフォルトの名無しさん
垢版 |
2022/02/22(火) 02:06:26.37ID:8W2asJrF
凡人なので Bracket Pair Colorizer みたいなエディタ支援がないと
3階層以上のカッコの対応が正しいかどうか自信が持てない
0302デフォルトの名無しさん
垢版 |
2022/02/22(火) 02:20:32.61ID:N60dC/Ri
>>299
中カッコやendで閉じないとエディタが助けてくれないのよ
インデントをどうするかをエディタが助けることができない
0304デフォルトの名無しさん
垢版 |
2022/02/23(水) 16:27:32.36ID:D80BZOr1
>>303
>Bracket Pair Colorizer は、もう必要ない 既に、VSCode に実装されたから

良い世の中になったなぁ。vimでも実装されればいいのに。特に、対応するカッコを線でつなぐ機能はExcelにも無いのでステキ。
0306デフォルトの名無しさん
垢版 |
2022/02/25(金) 00:55:39.55ID:XW+/SlIV
>>305 Thanks。対応するカッコを線でつなぐ機能も有れば更にステキ。

>>289
>javascriptでデータ量を減らせて難読化できるメリットはわかりますが・・・・。

javascriptは行末セミコロン強制ではないので、自分で書いていて今ごろ意味不明な事が発覚。修行が足りぬ。

C言語の先輩であるFORTRANは行末セミコロンは無くてもプログラミングできていたので、C言語系の文末セミコロン強制の意義はいまだに不明です。
構文解析の負担を少しでも減らして、コンパイルを高速にするためでしょうか?
0307デフォルトの名無しさん
垢版 |
2022/02/25(金) 02:23:42.73ID:vMVHS55f
Cのセミコロンはalgolのセミコロンやcobolのピリオドを引きづっている
ここで一連の処理が終わりという意味でターミネータを置いた
改行を書かずにぎっしり書くときにどこで切っていいか分かるからね
自然の文に近かろうといういい加減な理由
当時はまだ人間にとっての書きやすさとか
人間にとっての読みやすとさかほとんど配慮されてなかった
0308デフォルトの名無しさん
垢版 |
2022/02/25(金) 04:31:10.49ID:aDhOSI3t
Rustはセミコロンの有無で文か式(値)かを分けている

if condition {
 a = p + q;
} else {
 a = x + y;
}

これをifの中を文ではなく式(値)にすると

a = if condition {
 p + q
} else {
 x + y
};

もちろん改行やインデントは自由なので
a = if condition { p + q } else { x + y };
こう書いても同じ

波括弧は区切りとして不可欠であり
多重時の対応関係となるだけでなく
波括弧はブロックを形成しスコープの管理にも不可欠

例えば波括弧により新たなブロックを形成することで
ロックを取得した変数がブロック終了時に自動解放され
その時にロックも自動解放されるなど安全設計にも波括弧が活躍

このようにセミコロンと波括弧はRustにおいて非常に重要な意味を持つ
きちんと活用したプログラミングにおいてはセミコロンも波括弧も無駄ではない
0309デフォルトの名無しさん
垢版 |
2022/02/25(金) 12:38:43.75ID:Eg3DloqN
Ruby on Rails で有名な、民泊のAirbnb、JavaScript スタイルガイド

ステートメントを明示的に終了し、
不足しているセミコロンを検知するようにリンターを構成すると、
問題に遭遇するのを防ぐのに役立ちます

一方、Rubyでは、セミコロンを付けない
0310デフォルトの名無しさん
垢版 |
2022/02/25(金) 14:56:07.65ID:S5tvR1Yl
JavaScriptはセミコロンを省略しようとすると、ハマる罠がいろいろあるからね
0311デフォルトの名無しさん
垢版 |
2022/02/25(金) 17:57:34.96ID:acR8Uc+d
自由な書き方ができるというのは無駄だと思うけど?
”波括弧は区切りとして不可欠であり(略)波括弧はブロックを形成し(略)変数がブロック終了時に自動解放”
これも別に2種の異なる記号文字の波カッコである必要はない。いちいちカッコ対応を合わせる必要もあるし、Pythonのような
オフサイドルールでも実現できるし、Rubyのように{}とbegin/endで意味が違う言語のほうがしっかりしてますよ
もともとのCではセミコロンはソースのパース処理を楽したいだけで、こんなに好意的に信じられるとはw
0312デフォルトの名無しさん
垢版 |
2022/02/25(金) 18:24:41.24ID:u7rOKKj6
>>311
そういうおもちゃ的な簡単な言語は波括弧なしでも書けるような構文しかないから何とかなってるけど
そうでない場合は波括弧が最もベストであるから様々な言語で採用されています
0313デフォルトの名無しさん
垢版 |
2022/02/25(金) 18:37:10.71ID:acR8Uc+d
ErlangもHaskellも波かっこなんて使わないけど? Fortranもないし、Juliaには合併型につかうけどブロックじゃないし
これらをおもちゃと言えるならさぞかし素晴らしいプログラム書いてるんだろうな。私の意見は「最もベスト」ではなく
ただ単に何も考えず人口の多い言語からひきずられただけ
0314デフォルトの名無しさん
垢版 |
2022/02/25(金) 18:56:15.50ID:uHAJP23d
FORTH最強
0315デフォルトの名無しさん
垢版 |
2022/02/25(金) 20:33:35.67ID:RNXuutTC
Juliaのendで閉じるのはマジでメリットがわからん
予約語が増えるし、エディタの機能で閉じ括弧にジャンプすることも出来なくなるし

Juliaなんて特にFortran出身のガイジみたいに長いコード書くガイジを招き入れようという言語なのによ
0316デフォルトの名無しさん
垢版 |
2022/02/25(金) 20:36:28.34ID:aDhOSI3t
既に書いたようにRustは積極的にセミコロンも波括弧も活用していて無駄がない
波括弧もブロックだけでなく列挙体定義、構造体定義、モジュール定義、トレイト定義、実装定義など多岐にわたる
ブロック自体も様々な制御構文に登場するだけだなく、クロージャや非同期のブロックなどの他に、所有権スコープを別にするためにブロック内ブロックも使うため、開始も終了も1文字で済む波括弧はRustにとってベストとなっている
セミコロンも>>308に書いたようにセミコロンの有無で文となるか値となるか変わってくるなど重要な意味を持っている

このようにセミコロンと波括弧はRustにおいて非常に重要な意味を持つ
これらをきちんと活用したプログラミング言語においてはセミコロンも波括弧も無駄ではない
0320デフォルトの名無しさん
垢版 |
2022/02/25(金) 21:41:12.00ID:uXH/+tNo
昔は画面に出せる文字数も少なく見通しが悪くなるのでインデントなど使わなかった
フルスクリーンエディタでもなかった
誰もインデントなど使わず意味の通じる範囲で一行に区切り入れてどんどん文を書いていった

fortranなんて一行の文字数が固定だったし複数行になる場合は非常に見づらかった
0322デフォルトの名無しさん
垢版 |
2022/02/25(金) 21:50:02.35ID:uXH/+tNo
大学でfortranの授業があり友達が勉強のためにと20万ぐらい出してパソコン用のFORTRANのパッケージを買った
俺達が今はFORTRANは実質大学でしか使われておらずモダン()な言語がもっと安く買えることを教えると
もっと先に言ってくれと激怒した

彼は一年の前期しか使わないFORTRANを購入したんだ
後期はPascalだった

Pascalを買っててもそれはそれで…
自分はCのパッケージを買ったんだなあ
0323デフォルトの名無しさん
垢版 |
2022/02/25(金) 23:51:11.41ID:q7+lZsL0
インデント言語はコードの自動生成がやりづらいという欠点はあるかな
文を出力するときにその文を含むスコープのインデントレベルだけ空白文字を出力するようなロジックが必要
括弧が必要な言語なら生成後フォーマッタにかけれぱきれいなコードになる

まあたいした差ではないとは思うけど
0324デフォルトの名無しさん
垢版 |
2022/02/26(土) 01:49:42.07ID:nCrfqvY1
Rustは配列の1要素の更新参照を渡したら
ほかの配列要素がすべて更新できないという
発狂するような仕組みになっている
0325デフォルトの名無しさん
垢版 |
2022/02/26(土) 02:01:50.91ID:hLp//vsS
本当にそれがやりたくて、かつインデックスが重ならないことを保証できるんならunsafe使っても許されるケースっぽい
0326デフォルトの名無しさん
垢版 |
2022/02/26(土) 02:12:02.48ID:ZxQjFH2y
配列の1要素の更新参照をとるときにどの要素が選ばれるかが実行時に決まるとどの要素も変更されうることになるからじゃないの?
0327デフォルトの名無しさん
垢版 |
2022/02/26(土) 02:48:53.09ID:kDTLFyam
>>308 >>316
>波括弧はブロックを形成しスコープの管理にも不可欠
インデントでブロックを形成する仕様でもスコープの管理できるのでは?
つまり、この時点では波カッコは不可欠ではないのでは?

別の言い方をすれば Rustで波カッコの代わりに、インデントでもブロックやデータの入れ子関係を表せるように言語の設計変更が可能ではないか?と思います。

あと次のnim言語の例の様に「ifの後ろにイコール記号が無ければ値(p + q か x + y)を返し、有れば機能 (bに1か2を代入)を実行」という言語仕様をすれば行末セミコロンは不要になるのでは?

a = if condition:
 b = 1
 p + q # a = p + q かつ b = 1となる
else
 b = 2
 x + y # a = x + y かつ b = 2となる
参考:https://2vg.github.io/Nim-World/condition/if.html
0328デフォルトの名無しさん
垢版 |
2022/02/26(土) 03:08:20.09ID:ZxQjFH2y
CやRustの波括弧とセミコロンはインデントがあろうが無かろうがタブとスペースが混じっていようがインデント幅がバラバラになっていようが一行に式や文がいくつ書かれていようがルールさえ守っていればコンパイルできるようにしろ、自由にコードを書かせろ、というために存在しているんじゃないか。
コーディング規則をきちんと守ってインデントする書き方なら波括弧使わずにインデントでブロックの範囲を指定できる。
0329デフォルトの名無しさん
垢版 |
2022/02/26(土) 03:15:38.69ID:ZxQjFH2y
>>327
Nimでは一行に複数ステートメントを書きたいときだけセミコロンでステートメントを区切るようになっている。
Statement list expressionを使えば以下のように書ける。

var b: int
let a = if condition: (b = 1; p + q) else: (b = 2; x + y)
0330デフォルトの名無しさん
垢版 |
2022/02/26(土) 03:43:46.90ID:Gc6jVciw
>>324
かなり習熟が必要だけど、あらかじめそういうことを理解して考慮していれば
そもそもそういう操作が必要ないように設計できるようになってくるので、どんどん困らなくなってくるよ

ライフタイムらへんはもっと難しいから、初心者はしばらくの間悩まされるし、
やはりどうにもこうにもRustの学習曲線はやばいよね
0332デフォルトの名無しさん
垢版 |
2022/02/26(土) 06:26:28.15ID:BX4iLvdt
>>327
Rustだとブロックの先頭ですぐに別のブロック開始させる場合もあるけど
インデント方式でやるといきなり二段階インデントが深くなるのはわかりくいから波括弧が向いてると思う

あとセミコロンも関数の最後の返り値の場所で別の関数を呼んだとき
セミコロンを付けると文になって呼んだ関数の副作用のみ利用で返り値無しとなり
セミコロンを付けると式(値)となって呼んだ関数の返り値が自分の返り値となる
完全にセミコロンの有無しか違いがないからRustでは波括弧もセミコロンも必須かな
0333デフォルトの名無しさん
垢版 |
2022/02/26(土) 08:10:01.51ID:vGz8MbzG
昔とはコーディング環境が違うから何とでもできるけど

本当にRustはコーディング時間と学習時間が他の言語の倍ぐらいかかる
0334デフォルトの名無しさん
垢版 |
2022/02/26(土) 09:10:31.11ID:e5W/1zqv
専用のIDEがあって、インテリセンス使えれば学習曲線が明らかに下がると思うよ
0336デフォルトの名無しさん
垢版 |
2022/02/26(土) 21:21:46.56ID:6gzH7hBI
>>332
>インデント方式でやるといきなり二段階インデントが深くなるのはわかりくいから波括弧が向いてると思う

いきなり二段階インデントは確かに嫌ですね。
そういった場面が思いつけないので例を出して頂けるとありがたいです。
0337デフォルトの名無しさん
垢版 |
2022/02/26(土) 21:23:24.03ID:rDEoBrRU
他の言語はパフォーマンスの改善とタイミングバグの対応に10倍かかんのよ
0339デフォルトの名無しさん
垢版 |
2022/02/27(日) 13:41:36.31ID:+/7Q5xyF
他の言語で1%ぐらいで発生するバグがrustでは発生しにくいように書ける
でもアホだとそもそもそこまでコードが書けないで放り投げる

コードはバグ込みでも動くものが完成しなければいけないと思うけどRustはそこまで到達しにくいかしないか
同じコードでも3倍ぐらいコーディング時間がかかる
0340デフォルトの名無しさん
垢版 |
2022/02/27(日) 14:50:22.24ID:Xl3wWN+O
色んなプログラミングをやってきたがRustが一番プログラミングしやすい
色々と言語仕様が洗練されていて書きやすいことが大きい
それに加えて開発効率が非常に高いことが挙げられる
特に実行しながらのデバッグが激減した
0344デフォルトの名無しさん
垢版 |
2022/02/27(日) 18:10:09.84ID:nXG/aSfD
静的型付け言語の中だとRustが最も書きやすいかな
特に強力なおかげでデバッグなどでもロジック本体に集中できる点がいいかな
この点は異論があまり聞かれないよね
0347デフォルトの名無しさん
垢版 |
2022/02/27(日) 18:54:50.37ID:+/7Q5xyF
ロジック本体に集中できると書いてる人はjavaかC#あたりでも使っていたら良かったんじゃないかと
0348デフォルトの名無しさん
垢版 |
2022/02/27(日) 19:00:54.33ID:gYJlUrmm
rustが書きやすい理由は関数シグネチャの情報量が多いこともあると思う
関数の型定義を見るだけでパラメーターや戻り値の値域や、所有権の移動有無が明確に分かるのは大きなメリットかと
0349デフォルトの名無しさん
垢版 |
2022/02/27(日) 19:02:15.12ID:gYJlUrmm
あと関数に渡したオブジェクトの変更可能性の有無が分かるのも良い点 (これはC++などでも分かるが)
0350デフォルトの名無しさん
垢版 |
2022/02/27(日) 19:10:22.84ID:+yReYAPt
機械的にやってないからってだけだよね
そりゃ自分でRustっぽく書き直しちゃってたら時間かかるのは仕方ない
0353デフォルトの名無しさん
垢版 |
2022/02/27(日) 20:16:19.32ID:VdMMR1Xg
C++やってるとそんなに学習コストは高くないな
デフォルトでムーブっていうのはムーブ知らない人は苦労すると思うが
0354デフォルトの名無しさん
垢版 |
2022/02/27(日) 20:45:36.21ID:c+lx/lLr
学習コストが高いっていうのって正直みんなどう感じてるんだろ?

ある意味、RUSTでプログラミングできるっていうのがステータスになってプログラマとしてこういう言語でやっていきたいワクワク感ってのがある。
昨今のPythonのブームは、AIとか自動化とはいいんだけどPython自体は確かに誰でもプログラミングできるかわりに、pythonでプログラミングできるということがなんのステータスにもならない歯がゆさを感じていた。
やっぱりC言語でポイントをマスターしてmalloc/freeとかでメモリ管理をガリガリ書いていて誰でもできるわけではないプログラミングができていた達成感というのを欲していた。
そういう悶々としていた自分にRustがでてきた久しぶりにワクワクしている。
そういうのってない?
0355デフォルトの名無しさん
垢版 |
2022/02/27(日) 20:48:49.55ID:OAiw6RqC
RefCellのborrow_mutとかその辺がマジで難しいと思うよ
なんでこんなことしなきゃならんのかって思う
0358デフォルトの名無しさん
垢版 |
2022/02/27(日) 21:16:17.18ID:TDmI4NY5
>>354
めちゃくちゃわかる
Pythonは便利さで考えると間違いなく個人的一位なんだけど、何らかの別の知識と組み合わせないと価値が生み出せない感じは確かにある。
C書いてる老人からしたら「インタープリターなんてけしからん」って感じで毛嫌いされるし...
純粋にプログラマとして名乗るなら一つはコンパイラ型言語を習得する必要がありそうだ。
0359デフォルトの名無しさん
垢版 |
2022/02/27(日) 23:07:26.84ID:Kxq1o6ES
Pythonはパッケージ管理とか型付いてないライブラリがウザい
0361デフォルトの名無しさん
垢版 |
2022/02/27(日) 23:42:37.49ID:OAiw6RqC
フロントエンドの人が最近Rust書いてるけど
JSしか書いたことない人が書ける言語じゃないと思うが
0363デフォルトの名無しさん
垢版 |
2022/02/27(日) 23:59:48.77ID:BlJE3fZv
プログラム言語に求められるニーズはホント、多様なんだな、と思った。
GoやPythonの様に仕様を簡単にして仕事をサクッと済ませたい人も居れば、「一般人では到達し得ない難易設定に取り組んで他者と差別化したい」という人も居る。
商品開発と同じで皆にドンピシャハマる言語は無いし、それを無理に作ろうとしたら、万人が物足りなさを感じる折衷案になってしまうのだろうな。

と言いつつ、皆にドンピシャハマる言語を模索している自分が居る。
「型設定、メンドクサイ〜」という人はC++で言うautoを使えばいいし、「自動化・縛り無しはバグの元!」という人はintやconstや所有権を追加すれば良い。どちらの書き方でも同じ言語上で動くし、お互いの書き方が気に入らなければ「付け足す・削る」だけで対応できるような、そんな、移植性の高い言語を作りたいものだ。
0364デフォルトの名無しさん
垢版 |
2022/02/28(月) 00:28:38.71ID:mRBEkiDP
ステータスのためじゃなく楽だから使ってるだけ
0365デフォルトの名無しさん
垢版 |
2022/02/28(月) 00:30:29.35ID:fo+smr71
>>355
どの辺に難しさを感じたの?
コンパイル時のborrow checkerと同じことを実行時にチェックするだけだからRefCellが難しいと言うより借用周りの規則がややこしい?
0366デフォルトの名無しさん
垢版 |
2022/02/28(月) 00:32:24.14ID:fo+smr71
>>357
マクロはほとんど影響ないと思う
小規模のcrateをたくさん組み合わせることが多く、プロジェクトごとにそれぞれコンパイルする必要があるので
単純にコンパイル対象のコード量が多いというのはよく言われている
0368デフォルトの名無しさん
垢版 |
2022/02/28(月) 15:19:11.30ID:XoBakguu
その通り、cargoを持ち上げてる上げてる奴とは全く仲良くなれそうもない。
cargoが遅くてダメダメ、なんで遅いのかを調べるとRustのトレイトの仕組みに行き着くという罠...
0369デフォルトの名無しさん
垢版 |
2022/02/28(月) 15:37:37.25ID:Msb6WRSo
>>365
可変参照を実行時に得たいというrustの事情はわかるのだけど
そもそもコンパイル時に参照解決できないデータ構造はめちゃくちゃ多い
その辺りをもう少し書きやすくならないかなと思う
結局面倒だからunsafeに逃げてしまうのではないかと
まだうまく言語化できずモヤモヤしてるが
0371デフォルトの名無しさん
垢版 |
2022/02/28(月) 16:29:36.75ID:ZHtGEnZl
Rust以前のコードしか書いたことない人は
借用しっぱなしで平気だからいろいろ困ってしまう
Rc<RefCell<T>>で考えられるようになると
共有所有権をクローンして持っておいて
必要な瞬間のみ動的に借用するって方法を覚える
そうして、時間軸上のスコープとでもいうか借用の瞬間を小さく管理することを覚えるのである
そうして、今まで人類は所有権と借用についていかに無頓着にやり散らかしてきたのかを反省するのである
0372デフォルトの名無しさん
垢版 |
2022/02/28(月) 16:42:42.62ID:Msb6WRSo
>>371
それはわかるんだけど
その代償としてプログラマーが支払わなきゃならない代償がデカすぎると感じる
これはコンパイル時の様々なチェックとは本質的に違う努力で
rustを騙すためにやらなきゃならないバッドノウハウの類であると感じる
0373デフォルトの名無しさん
垢版 |
2022/02/28(月) 17:21:22.82ID:nTxgkwf4
>>371
GCで困らない、システムプログラミングしない人としては、
そんな面倒な事したくないなって、思ってしまう。
0374デフォルトの名無しさん
垢版 |
2022/02/28(月) 17:29:54.30ID:XoBakguu
せめてどうにか速くならないかとcargoをRAMDISKにしようとするとCARGO_TARGET_DIR=/tmp/.cargo/...と出来るのは
良いんだけど、コンパイルのためのworkじゃなく、targetディレクトリだから成果物がそこにできてしまうという(笑
速くなるんだけどね。。
0377デフォルトの名無しさん
垢版 |
2022/02/28(月) 18:13:00.49ID:XSUMuMfa
Rust持ち上げてる内容を見ると他の言語でも普通にあるやつが多い
C++しか使ったことがないうぶな人なんじゃないかな
0378デフォルトの名無しさん
垢版 |
2022/02/28(月) 18:19:03.53ID:XSUMuMfa
頓珍漢で的外れ

型推論も賢い ← むしろ型推論実装されてて賢くない奴ってどれなんだよ
アトリビュートが言語本体と独立していて ← 当たり前 他でも同じそれが属性

Cargoが良い ← 他より優れているとは思えない

強力な型推論およびトレイト静的実装型宣言により実際の型名を記述する必要がない ← 当たり前 もともとそういうもの
0379デフォルトの名無しさん
垢版 |
2022/02/28(月) 18:27:45.82ID:qfzw0yaJ
>>374
たしかに中間ファイルのビルドキャッシュはプロジェクト間で共有しつつ、最終生成物はプロジェクト内に出力するオプションがちょっと欲しいな
Goがそういう感じだったかな
0380デフォルトの名無しさん
垢版 |
2022/02/28(月) 18:31:01.98ID:fo+smr71
そもそもrust自体言語機能が優れていることは標榜してない
他のモダンな言語の "当たり前" をシステムプログラミング領域でも実現したというのがポイントでは
0382デフォルトの名無しさん
垢版 |
2022/02/28(月) 19:04:01.39ID:7SSxP2tw
>>380
GCなく高速で動く便利なプログラミング言語が登場したことが非常に大きい
そこへ加えて強力な静的型付けにトレイトの枠組みが加わりプログラミング開発の生産性が大きく上昇
0383デフォルトの名無しさん
垢版 |
2022/02/28(月) 19:09:23.31ID:qfzw0yaJ
せやなあ
あくまでRustの重要なところはオーバーヘッドが少なく比較的安全に、システムプログラミングやベアメタルプログラミングが行える処理系だというところだよね
この特徴だけでも他の言語と大きく差別化されるけど、モダンな型システムも便利だから低レベル以外のレイヤーでも使いたがる人がいる、って感じよね
0385デフォルトの名無しさん
垢版 |
2022/02/28(月) 19:23:32.63ID:fo+smr71
381はおちょくりだし383は380と同じことを言っているだけのような
382は自分の主張を繰り返すだけの人
0386デフォルトの名無しさん
垢版 |
2022/02/28(月) 19:38:39.03ID:EeqSDih1
>>380で終わっておけば「今週末ちょっとRustやってみようかなぁ」になるけど
>>381-383が続くことによりくどくなり、「うへぇ・・・Rust関わりたくねぇ」になりそうってこと

壁からちょっと手を出すと子猫が飛びついてくるけど
全身見せて手を差し伸べようとすると逃げていくのと一緒
0387デフォルトの名無しさん
垢版 |
2022/02/28(月) 19:46:15.31ID:ZHtGEnZl
ムリに関わる必要はないし
誰もそれを強いてはいないぞw
あの言語はC++で苦しんだ連中が手を伸ばすもんだよきっと
0388デフォルトの名無しさん
垢版 |
2022/02/28(月) 19:52:14.78ID:pJo2hpV4
うちの場合だけどスクリプト言語からRustにして良かった点
・型を中心とする強力な言語機能による開発効率の大幅上昇
・メモリ省力化と高速化CPU負荷激減によりサーバー/クラウド等リソースとコスト大幅削減
・アプリやシステムなど反応速度も高速になり様々な利用者が快適となった
0389デフォルトの名無しさん
垢版 |
2022/02/28(月) 20:12:49.15ID:EeqSDih1
スクリプト言語から移行出来るような高機能なデファクトのフレームなんてRustにあったっけ・・・
0390デフォルトの名無しさん
垢版 |
2022/02/28(月) 20:26:42.23ID:EDlcC+qx
I/O待ちが大半なWebアプリじゃなくて
I/O処理やデータ加工が主体な処理なんじゃない?
そういうのでもスクリプト言語で書かれてるケース結構みるし
0391デフォルトの名無しさん
垢版 |
2022/02/28(月) 20:33:18.52ID:EeqSDih1
>>390
そんなしょうもないケースわざわざRustにしたらメンテする人いなくなるだけ
そもそも>>388以外が答えても意味ない
0392デフォルトの名無しさん
垢版 |
2022/02/28(月) 21:27:33.71ID:Msb6WRSo
「コンパイル時に参照が決まらないデータ構造に対して解決にはなってない」のがrustのいけてないところ
ここにたどり着いた俺を褒めてくれ
0394デフォルトの名無しさん
垢版 |
2022/02/28(月) 22:17:24.10ID:3KbSSRJr
>>392
バグがあるとしたらそこが怪しいって絞り込めるだけで十分。
しかもそういう参照が決まらない場所なんて限定的だし
0395デフォルトの名無しさん
垢版 |
2022/02/28(月) 22:21:48.16ID:nNGdW6Mz
CPU セントリックな処理じゃないの?
少数の同じデータを繰り返し使うような、行列処理みたいな

Ruby on Rails みたいな、全ての関数が平均的に呼ばれるようなものは、
どうにもならないでしょ?

例えば、Ruby JIT で、1万個の関数を機械語にコンパイルしても、対して速くならない

手続き中心処理はダメ。
データ駆動型じゃないと、速くならない
0396デフォルトの名無しさん
垢版 |
2022/02/28(月) 22:49:27.28ID:EeqSDih1
>>395
そういうのにスクリプト言語を選択してるのがおかしいだけで、Rustでなくても何でも普通に書けばそれなりに速い。
また繰り返しになるがRoRを置き換えられるようなRustのフレームなんてあったっけ?
そもそも>>388以外が答えても意味ない
0397デフォルトの名無しさん
垢版 |
2022/02/28(月) 23:22:44.01ID:7SSxP2tw
>>389
各自の分野と対象レイヤーがバラバラだろうから一般的な話になるが
開発のできる普通のプログラマーにとってはほとんどの分野でRustが実用的に使えるようになってるな
しかし切り貼りや書き換えや各種設定などだけでやりくりする似非プログラマーにとってはまだ厳しい
0398デフォルトの名無しさん
垢版 |
2022/02/28(月) 23:29:23.70ID:7SSxP2tw
>>392
それはRustが最高速を出すために
ジェネリクスを具体的な型に対してコンパイル時に静的にモノモーフィングするからであって利点の一つ
もちろん稀なケースでは動的にディスパッチしたほうが有利なこともあるのでRustは静的と動的のどちらも選べる
0399デフォルトの名無しさん
垢版 |
2022/02/28(月) 23:58:18.16ID:pJo2hpV4
>>396
うちではRoRは使っていません
その階層での汎用的なフレームワーク全体を作るのは大変でしょうが
必要な機能のみを必要な用途に特化して用いていますのでそのようなものを必要としていません
0402デフォルトの名無しさん
垢版 |
2022/03/01(火) 00:35:18.37ID:I7tVqKwp
>>398
その利点は理解してるよ
ポインタをつなぎかえるようなプログラム以外ではそこまで面倒だとは思わないし
ほとんどのプログラムは静的に決まるように書けるしね
0403デフォルトの名無しさん
垢版 |
2022/03/01(火) 06:36:40.86ID:kkFVnbRG
ポインタ繋ぎ変えるのはRustでは面倒です←まあわかる

ポインタ繋ぎ変えるのはバッドプラクティスなのでアリーナ使って富豪みたいなメモリの使い方しましょう← ?????w??!???????????????????w
0404デフォルトの名無しさん
垢版 |
2022/03/01(火) 18:23:47.64ID:I7tVqKwp
>>403
いや何でもかんでもArena使えってことではないよ
Arenaは処理の間、メモリの解放が起こらずに解放する時はまとめて解放するようなデータ構造で使うものだよ
rustのソース読んでたらAST作る部分で使ってた
ASTはまさにそのような部品
rustのソースは学びが多すぎる
0405デフォルトの名無しさん
垢版 |
2022/03/01(火) 18:27:16.34ID:wlQMHsd9
arenaって富豪的なの?
最近のmalloc実装はarena使ってるからそれも富豪的ってこと?
0406デフォルトの名無しさん
垢版 |
2022/03/01(火) 18:36:51.05ID:I7tVqKwp
>>405
arenaは解放処理が行われるときは必ず全てのオブジェクトが解放される
mallocはslab allocatorが上手いことやらないと解放されない
0408デフォルトの名無しさん
垢版 |
2022/03/01(火) 19:31:58.30ID:kkFVnbRG
>>404
ASTみたいな構造+途中で解放する必要があるって時の解がRustにないので、オレオレ実装をプロジェクトごとに入れるか、アリーナを何度も作っては捨ててを繰り返しながら世代型GCもどきを作るかするしかなくない?
これは事実上なんでもアリーナでやるってことになると思うけど
0409デフォルトの名無しさん
垢版 |
2022/03/01(火) 20:13:49.20ID:lFABJG9J
強力な静的型付けと言うのは普通のプログラム言語は当たり前でスクリプト崩れがそうでないだけだと思うけどなあ…
0410デフォルトの名無しさん
垢版 |
2022/03/01(火) 20:26:25.79ID:wYBPD4DC
>>408
そういうのはまさにRefCellを使うしかない
arenaはあくまで処理の間は絶対に解放されないデータ構造をまとめて確保するために使う
例えばASTだったりネットワークグラフだったりね
こういうメモリの使い方のセンスってGC言語が当たり前になったせいで完全に失われた技術って感じがする
0411デフォルトの名無しさん
垢版 |
2022/03/01(火) 20:34:17.98ID:KSXXo2gm
>>409
静的型付き言語の中でも代数的データ型や型制約のような型の表現力の違いというのはあると思うよ
0412デフォルトの名無しさん
垢版 |
2022/03/01(火) 20:36:04.73ID:wYBPD4DC
>>408
ちなみにarenaみたいな仕組みを実はV8は実装している
HandleScopeという仕組み
これはHandleScopeが生きている間はメモリが解放されないが
HandleScopeが死ぬタイミングで全てのローカル変数のメモリが解放される
0415デフォルトの名無しさん
垢版 |
2022/03/01(火) 22:06:55.93ID:kkFVnbRG
>>410
なるほど……
0416デフォルトの名無しさん
垢版 |
2022/03/01(火) 22:31:05.05ID:kkFVnbRG
いやRefCellはしんどいって
やっぱgcpointer復活して欲しい
0417デフォルトの名無しさん
垢版 |
2022/03/01(火) 23:43:07.40ID:cUOzOJ3p
RefCellなんてたまにしか使わないものだし使うときも困るようなものじゃないぜ
おそらくRustのアンチが不利っぽく見えるところを取り上げようとしてるんだろうけとさ
0419デフォルトの名無しさん
垢版 |
2022/03/01(火) 23:55:04.65ID:pLY9i2hK
分野にも依るんだろうけどWeb関係やってるとRefCellの出現は超レア
ライブラリの方のソースも全て見たけど
RustのHTTPデファクトスタンダードのhyperで1ヶ所だけ出現
その上のレイヤーのライブラリ群ではゼロ、HTTPS扱うhyper-tlsでもゼロ
0420デフォルトの名無しさん
垢版 |
2022/03/02(水) 00:44:16.33ID:2MKUvw25
Webだとメモリ上に状態を永続的に保つ必要はないからrust向きだよね
所有権を渡していくことで自然と安全なプログラムが書ける
永続情報はデータベースかmemcacheみたいなkvstoreに入れるし
0422デフォルトの名無しさん
垢版 |
2022/03/02(水) 01:27:42.89ID:vZCB5GJW
>>420
ほとんどの動的アロケーションはリクエストスコープだからという理屈?
だったら所有権というより自動変数で十分でしょ
0423デフォルトの名無しさん
垢版 |
2022/03/02(水) 02:27:42.01ID:/7glPJ4X
循環参照が必要な時にやれることが「プログラマが注意して管理しましょう」しかないのキツくない?
0424デフォルトの名無しさん
垢版 |
2022/03/02(水) 03:42:27.38ID:S8+3WyDZ
>>423
現実に色んな分野でプログラミングするとわかるが循環参照なんてほとんどの分野で出てこないか回避できる
なぜなら現実の様々なシステムからアプリまで全てにおいて出てくるデータ構造は何らかの視点で見ると木構造になっているからである
だから非現実的な机上の空論で悩む必要はない
0426デフォルトの名無しさん
垢版 |
2022/03/02(水) 03:47:03.10ID:/7glPJ4X
世界が狭い人に非現実って言われちゃった
0427デフォルトの名無しさん
垢版 |
2022/03/02(水) 03:52:48.36ID:/7glPJ4X
> なぜなら現実の様々なシステムからアプリまで全てにおいて出てくるデータ構造は何らかの視点で見ると木構造になっているからである

これが真ならベルマンフォードとか使うケースはどうなるんだ
まあ無理筋に頑張って木と同一視するのかもしらんが
0428デフォルトの名無しさん
垢版 |
2022/03/02(水) 03:58:19.90ID:S8+3WyDZ
>>425 >>426
抽象的な話しか出来ないなら相手にしないが
具体的に木構造の視点を持たないグラフを扱うシステムやアプリがあるなら挙げてごらん
そしてそのデータをどのように永続化しているのかも語って欲しい
あったとしても非常に特殊なレアケースだろう
0429デフォルトの名無しさん
垢版 |
2022/03/02(水) 04:07:57.82ID:S8+3WyDZ
>>427
ベルマンフォード法で扱うデータをポインタ(参照)で指し合うなんて非効率なことはしないので不成立
普通に配列に格納する
0430デフォルトの名無しさん
垢版 |
2022/03/02(水) 04:21:43.92ID:3w84ACsj
よくわかっていないけど
鉄道の路線図とか簡単にループするけど
どうするの?
0432デフォルトの名無しさん
垢版 |
2022/03/02(水) 04:38:01.52ID:S8+3WyDZ
>>430
プログラミングでそういうのを扱うときに
駅の個数だけ駅ノードオブジェクトをメモリ確保して路線毎に隣接駅をポインタ(参照)で指し合う、なんてことはしない
それだと何かするたびにポインタを何度も辿りまくって遅いし
そのポインタで指し合う構造をデータベースに格納するのも大変

現実にはどう扱われているかというと
データの配列として持ってそのインデックス等で他を指す
つまりポインタ(参照)は出てこない
配列とインデックスの方が扱いやすいし、メモリアクセスも速いし、ファイルやデータベースに格納するのも容易

>>431
現実に必要となることが無いか、代替手段があるか、となり、
残る超レアケースがあるなら出してごらん
0433デフォルトの名無しさん
垢版 |
2022/03/02(水) 04:43:14.42ID:re9dUtRi
>>432
お前が>>424
> なぜなら現実の様々なシステムからアプリまで全てにおいて出てくるデータ構造は何らかの視点で見ると木構造になっている
と宣うから、俺が
> グラフとか木構造になるの?
って聞いてるんだがwwww
0434デフォルトの名無しさん
垢版 |
2022/03/02(水) 04:55:17.69ID:S8+3WyDZ
>>433
現実の様々なシステムからアプリまで全てにおいて出てくるデータ構造ならば
何らかの視点で見ると木構造になっている
もちろんその一番簡素なパターンである配列構造を含めてね
今のところ誰も反例を出せていない
もしあるとしても超レアケースなのだろう
0436デフォルトの名無しさん
垢版 |
2022/03/02(水) 05:01:58.37ID:S8+3WyDZ
>>435
現実の様々なシステムからアプリまで全てにおいて出てくるデータ構造の何のグラフですか?
ベルマンフォード法ならば>>429に書いたように配列で扱われます
鉄道の路線図についても>>432に書いたように配列で扱われます
0437デフォルトの名無しさん
垢版 |
2022/03/02(水) 05:06:59.01ID:re9dUtRi
>>436
> グラフとか木構造になるの?
こう聞かれて特定のグラフだと思う方がおかしくね?
答えられないなら何レスも使わずに分からないと言って欲しい
0438デフォルトの名無しさん
垢版 |
2022/03/02(水) 05:18:20.52ID:S8+3WyDZ
>>437
そこまでキチガイならば相手をしない
こちらは最初から一貫してこの話しかしていない

>>424 引用
| 現実に色んな分野でプログラミングするとわかるが循環参照なんてほとんどの分野で出てこないか回避できる
| なぜなら現実の様々なシステムからアプリまで全てにおいて出てくるデータ構造は何らかの視点で見ると木構造になっているからである
| だから非現実的な机上の空論で悩む必要はない

そしてそちらが挙げた具体例に対して
それらは現実に配列として扱われていることも述べた
0440デフォルトの名無しさん
垢版 |
2022/03/02(水) 05:32:08.74ID:2MKUvw25
言ってることは分かるよ
俺はrust書き始めてポインタを使わないプログラミングをするようになった
C/C++に毒れてたことに気がついた
例えば木構造も配列とインデックスで同じことをやるように書き直した
昔のAhoやUllmanのアルゴリズムの本はポインタを前提にしてないから
配列とインデックスを使ってアルゴリズムを書いてる
その本を引っ張り出してきて読み直したりした
まさか現代において70年代に書かれた本を参考にするとは思わなかった
0441デフォルトの名無しさん
垢版 |
2022/03/02(水) 05:45:14.10ID:re9dUtRi
>>438は「分からない」ようだから話を進めると、グラフ構造は木構造にはならない
なぜなら、木構造はグラフ構造の一種だからw

グラフ構造を単純に実装すると、親ノードが子ノードを参照する形になり、簡単に循環参照を発生する
そういうこともあり、古来通常の実装はノードから直接参照するのではなく、エッジというものを用意し
各コンテナに保存した上で参照先をコンテナのキーにすることで表現する

つまり循環参照は簡単に発生し、それを回避する努力を惜しまない必要がある
>>423の言う通り、まさに
> 循環参照が必要な時にやれることが「プログラマが注意して管理しましょう」
であることが明確に分かる

これをろくに議論もできない頭で否定するものではないw
0442デフォルトの名無しさん
垢版 |
2022/03/02(水) 05:48:19.98ID:ZvwBufG6
配列とインデックスを使うとして、ある要素のインデックスを取った後にその要素が削除されるとそのインデックスが想定していない要素を指すことになるじゃん。そういうのはみんなどうやって防いでいるの?

あと、双方向リンクドリストって普通に実装すると循環参照になるけどこれも配列とインデックスでやるの?
0443デフォルトの名無しさん
垢版 |
2022/03/02(水) 05:52:14.90ID:re9dUtRi
原理的には整合が取れない状態にならないように操作がatomicになるように実装する
もちろん実装方法なので、構造を変えたり、方法は具体的にはいろいろあるよ
0444デフォルトの名無しさん
垢版 |
2022/03/02(水) 06:14:19.31ID:S8+3WyDZ
>>441
そこまでアホとは思わなかったw
一般的なグラフが木構造にならないのは当たり前だろ
まさかそんなことを言いたいがためにこちらの質問に回答できなかったのかw
呆れた

現実に色んな分野でプログラミングするとわかるが循環参照なんてほとんどの分野で出てこないか回避できて残りはレアケース
なぜなら現実の様々なシステムからアプリまで全てにおいて出てくるデータ構造は何らかの視点で見ると木構造になっているからである
さらに既に例で示したようにベルマンフォード法などのグラフにおけるアルゴリズムを扱う場合も現実のプログラミングでは配列として扱われている
だからそんな非現実的な机上の空論で悩む必要はない

>>442
そういうレアケースのために
Rustでは双方向リンクドリストも含めて標準ライブラリに用意されている
その上で注意書きとしてほとんどのケースではリンクドリストを使うよりも配列やリングバッファ(RustではVecDeque)を使った方が有利と明記している
これは言語に関係なく成り立つ話
0445デフォルトの名無しさん
垢版 |
2022/03/02(水) 06:20:20.10ID:re9dUtRi
>>444
そんな単純なことが返事できなかったのはお前だろwwww
そんな頭で「非現実的な机上の空論」とか言ってる場合じゃない
循環参照問題はレアケースではなく明確で常に回避を必要とし、各分野で日々回避方法が研鑽されている
Rustも例外ではない
0446デフォルトの名無しさん
垢版 |
2022/03/02(水) 06:39:13.56ID:S8+3WyDZ
>>445
そんな当たり前のことをわざわざ尋ねてくるほど君が低レベルとはその時は想定していなかった
結局のところ君は具体的な反例を出せずに非現実的な机上の空論を続けるだけなのかね

現実の様々なシステムからアプリまで様々なものにおいて出てくるデータ構造は何らかの視点で見ると木構造になっているものがほとんどであり循環参照で悩む必要はない
一般的なグラフ上の各種アルゴリズムについても配列上のデータとして扱われるのが通常
ポインタで指し合うデータ構造をとってもポインタを何度もたどるのはメモリアクセスで不利でキャッシュ的にも不利であり、もちろん永続化として格納する時も同じく
0447デフォルトの名無しさん
垢版 |
2022/03/02(水) 06:42:03.58ID:re9dUtRi
俺が言ってるのは循環参照問題は重大な問題であるということw
反論出来てないのはお前w
Rustの標準ライブラリはunsafeのオンパレードだなw
0448デフォルトの名無しさん
垢版 |
2022/03/02(水) 07:11:01.35ID:jfLsV1Py
>>447
その最後の行「Rustの標準ライブラリはunsafeのオンパレードだなw」によって
あなたがプログラミングについて無知だと判明しました

言語関係なく一般的にその「unsafeな操作」無しではプログラミングは成立しません
そのため各プログラミング言語はその「unsafeな操作」を様々な方法で閉じ込めようとしたり
あるいはC/C++のように全開放して全てをプログラマーの自己責任としたりしています
いずれにしても各言語の内部では「unsafeな操作」が当然ながら頻出となります

一方でRustでは従来にない以下の方針を取ることにしました
・GCを言語としては採用しない
・それにも関わらずプログラム全体のメモリ安全性をコンパイラが保証できるようにする
・必ず残る必須な「unsafeな操作」は型やモジュールの外に影響が出ないよう内部に閉じ込める
・その型やモジュールが外に提供するインタフェースは(unsafe宣言されているものを除いて)安全に提供する
つまりプログラミングをする上で避けることができない「unsafeな操作」を
C/C++のように(結果的に)プログラム全体に散りばめてしまうのではなく
ライブラリなどの内部に完全に閉じ込めて外に影響が出ない安全なインタフェースのみ提供することにしたのです

Rustはこの方針によってプログラミングに不可欠な必須の「unsafeな操作」なだけでなく
実行効率の良さのための「unsafeな操作」も型やモジュールの内部に閉じこめることが可能となりました
そして安全なだけでなく速さも両立することに成功しました
0449デフォルトの名無しさん
垢版 |
2022/03/02(水) 07:19:39.02ID:re9dUtRi
いやいや、普通unsafeなコードというのは外部とのやり取りの薄皮一枚だけで収まるはずなんだがw
Rustだと都合により内側でも使います!
みたいな使い方で、標準ライブラリの中ではやりたい放題されてるように見えるってことw
ベアメタルとかになると標準ライブラリも使えないわけで、薄皮一枚だけunsafeにしても足りず泣く泣くunsafeを使う羽目になり、、、
安全とは一体・・・になりそうってことなんだわw
0450デフォルトの名無しさん
垢版 |
2022/03/02(水) 07:27:54.59ID:jfLsV1Py
>>449
そんなに無知を曝け出さないほうがいいと思いますよ
「unsafeな操作」とは何か、そしてその避けられない操作に対してRustがどのように
並行並列環境に至るまでメモリ安全性の保証を実現させたのか勉強するのをお勧めします
0452デフォルトの名無しさん
垢版 |
2022/03/02(水) 09:17:36.83ID:uPKvDIET
>>449
ベアメタルでliballocは使えるからデータ構造を再実装しないといけないケースはあまりないのでは?
0453デフォルトの名無しさん
垢版 |
2022/03/02(水) 09:26:05.15ID:bQ8fspy2
>>440
温故知新ですな
0454デフォルトの名無しさん
垢版 |
2022/03/02(水) 09:36:25.73ID:bQ8fspy2
>>449
unsafeは無くすことできないから閉じ込めるってことなんだが。
unsafeあったらダメ原理主義者ですか?
0455デフォルトの名無しさん
垢版 |
2022/03/02(水) 10:24:25.41ID:/7glPJ4X
>>432
結局データの配列として持つことになるのはわかるけど、それって指す先が存在するか分からないから実質ポインタとやってること同じだし、途中で要素削除があるとインデックスの整合性保つのに一苦労するじゃん

まあ君にとっては「レアケース」であり「現実に必要となることが存在しない」のかもしれんが、実際に存在するとだけは言っておくわ

あと、配列とインデックスの方がメモリアクセスも速いってのはわからんかった。配列とインデックスの方がポインタより速いってなんでだろ
0456デフォルトの名無しさん
垢版 |
2022/03/02(水) 10:28:21.60ID:/7glPJ4X
まあベルマンフォードする前に配列とインデックスの形式に変換するくらいのことは出来るけど、結局その前段階のミュータブルなグラフを配列とインデックスで管理するのはキツい
アリーナでオレオレ世代型GCモドキを作った方がまだマシ
0457デフォルトの名無しさん
垢版 |
2022/03/02(水) 10:32:20.03ID:/7glPJ4X
あとは配列とインデックスの代わりにHashMapとkeyにするとかかな?
0458デフォルトの名無しさん
垢版 |
2022/03/02(水) 10:38:44.95ID:ywlh+FF4
配列とインデックスってすげーunsafeなコードだよな
unsafeブロックの外側でunsafeな処理をしている分余計性質が悪い
0459デフォルトの名無しさん
垢版 |
2022/03/02(水) 11:04:57.08ID:uPKvDIET
>>455
配列indexでグラフ構造表現する場合、インデックスが変わるような方法で要素を削除することはしないのでは
要素ごとに削除フラグを立てるとか、free listで未使用要素のインデックスを管理するとかが普通だと思う

>>458
ここで言うunsafeってどういう意味のunsafeなの?
rustの定義のunsafeとは違うことを言っているようにみえる
0460デフォルトの名無しさん
垢版 |
2022/03/02(水) 11:42:21.29ID:bQ8fspy2
>>456
>その前段階のミュータブルなグラフを配列とインデックスで管理するのはキツい
>アリーナでオレオレ世代型GCモドキを作った方がまだマシ

同意
0461デフォルトの名無しさん
垢版 |
2022/03/02(水) 12:43:54.27ID:jfLsV1Py
グラフなどのノード構成において
他のノードを指す方法として「idを用いる」のと「ポインタを用いる」のは完全に同型
というのがプログラミングでの常識です
同型というのは通常の管理からダングリングの発生やその防止も含めて同型です

配列に格納してそのインデックス方式も「idを用いる」方式の一種ですから
これも当然「ポインタを用いる」のと完全に同型です
どちらか片方の管理方法がキツイと言ってる人は完全に間違っています

これはGCを考慮した場合についても完全に同型です
誰もそのポインタを指さなくなったことと誰もそのidを指さなくなったことが対応します
したがって配列とインデックスで管理することで管理がキツくなることはありません
そしてGCをする場合も全く同型なので同じ方式同じアルゴリズムで互いに行うことができます
0463デフォルトの名無しさん
垢版 |
2022/03/02(水) 13:01:35.27ID:re9dUtRi
>>452
標準のをそのまま使えと?
想定ケース次第だと思うけど、どういうのが多いんだろうね

>>454
主旨が伝わってない...
まあ標準ライブラリ以外でunsafeを使ったら、それをcrateごとに分かるように名前にunsafeを付けるなりはしてほしいね

>>461
循環参照の回避はできてんだろ何言ってんだ…
0465デフォルトの名無しさん
垢版 |
2022/03/02(水) 13:23:30.55ID:S8+3WyDZ
>>461
それは全て正しいが
現実にはそこに付け加えるべき重要な事項がある
GCのコードを書くとわかるが使われたidの一覧が必ず必要となる
ポインタ方式ならば使われたポインタの一覧が必ず必要となる
インデックス方式ならば使われたインデックスの一覧が必要となる

すると『使われたポインタの一覧を管理するコスト』よりも
『使われたインデックスの一覧を管理するコスト(=最大インデックスまで)』がはるかにコストが低い
つまりGCをする場合でもインデックス方式が有利となる
もちろんそれ以外のアルゴリズムなどは同型なので同じという点には同意
0466デフォルトの名無しさん
垢版 |
2022/03/02(水) 13:37:04.28ID:YHOWtvAG
循環参照がレアケースとかいう人はもう発言しないでいいと思う
数年間は黙ってみんなの意見を読んで勉強しましょうね

>>423
> 循環参照が必要な時にやれることが「プログラマが注意して管理しましょう」しかない

それがGCなし言語
それがRustの選んだ道
メモリ管理はプログラマが手動でなんとかするしかない

>>445
> 各分野で日々回避方法が研鑽されている

心静かに同意だわ

>>458
> unsafeブロックの外側でunsafeな処理をしている分余計性質が悪い

キミは賢いね
0467デフォルトの名無しさん
垢版 |
2022/03/02(水) 13:59:21.59ID:jfLsV1Py
>>465
その点についてはおっしゃる通りです
ポインタ一覧を管理するコストとインデックス一覧を管理するコストは同型か否かの枠外です
ダングリング防止やGCアルゴリズムなどは同型となるでしょう

>>466
あなたはRustにおけるunsafeとは異なる意味でunsafeという単語を用いているようです
もちろんRustと無関係な場においてunsafeの意味を独自に用いるのはあなたの自由です
しかしあなたはRustという単語を出していますからRustにおけるunsafeの意味に従う必要があります
勉強して出直してくることをお勧めします
0468デフォルトの名無しさん
垢版 |
2022/03/02(水) 14:08:49.30ID:AHCbeeLg
だんだん話がオレオレGCになってきたな
結局GCは必要なんだよ
必ずしも標準に入ってる必要はないが、優秀はGCライブラリが存在しないのはかなり痛い
0469デフォルトの名無しさん
垢版 |
2022/03/02(水) 14:23:16.86ID:jfLsV1Py
>>468
いいえ、GCは必ずしも必要あるわけではありません
GCが必要になるのは少なくとも以下の2点を満たす必要があります
・継続して動作させる必要がある
・使われていないメモリが有意に存在している
例えばGC言語であっても前者の継続動作が必要なければGCさせないモードで動かすケースもあります
一方で後者はGC言語であれば常に使われていないメモリが溜まっていきます
しかし非GC言語ではたいていの場合はメモリ開放をすることができるためGCは不要です
どうしても循環強参照を起こしたいというかなり特殊な状況でなければGCが必要になることはないでしょう
0470デフォルトの名無しさん
垢版 |
2022/03/02(水) 14:32:11.16ID:AHCbeeLg
あ、循環参照はかなり特殊な条件派のひとだったか
じゃあ話すことはないや
0473デフォルトの名無しさん
垢版 |
2022/03/02(水) 14:56:29.68ID:jfLsV1Py
>>470
循環強参照を起こしたいかなり特殊な状況であっても
プログラムを継続して動作させる必要がなければGCは不要です
これは広義にはプログラム自体は継続してもその構造が長期継続しなければ成り立ちます
例えばRustならばtyped_arenaなどを用いればその構造の利用を終える際に一気に全体を消去可能です
また別の視点からはデータが単調増加ならば不要部分が発生しないのでこれもGCは不要です
これら全ての条件を相反するような条件が全て揃った時のみGCが必要となるでしょう
もしそのような具体的なケースが頻繁に多数有るならば教えていただけると勉強になりますのでよろしくお願いします
0474デフォルトの名無しさん
垢版 |
2022/03/02(水) 15:05:14.83ID:AHCbeeLg
なんで特殊な条件派を説得しにかからず初手会話放棄するかというと、仕事で使っていておいそれとネットに晒せないからですね
なので秘密を打ち明けなくても前提に同意してくれている人とのみ話す訳ですよ
0475デフォルトの名無しさん
垢版 |
2022/03/02(水) 15:13:30.85ID:S8+3WyDZ
>>474
一般的な用途ならば仕事に関係なくその一般的な用途だけ話せばよい
そうでないのならば
君も一般的な用途でGCが必要となる具体例は無い派ということになる
0476デフォルトの名無しさん
垢版 |
2022/03/02(水) 15:16:36.71ID:AHCbeeLg
>>475
一般的な話をすると増えたり減ったりする双方向グラフを更新し続けて持ち続けるという要件になるな
それ以上の説明を求められると何に使うのかという話をすることになり、俺の仕事の説明をすることになる
0477デフォルトの名無しさん
垢版 |
2022/03/02(水) 15:18:35.45ID:AHCbeeLg
「一般的な用途」というのがどういう定義なのかしらんが、「Rustで簡単に出来る範囲を一般的と呼ぶ」と恣意的に定義するのであれば俺もその派に入れてくれて良いよ
0478デフォルトの名無しさん
垢版 |
2022/03/02(水) 15:32:26.52ID:jfLsV1Py
>>476
それならばその双方向グラフの安全な型を作るのがベストソリューションです
ちなみになぜそのような一般的なライブラリがないかというと各々で求められる条件が異なるからです
あなたの場合は求められる条件が確定しているのですからそれを満たす双方向グラフの安全な型を実装できます
例えばノードが削除される場合もその際の条件やその後の処理が独自に確定しているはずです
したがってそれを元に双方向グラフの安全な型を実装して安全なインタフェースのみ提供すればいいのです
そうすればRustのコンパイラに対してもプログラム全体が安全に通るでしょう
そして循環参照についてもその双方向グラフの安全な型が責任を持って取り扱えばよいのです
汎用的なGCは不要でその状況に特化したものを用意すればいいだけなので容易に実現できると思います
0479デフォルトの名無しさん
垢版 |
2022/03/02(水) 15:45:33.96ID:AHCbeeLg
>>478
まあできるかどうかで言えば出来ますけどね。容易とは思わないけど。
結局>>423なんだよな。そもそも頑張って安全なインターフェースを提供するだけならCでもできるし(>>478には容易かも)

まあ汎用GCついてる言語ならこんな面倒なことしないでいいのでGC言語使おうってことだろうな
0480デフォルトの名無しさん
垢版 |
2022/03/02(水) 15:46:04.46ID:re9dUtRi
$ cat hoge.sh
cat >hoge.rs <<EOF
// unsafeって宣言に出てこないし安全に決まってるよ!
fn read_address_4byte(address: usize) -> i32 {
unsafe {
*(address as *const i32)
}
}
// 流石Rust安全だな!
fn main() {
read_address_4byte(0);
}
EOF
rustc hoge.rs && ./hoge
$ bash hoge.sh
hoge.sh: 13 行: 124161 Segmentation fault (コアダンプ) ./hoge
$
0481デフォルトの名無しさん
垢版 |
2022/03/02(水) 15:58:09.24ID:jfLsV1Py
>>479
いいえ、C言語にはここでいう「安全な」の定義がないので無意味です
一方でRustでは「安全な」インターフェースを提供する型を作れば
それを用いてコンパイラによりプログラムの安全性を保証することが可能です

>>480
「unsafe」の勉強をして出直して来ることを勧めます
そのread_address_4byte関数は条件を満たせていないので
unsafe fn read_address_4byte(address: usize)と宣言しなければいけません
0482デフォルトの名無しさん
垢版 |
2022/03/02(水) 15:59:49.43ID:AHCbeeLg
>>481
あー。まあそれはそうね外側でもunsafeなのは頂けないたしかに
0483デフォルトの名無しさん
垢版 |
2022/03/02(水) 16:02:47.42ID:re9dUtRi
あれぇ・・・コンパイル通ってないと実行できないんだけどなぁwwww
エラーも何も出てこないんだけどなぁwwww
安全とは???
Rustが安全!?
何をご冗談をw
0484デフォルトの名無しさん
垢版 |
2022/03/02(水) 17:00:29.10ID:YHOWtvAG
教官「GC無しで手動メモリ管理してきた言語だ、面構えが違う」


C/C++/Rust「( ゚ω゚ )」
0486デフォルトの名無しさん
垢版 |
2022/03/02(水) 17:53:39.61ID:jfLsV1Py
>>482
そう
外側ではunsafeを使わない
その上で今回のケースはその独自仕様の双方向グラフの「安全な」型を作れば、Rustではプログラム全体の安全性が保証されます
そして「安全な」型を作るには
・型が外へ提供する「安全な」インターフェイス群を用いる限り、それらをどのように用いても、型の内部に矛盾や危険な状態を生じさせないこと
・たとえ型の内部でunsafeな操作が存在していても、型の外へは影響せずに内部に封じ込められていること
このような形で新たな型を実装することで全体を安全に解決できるところが他の言語にはないRustの特徴でしょう
0487デフォルトの名無しさん
垢版 |
2022/03/02(水) 18:05:00.35ID:/7glPJ4X
まあGCライブラリさえあれば双方向グラフも簡単に作れるんですけどね
Javaくらいの出来のGCライブラリがついたら最強
0488デフォルトの名無しさん
垢版 |
2022/03/02(水) 18:30:26.52ID:nWwg4aea
Rustには静的型付けがあるすげー ← スクリプトから来た人
Rustは強力な型推論がある ← スクリプトかC++から来た人

こういう主張をする人は世間知らず
つまり雑魚
0489デフォルトの名無しさん
垢版 |
2022/03/02(水) 18:40:10.58ID:uPKvDIET
関数型言語以外の型推論は大体が変数の型や戻り値型の推論で、HM型推論採用してる言語ってあまりない気がする
もしそうならば非関数型言語にしてはRustは型推論が強力と言っても良いのでは
0490デフォルトの名無しさん
垢版 |
2022/03/02(水) 18:42:57.57ID:re9dUtRi
お猿さんは『「安全な」型を作れば、Rustではプログラム全体の安全性が保証されます』などと宣っているが、それは言語で保証しているのではなく、プログラマが手で保証しているに過ぎないw
つまりunsafeなブロックを少しでも含むものはC/C++と変わらないわけで、それを使っている部分も、どこでどう使うものなのか分からない限りC/C++と変わらないということw
さらに悪質なのは、Rustの外のライブラリなどunsafeな何かを呼び出しているわけでもないのに、自前で破壊的なコードを内包できる仕組みw
こうなると、もう外面だけでは分からないわけで、Rustの安全神話は完全に崩壊するw

またこのような状況に拍車をかけているのが自前で破壊的なコードを内包する動機になりやすい所有権の概念w
安全性の根幹をなす部分であるにも関わらず、双方向参照への例外なく簡単に適用可能な安全かつ高速な対応方法が存在していないw
これはプログラマに対してunsafeへの誘惑を助長する形で、逆に安全神話の崩壊を招いているw

まあRustは数ある実装言語の1つとして今後も使っていくとは思うけど、何でもRustに肩入れするお猿さんとはちゃんと線を引いていきたいw
0491デフォルトの名無しさん
垢版 |
2022/03/02(水) 18:47:26.04ID:uPKvDIET
https://www.thecodedmessage.com/posts/unsafe/
> “If you have to use unsafe to write good Rust, then Rust isn’t a safe language after all! It’s a cute effort, but it’s failing at its purpose! Might as well use C++ like a Real Programmer!”
このブログでstrawmanとして挙げられてる主張そのまんまじゃん
まずは議論のベースラインとしてこの記事読もうぜ
0492デフォルトの名無しさん
垢版 |
2022/03/02(水) 18:57:48.03ID:jfLsV1Py
>>490
全然違いますよ
CやC++ではunsafeなコードがプログラム全体に散らばってしまうため複雑になればなるほど人間にはどうしようもなくなります
一方でRustではunsafeなコードを各ライブラリや各型の中に封じ込めて外へはその影響を及ぼさないことを保証するだけでいいのです
あとはプログラム全体がどんなに大きく複雑になろうともコンパイラが安全性を保証してくれます
0493デフォルトの名無しさん
垢版 |
2022/03/02(水) 19:01:56.37ID:nWwg4aea
Rustの推論はプログラム追記で破綻する
後方で馬鹿が型を間違えて追記した場合予想した結果と異なる結果になる
しかもエラーが出ない

仕様が悪い
0499デフォルトの名無しさん
垢版 |
2022/03/02(水) 20:11:07.76ID:6P1w2PJ+
底辺プログラマにunsafeを使わせないってことで安心安全になる仕組みなんだね
0500デフォルトの名無しさん
垢版 |
2022/03/02(水) 20:20:58.51ID:re9dUtRi
より正確には底辺プログラマや広範囲な用件にRustを勧めないことで、双方向参照要件などの対応に破壊的なコードを混入させない/混入しても経験豊富なC/C++プログラマが書くコードに匹敵する品質にさせることで、安心安全になる仕組みw
0504デフォルトの名無しさん
垢版 |
2022/03/02(水) 22:42:38.46ID:8rl40gQE
>>458
確かにimmutableな配列とインデックスは整合性を保って更新される保証が無いから別の仕組みでラップする必要がある
それってunsafeをラップするのと変わらないかもな
0505デフォルトの名無しさん
垢版 |
2022/03/02(水) 23:57:29.40ID:re9dUtRi
out-of-boundsとsegmentation faultは違うw
前者はsafeかつ検出可能な実装ミスで、後者は検出可能か不明な未定義動作w
0509デフォルトの名無しさん
垢版 |
2022/03/03(木) 08:01:02.29ID:PSnBqABg
>>503
プログラミングできます→馬鹿の可能性あり
Rustできます→馬鹿でない
ステータスになるな
0510デフォルトの名無しさん
垢版 |
2022/03/03(木) 09:55:48.59ID:hTxF5AaQ
プログラミングできます→馬鹿の可能性あり
Rustできます→ステータスになると勘違いした馬鹿確定
0511デフォルトの名無しさん
垢版 |
2022/03/03(木) 10:16:01.15ID:sMoqT2I4
実際問題、言語知識の有無なんかよりもそういう無駄なプライドのがよっぽど開発の邪魔をするからな。
0512デフォルトの名無しさん
垢版 |
2022/03/03(木) 11:35:08.39ID:hTTcwRYV
アマチュアがステータス目的で手を出す言語:C++, Haskell, Scheme
ドカタが生きるために手に取る言語:Java, JS, php
情報系出身が身につけていがちな言語:C, C++, Pascal, Prolog, Emacs Lisp
電気屋さんが必要にかられて手を出す言語:C
測定機器に囲まれてる人が手を出しがちな言語:matlab, LabVIEW
0514デフォルトの名無しさん
垢版 |
2022/03/03(木) 18:29:13.09ID:qZcuxxc0
PrologとLispくらいは簡素なわりに他言語と差があり
学習しておくと各言語を客観視しやすくなって役立つね
0519デフォルトの名無しさん
垢版 |
2022/03/03(木) 19:54:47.77ID:7NN6zDR3
電気屋さんも馬鹿にできないんだぞ
日頃ハンダゴテ握ってるような人も
PICやFPGA触ってたりするんだもん
0521デフォルトの名無しさん
垢版 |
2022/03/04(金) 12:49:38.60ID:/ow399Ux
>>515
さすがにチューリング完全をプログラミング言語じゃないと疑うのは不勉強。
brain f*ckですらプログラミング言語言われているのに。
0522デフォルトの名無しさん
垢版 |
2022/03/04(金) 13:23:54.20ID:4zB49VIz
よくチューリング完全を引き合いに出す人いるけど、その定義だと感覚的に合わないものまでプログラミング言語の枠に収まるし、prologはそんなこと考えるまでもなくプログラミング言語だろ
しかも(俺は>>515ではないが)515が言いたいのは自然言語に近いと言いたいだけだと思う
実際中身は手続き型の言語と大差ないんだけどw
0525デフォルトの名無しさん
垢版 |
2022/03/04(金) 14:49:04.72ID:e8gLPWot
自然言語は全く関係ないな
手続き型言語しかやったことのない似非プログラマーには宣言型言語がそう見えるのか
0526デフォルトの名無しさん
垢版 |
2022/03/04(金) 15:28:18.85ID:4zB49VIz
頭固いねw 例えば、

親(ひろし,ももこ).
親(友蔵,ひろし).
親(友蔵,すみれ).
親(すみれ,ももこ).
男(ひろし).
男(友蔵).
女(すみれ).
女(ももこ).
祖父(X,Y):-男(X),親(X,Z),親(Z,Y).
?-祖父(X,Y).
X = 友蔵, Y = ももこ

みたいなことができるってこと
二個出るけどw
0527デフォルトの名無しさん
垢版 |
2022/03/04(金) 16:28:33.22ID:ZrKtVmP5
プロログはパターンマッチ型データベースに見える
あと同じのが二つ出るのは近親相姦してるからだ
0532デフォルトの名無しさん
垢版 |
2022/03/04(金) 21:28:27.24ID:e8gLPWot
>>529
JavaScriptからRustまで何でもサポートしてるから好きな言語を使えばいい
速さや省メモリを求めるならRust
0534デフォルトの名無しさん
垢版 |
2022/03/04(金) 21:37:10.95ID:4zB49VIz
"Flix is inspired by OCaml and Haskell with ideas from Rust and Scala."ってどこにもprologさんいないんだがw
0537デフォルトの名無しさん
垢版 |
2022/03/04(金) 21:45:34.71ID:4zB49VIz
>>535
お前本当にアセンブラで書いたことないだろw
手でプロセッサやキャッシュを最適にするように書くと、最速ロジックの-O3からさらに数倍速くなるよw

>>536
論理型なら今はPrologでいいと思う
0540デフォルトの名無しさん
垢版 |
2022/03/04(金) 22:31:46.55ID:CBAI4YxM
>>528
if文をどの節で処理するかで表現するとか
ループを再帰で書くとか癖が強いからなあ
再帰を理解してくれない人も多いし
0541デフォルトの名無しさん
垢版 |
2022/03/04(金) 22:53:14.64ID:4zB49VIz
日本はPrologまだ使われてる国とかwikipediaか何かに書いてあったよw
世界でどういう状況かは推して知るべしw
0543デフォルトの名無しさん
垢版 |
2022/03/04(金) 23:37:07.33ID:2tyOtSaX
>>542
理由が興味深いね
ブロック内スコープ変数宣言をの有用性に気付いたみたい

> Linus Torvalds氏はLinuxカーネルメーリングリスト(LKML)に
> 「この種の非投機的なバグが発生する理由は、C99スタイルの
> 『ループ内での変数宣言』という選択肢をわれわれが今まで持ち合わせてこなかったためにほかならない。
> つまり、list_for_each_entry()といったものすべては基本的に常に、最後のHEADエントリーをループ外にリークさせる。
> というのも、ループ本体内でイテレーター変数を宣言できないためだ」と記している。
0544デフォルトの名無しさん
垢版 |
2022/03/05(土) 00:50:53.23ID:TqcF1vbz
>>543
なにがそんなに有効なのかわからんわ
どこでも変数宣言できたら、どこで宣言されてるかわかりづらいだろ
変数宣言は一番最初って決まってたほうがよくね?
0545デフォルトの名無しさん
垢版 |
2022/03/05(土) 00:56:06.36ID:IxOGShAZ
>>544
イテレーター変数(ループ内だけで使う変数)をわざわざ関数の一番上で宣言するのは
すごく古臭いスタイルって気がする
0550デフォルトの名無しさん
垢版 |
2022/03/05(土) 09:49:50.73ID:O/czQsw9
大変興味深いよな
世の中の色々大事なソフトウェアってやっぱCで書かれてんのよね
Linuxの恩恵はC89の恩恵
他のどんな言語でこれがなし得るというのよ
そう考えると世の中ゴミ言語ばっかだな
0552デフォルトの名無しさん
垢版 |
2022/03/05(土) 10:59:24.96ID:5tAMjVxe
>>550
まるで大事なソフトはLinuxカーネルしかないみたいな言いぶりだな。
こうやって捏造されてくのか。
0553デフォルトの名無しさん
垢版 |
2022/03/05(土) 12:48:23.26ID:b38ED9f7
C言語はベストパフォーマンスを出せるプログラミング言語
ただしLinuxコードでも何度も起きて来たように
C言語は慎重に厳格なコードチェックを常に継続する必要があり
ちょっとスキができると様々な穴が生じてしまう

そこで誕生したのがC言語と同じベストパフォーマンスを出せるRust
Rustは強力な言語機能によりプログラミング効率が上がるだけだなく
メモリ安全性やデータ競合などの問題をコンパイル時にあぶり出し実行時の安全を保証する
つまりC言語の利点を持ったままさらに便利に安全なプログラミングをすることができるのがRustである
0557デフォルトの名無しさん
垢版 |
2022/03/05(土) 13:43:51.14ID:C4PmhV7a
C言語はGCがないし、整数をポインタに変換できるし
正しくない言語は大事ではないから一個でいい

正しい言語は大事だから色々な方言を作ったり定期的に捨てて作り直したりする
0558デフォルトの名無しさん
垢版 |
2022/03/05(土) 14:13:05.07ID:GsTUxSAJ
ループ本体に変数を宣言できないから
C11に移行するって動機があまりにも前時代的すぎんか?
0560デフォルトの名無しさん
垢版 |
2022/03/05(土) 15:37:44.81ID:zsDIUHb7
記事だけだとよく理解できんな。ブロック内の変数宣言はC89でも可能じゃないか?
0564デフォルトの名無しさん
垢版 |
2022/03/05(土) 16:27:21.01ID:AqnMHu7I
こういうのだな
$ gcc -x c -std=c90 -Wpedantic - <<EOF
int main() {
int a = 0;
a += 1;
int c;
c = a;
return 0;
}
EOF
<stdin>: In function ‘main’:
<stdin>:4:9: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
$
0565デフォルトの名無しさん
垢版 |
2022/03/05(土) 16:54:20.54ID:CRIoLrg1
>>561
それですな。
0566デフォルトの名無しさん
垢版 |
2022/03/05(土) 16:55:50.22ID:CRIoLrg1
>>564
それはどうみてもイテレーター関係無いだろ。
0567デフォルトの名無しさん
垢版 |
2022/03/05(土) 16:58:47.76ID:AqnMHu7I
ちゃんと記事読んだら違ってたなC99ならこれだ
https://godbolt.org/z/T1Pdnj5Yb
$ gcc -x c -std=c90 -Wpedantic - <<EOF
int main() {
for (int i = 0; i < 10; ++i);
return 0;
}
EOF
<stdin>: In function ‘main’:
<stdin>:2:5: error: ‘for’ loop initial declarations are only allowed in C99 or C11 mode
<stdin>:2:5: note: use option ‘-std=c99’, ‘-std=gnu99’, ‘-std=c11’ or ‘-std=gnu11’ to compile your code
$
0568デフォルトの名無しさん
垢版 |
2022/03/05(土) 17:41:51.00ID:6VIYcmrk
池の水全部抜きますじゃなくて
linuxを全てrustで書きますが始まったら起こしてくれ
0570デフォルトの名無しさん
垢版 |
2022/03/05(土) 17:49:05.42ID:6VIYcmrk
多分そうなるな
大量のmod地獄が待ってるからなあ
rustの仕組みを変えるか自動的に全部解決するツールを作るしかない
0572デフォルトの名無しさん
垢版 |
2022/03/05(土) 20:31:07.36ID:VcENWEwx
>>568
Rustが次々と採用されていってる案件はいずれも新規と大改修
今動いていて問題もないものを書き直すことはない
新規か何らかの弱点が見えていてシステム改修すべき機会などでRust採用
0573デフォルトの名無しさん
垢版 |
2022/03/05(土) 20:38:19.88ID:AqnMHu7I
> Rustが次々と採用されていってる案件
存在しない案件が実績として次々と計上。。。詐欺かな?w
0575デフォルトの名無しさん
垢版 |
2022/03/05(土) 22:11:42.53ID:vk+PU+My
linuxのlistってgenericsっぽい作りになってて
任意の構造体に埋め込めるのよね
そのためにマクロでforeachとかあってそのせいっぽいな
仕様のせいじゃなくてそのマクロのせいだろw
0576デフォルトの名無しさん
垢版 |
2022/03/05(土) 22:58:00.53ID:AqnMHu7I
Cでのリストの良くある作り方みたいなモノ+これを使えばより安全的なマクロが多数用意されてるだけだろ・・・
その辺の実装を書く前提としてC仕様にC89を仮定してたってこと
↓にlist_for_each_entry他、リストの使い方が日本語でいろいろ載ってる
https://debimate.jp/2019/04/07/linux-kernel-list%E6%A7%8B%E9%80%A0%E3%82%92%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEapilist%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/
実際のコードはC89〜C11までいろいろあるんじゃね
0578デフォルトの名無しさん
垢版 |
2022/03/05(土) 23:07:24.44ID:b38ED9f7
C/C++やJavaなどからRustへ移行するパターンも多いけど
こういう形でプログラムコードをJavaScriptからRustへ移行する例も増えてきた

https://publickey1.jp/blog/22/amazon_prime_videowebassemblywasm_vm.html
Amazonはプロトタイプとして低レイヤのJavaScriptのコンポーネントのいくつかをRustのコードで書いてコンパイルし、WebAssemblyのバイナリにしたところ、JavaScriptのコードと比較して10倍から25倍も高速になったことを発見します。

これによりAmazon Prime VideoのアプリケーションにWebAssemblyを取り入れることを決定。

JavaScript VMの部分にWebAssembly VM(Wasm VM)をランタイムとして追加し、ユーザーのデバイス上へデプロイした上で、これまでJavaScriptで実現していたレンダラ、アニメーション、シーンとリソース管理の部分をRustコードから生成したWebAssemblyで置き換えました。
0579デフォルトの名無しさん
垢版 |
2022/03/05(土) 23:20:19.93ID:AqnMHu7I
それはたまたま実験結果として速くて置き換えた事例がたまたまあっただけだろ
他のwasmを使える言語との比較でもなければ、コードもなくどこまで安全かも分からんだろう上に
実際の置き換えでの効果については記載が何もないw

Rustやばやば言語ですなw
0580デフォルトの名無しさん
垢版 |
2022/03/05(土) 23:26:50.19ID:b38ED9f7
効果も全て>>578の記事に載っている
そしてアマゾンの今回の対象は、テレビやFire TVにスマートフォンなどの再生デバイス上でWebAssemblyを動かしその生成コードはRustで記述しているという話
0581デフォルトの名無しさん
垢版 |
2022/03/05(土) 23:36:13.20ID:AqnMHu7I
どこに対する何なのか改善ポイントが何なのかもさっぱりで、効果が何に対応してるのか分からんものを勝手に効果と思い込んでるだけでは?w
0585デフォルトの名無しさん
垢版 |
2022/03/05(土) 23:44:42.83ID:AqnMHu7I
>>582
最近カーネルコンパイルしてないからw 自分で使う実験モジュールをたまにビルドする程度w

>>584
書いてないから書いてないって言ってるのにw 知能不足はお前w
0586デフォルトの名無しさん
垢版 |
2022/03/05(土) 23:48:12.62ID:Koe9vBH8
>>585
カーネルコンパイルを自分ですることと
文法規約守るためにオプションつけること考えるのは
関係ないよね
0588デフォルトの名無しさん
垢版 |
2022/03/05(土) 23:51:08.33ID:VcENWEwx
>>579
WASM記述はRustを使えないという事情がない限りはRust一択になっている
GC言語はそのランタイムのデカさと発生により普通は採用されておらずC++やRustを書けない特殊な場合のみ
そして過去資産がアドバンテージのC++もここでは既存のソフトのWASMへの移植を除いて新規案件となるためRustがWASM記述トップ言語となっている
0589デフォルトの名無しさん
垢版 |
2022/03/05(土) 23:52:15.07ID:AqnMHu7I
>>586
オプションがついてるかどうかの事実を知らんと書いただけだがw 他に何と書けばいいんだよwwww
0590デフォルトの名無しさん
垢版 |
2022/03/05(土) 23:54:58.01ID:AqnMHu7I
>>587
因果関係なんて書いてないじゃんw

>>588
Rust一択になってると思い込んでるだけでは?w
CだってC#だってあるし、多分他にもあるのでは?w
0591デフォルトの名無しさん
垢版 |
2022/03/05(土) 23:57:13.15ID:Koe9vBH8
>>589
なんでオプションもつけずにやってると
おかしなことを思ったのか疑問になるだろ?
他のレスみても技術も知識も低いというのが答えぽいな
0595デフォルトの名無しさん
垢版 |
2022/03/06(日) 00:03:57.83ID:oRBcPyqI
>>589
オプション付けずにやってるかどうかなんて、実際に最新のビルドログを確認して見たわけでもないのにわかんねーだろw
その程度のことをこれだけかけて説明させてるお前の頭が悪いだけw

>>592
因果関係って言葉の意味知ってる?w

>>593
それは否定してないだろw 調査条件は知らんけどなw
文字列渡してDOMに貼っただけ程度ばかりかもしれんしw
0598デフォルトの名無しさん
垢版 |
2022/03/06(日) 00:18:58.77ID:oRBcPyqI
Rust推しは日付が変わるとID紐付けを嫌ってすーっといなくなるんだなw
どんだけやましいことばかりしてんだよw
0601デフォルトの名無しさん
垢版 |
2022/03/06(日) 00:46:30.36ID:oRBcPyqI
日本だけにするとまた違った見え方になるよw
いずれにしてもWeb検索の頻度ベースだから、実際のところ何を目的にした検索になってるのかは知らないけどねw
0602デフォルトの名無しさん
垢版 |
2022/03/06(日) 02:09:32.43ID:c8iVtviN
当然Goはプログラミング言語以外の検索結果を含んでる
0605デフォルトの名無しさん
垢版 |
2022/03/06(日) 02:27:34.11ID:oRBcPyqI
>>602
そこは他の言語と同程度の誤差だと思うぞ
結果セットではなくクエリ側だと思うしな
実際に辿ったリンク先の内容の共起性からそうだと判断されてるんだと思う
0606デフォルトの名無しさん
垢版 |
2022/03/06(日) 02:38:53.27ID:c8iVtviN
https://trends.google.co.jp/trends/explore?date=all&;q=%2Fm%2F09gbxjr
goが登場したのが2009年11月で
2009年10月前のスコアがすでに20あって現在は34
トレンド機能は短いワードだと正確な情報が取れないことは明白
0607デフォルトの名無しさん
垢版 |
2022/03/06(日) 02:49:17.27ID:c8iVtviN
https://trends.google.co.jp/trends/explore?date=all&;q=%2Fm%2F0dsbpg6
rustが登場したのが2010年7月で
その前のスコアは3で現在は91
rustは順調な成長が見て取れるからgoよりはまだ正確に補足されてる

goのワードでのグラフは意味不明な膨らみがあるんだが
golangで調べればちゃんと成長が見えて補足されてるから
goのワードでは全くトレンドを補足できてないことが分かる
https://trends.google.co.jp/trends/explore?date=all&;q=golang
0608デフォルトの名無しさん
垢版 |
2022/03/06(日) 03:02:53.77ID:T8opxkUl
>>605
言い訳はよ
0609デフォルトの名無しさん
垢版 |
2022/03/06(日) 03:08:00.64ID:oRBcPyqI
別に共起のルールが現在に合ってるだけじゃね?w
たまたま過去でもそういうのを拾ってるだけだろw
しかもそこまで古いと収集データそのものが現在のロジックに適合できていない可能性が高い
つまり何の問題もないってことw
0610デフォルトの名無しさん
垢版 |
2022/03/06(日) 03:09:22.77ID:T8opxkUl
苦しすぎ
ID:oRBcPyqIは出禁な
0613デフォルトの名無しさん
垢版 |
2022/03/06(日) 13:09:46.04ID:W+HcxztG
googleより自分の方が正しいと思う者だけが書き込んだ結果
をまとめるのがgoogleの仕事
0614デフォルトの名無しさん
垢版 |
2022/03/06(日) 13:21:24.33ID:oRBcPyqI
https://about.google/
「Google の使命は、世界中の情報を整理し、世界中の人がアクセスできて使えるようにすることです。」

だそうだし、Googleが正しいとかそういう話じゃないw
集めた元データが古すぎて現行と違うという注意書きあるの無視して「結果がおかしい!」とか言ってもしょうがないだけw
そんな古いデータ見なければいいだけw
0615デフォルトの名無しさん
垢版 |
2022/03/06(日) 15:08:47.15ID:W+HcxztG
それだけではない
未来のデータも見る前にフライングすればいい
コンパイル時に分かることを実行時に調べるのはアマチュア
0617デフォルトの名無しさん
垢版 |
2022/03/07(月) 19:27:08.91ID:soRNFAyV
>>607
ノイズ乗ってるって話なら、
rustも同名のゲームがあるから
あまり当てにならないかもね。
0618デフォルトの名無しさん
垢版 |
2022/03/08(火) 00:18:07.69ID:qJWSdqLU
またしても go はクソ、何がクソといってまず名前がクソ、っていう俺の常日頃の主張が証明されたな
なんでこんな名前にしたのか、決める前に止めるやつはいなかったのかと問いつめたい
0619デフォルトの名無しさん
垢版 |
2022/03/08(火) 00:59:02.63ID:2Ie6O3y5
ちゃんとプログラミング言語って括りのGoなので、リンク先のコンテンツが分類としてプログラミング関係なんだと思うぞ
0620デフォルトの名無しさん
垢版 |
2022/03/08(火) 02:11:00.88ID:wlomX7u1
Surface GoとかDuckDuckGoとかコンピュータ関連用語でGo含む固有名詞多いからプログラミングに絞ってもノイズは乗ってそうな気がする
他言語との比較はできないけどGo単独の傾向を見るならgolangの方が正確かと
0622デフォルトの名無しさん
垢版 |
2022/03/08(火) 02:45:30.15ID:2Ie6O3y5
>>620
プログラミング「言語」なので、共起性で分類するのが基本だからGo言語で固有の言葉の類似度が上がるのが普通
golangにすると、逆に「プログラミング言語」が外れ、恐らく共起性が寄与せず間違ったゴミが入り、正解が漏れる

>>621
C言語とかも「プログラミング言語」として出てくるので多分大丈夫

いずれにしても古いデータは分類用のデータがない可能性があり、上の仮定ができない
知らんけどw
0625デフォルトの名無しさん
垢版 |
2022/03/08(火) 04:07:37.08ID:2Ie6O3y5
はいはい、煽るだけの人は楽だねw 煽ってたら答えがもらえて良かったねw
0628デフォルトの名無しさん
垢版 |
2022/03/08(火) 13:35:17.20ID:dKc62E81
Rust使えばメモリ関連のセキュリティはよくなるんじゃなかったのかよ?w

https://forest.watch.impress.co.jp/docs/news/1393185.html

Mozillaは3月5日(米国時間)、デスクトップ向け「Firefox」の最新版v97.0.2を正式公開した。脆弱性に対処したセキュリティアップデートとなっている。


今回修正された脆弱性は、以下の2件。深刻度はいずれも4段階中最高の「Critical」と評価されている。

CVE-2022-26485:XSLTパラメーター処理における解放後メモリ利用(use-after-free)
CVE-2022-26486:WebGPU IPCフレームワークにおける解放後メモリ利用(use-after-free)。サンドボックスのバイパスにつながる可能性
0629デフォルトの名無しさん
垢版 |
2022/03/08(火) 13:44:09.84ID:XtAUmz0x
adblock plus 入れておくとメモリ使用量がどんどん殖えて恐ろしいことになってたがバグだったのかヤッパリ
一応報告しておいたけど
0632デフォルトの名無しさん
垢版 |
2022/03/08(火) 17:15:27.12ID:J8+hyRxi
やっぱりrustが安全なんだな
0636デフォルトの名無しさん
垢版 |
2022/03/08(火) 20:17:47.14ID:8VPspbmH
>>628
>>630
ワラタw
0641デフォルトの名無しさん
垢版 |
2022/03/08(火) 21:23:45.40ID:w0/18V2x
Safariも謎にスコア高いな
スコアの意味わからんけど、とりあえずchromeがダントツで点低いことだけはわかった
0645デフォルトの名無しさん
垢版 |
2022/03/08(火) 23:26:40.50ID:Ej6dPbx6
#はシャープじゃないけどな
シャープは五線譜に書くときに横線がかぶらないように横が斜めで♯
#はナンバーだからCsharpならc♯
0648デフォルトの名無しさん
垢版 |
2022/03/08(火) 23:38:08.91ID:UPCPpthy
シードン、いやマジで語感はそっちのほうがいいじゃん
今からでもいいからそれに変えてくれ
定食屋でコラボするという可能性もでてくるし
0650デフォルトの名無しさん
垢版 |
2022/03/08(火) 23:49:45.34ID:4dUzn034
まあgoなんて一般的な動詞を使うのが今のところダントツでセンスないのは間違いない
0652デフォルトの名無しさん
垢版 |
2022/03/09(水) 00:42:07.29ID:xulRjIaY
タイプミスっぽいやつは日本でいうと誤変換のようなものか
もしかして自虐的な発想の方がセンスがいいのでは
0659デフォルトの名無しさん
垢版 |
2022/03/12(土) 09:53:28.84ID:Xc2gaOhp
>>658
Visual studio Express Editionみたいに実用的に使えるけど無償のツールなんていくらでもあるだろ
0660デフォルトの名無しさん
垢版 |
2022/03/12(土) 11:15:14.69ID:B10FUCWb
>>654
エンバカデロC++Builderの新しいのも無料で出してなかったっけ?

どうせ1なんて商用で使えないだろうしcommunityでいいだろ感
0661デフォルトの名無しさん
垢版 |
2022/03/12(土) 11:27:47.09ID:piGLEbsf
お前らのPentium 133MHz メモリ16MB HDD2GBのマシンに入れたらいいじゃん
テレホタイムになったらネスケでダウソしろよ
0664デフォルトの名無しさん
垢版 |
2022/03/12(土) 12:42:30.36ID:aEfI8PjB
まじかよw
そんなのあってもその時間は俺のエロ画像取得perlスクリプトが忙しくしてるからテレホタイムにダウンロードは無理だなw
0665デフォルトの名無しさん
垢版 |
2022/03/12(土) 18:49:28.45ID:vmozTDYl
   ____∧∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 〜' ____(,,゚Д゚)< ボーランド逝ってよし!
   UU    U U   \________
0666デフォルトの名無しさん
垢版 |
2022/03/12(土) 19:05:16.27ID:JgaGU6xu
>>542
読んだけど、C11にすれば防げるという話では全然無いような
勿論Rustにしても防げないし
(以下は1通目のメールの頭にあるURL)
https://www.vusec.net/projects/kasper/


>>567
なおイテレータ変数だけなら、Cのスコープ解決演算子{}は実はどこでも書けるので
(for/while/if等と合わせて書くのが一般的だが、何もないところでもブロックを開始出来る)

int main() {
{
int i;
for (i = 0; i < 10; ++i);
}
return 0;
}

とforの周りに明示的にブロックを作れば解決出来るはず
(と思うがその時代のCコンパイラだと微妙なのと、もしかしたらこれが出来るのはC++かも?)
0667デフォルトの名無しさん
垢版 |
2022/03/12(土) 20:04:52.73ID:aEfI8PjB
そもそもlinusが問題としたのはそこではなく、その問題を「解決するパッチを適用しようとした際に、該当パッチが持つ別の問題」のことw
つまり一通目はただのきっかけで、二通目が問題の本体w

昔から文の代わりにブロックをどこでも作れたかどうかは知らないけどx86 gcc1.27では出来る模様
https://godbolt.org/z/WPz7a67fK
0668デフォルトの名無しさん
垢版 |
2022/03/13(日) 03:45:28.56ID:roEKlQ2p
rustはゲームタイトルの方が1000万人をゆうにこえてて
そっちがrustが検索で上がってきてる主要因。
プログラミング言語としてのrustはいうほど広がってない、
一時のHaskelやたらもてはやしてたのよりはマシな動きといった程度。
0670デフォルトの名無しさん
垢版 |
2022/03/13(日) 09:49:34.27ID:6ENvev+b
>>6
> JavaScript 1650万人
> Python 1130万人
> Kotlin 300万人
> Rust 110万人
Rust110万人ってあり得ないよな?
鯖とクライアント1:1と仮定すると、JavaScriptの1/15=6.7%のサーバーシェアがあって然るべきだけど、0.0003%もない。(計測不能)
https://w3techs.com/technologies/overview/programming_language

Rust信者にしても盛りすぎで度を超してる。
サーバーシェアが0.1%以下=JavaScriptの1/1000以下=1.65万人以下=日本限定なら1/10として高々1650人程度?
なおサーバーシェアから単純に比例換算すると、Goは0.0007%なので世界で115人、
Rustは計測限界のlisp(0.0003%)以下なので、世界で50人になってしまうのだけど。
(書けるという意味ではなく、毎日仕事としてゴリゴリ鯖を書いてる人数なら、この程度の気もするが)
0671デフォルトの名無しさん
垢版 |
2022/03/13(日) 11:45:07.69ID:m6x+SqCG
>>670
そのページのサーバシェアはWebページのソースから使われてるテクノロジーを推定するってやつだからバックエンドとして使われがちなGoやRustの使用率はあまり反映されてないと思うよ

Rustのライブラリ総数が8万弱だから、ライブラリのメンテナが1万くらいはいるかな
ライブラリ使うだけの人が10倍くらいいるなら10万というのは有り得なくもない
100万は確かにちょっと盛り過ぎかもね
0672デフォルトの名無しさん
垢版 |
2022/03/13(日) 11:50:34.41ID:m6x+SqCG
そのページでPHPが圧倒的なのは、要はみんなWordPressを使ってるってだけのことであって、PHPプログラマが全体の7割以上いるってことではない
0673デフォルトの名無しさん
垢版 |
2022/03/13(日) 13:19:56.90ID:6ENvev+b
>>671-672
> 要はみんなWordPressを使ってるってだけのこと
なるほどこれはある。

> バックエンドとして使われがちなGoやRustの使用率は
「バックエンド」の使い方が間違ってるが、
ユーザー側ではなく、内部RESTAPIだから見えない、というのはあるだろうね。

なお、以下動画の最後(2019Q3)では
https://youtu.be/Og847HVwRSI?t=280
> JS 23.18%
> C++ 6.62%
> C 5.35%
だから、C++は471万人、C/C++は853万人になる。
(JSは増えて2021Q3に1650万人だから、実際はこれより1割程少ないかも)
Rustが10万人ならC++の47-85人に1人程度、
これなら「物好き」(=イノベーター、2.5%程度)が使ってる範囲なので妥当な気もするが、
採用されたのがニュースになってる時点で1%以下じゃないとおかしい気もする。
が、まあ、C++比2桁落ち程度までは来てるって事か。
0675デフォルトの名無しさん
垢版 |
2022/03/13(日) 14:30:14.71ID:8lssQzCw
数倍差まで差し迫ってるんだな

>>674
アメリカ
6.16% C/C++
1.69% Rust

ドイツ
3.89% C/C++
1.66% Rust

イギリス
7.79% C/C++
1.83% Rust
0676デフォルトの名無しさん
垢版 |
2022/03/13(日) 14:54:40.15ID:8lssQzCw
この比較も興味深いな
アメリカで僅差
イギリスで逆転してる…

>>674
アメリカ
1.78% Go
1.69% Rust

イギリス
1.83% Rust
1.47% Go
0679デフォルトの名無しさん
垢版 |
2022/03/13(日) 16:34:08.84ID:e39Fa4ck
コロナでwasm利用が一時的に増えてチュートリアルなど読む人が増えただけだと思う
0680デフォルトの名無しさん
垢版 |
2022/03/13(日) 16:52:54.64ID:6ENvev+b
>>675-676
PYPLは「googleでチュートリアルが検索された数」=「新規に学ぶ人の割合」だよ。
これが逆転してないようでは絶対にコミュニティ規模では追いつけない。
(「RustのおかげでC/C++を学ぶ人が増えてしまった!!!」と言われてたのはこれか?
なお俺が知りたいのは新規参入者の動向ではなく今現在のコミュニティ規模。tiobeの方がまだ近い)

とはいえ、学ぶ人数が数倍になってる状態を10-20年続けられれば、
現役のコミュニティも数倍程度に近づいてくるのだろうけど。
(PYPLを40年積分すればコミュニティ規模になる気がしている)

tiobeは「今検索された数」だから、現役のコミュニティで検索を使った人達の割合になる。(それ以外も色々勘案してるみたいだが)
(ネット以前の言語はネットが無くても書けるように出来てるし、実際、情報もショボイので低めに出るはず)
Rustは2018年に18位がピークで、現在26位。
Goは2020年に10位がピークで、現在13位。
tiobeのC(11.80%, 2位)は高すぎるがJS(2.30%, 7位)は低すぎる気も。ただしPHP(1.50%、12位)とは規模が合うが。
0681デフォルトの名無しさん
垢版 |
2022/03/13(日) 16:53:39.94ID:VWw7WSCk
数を気にするの日本人らしい

でも何で日本語なんてマイナー言語使い続けるんだろ?
0682デフォルトの名無しさん
垢版 |
2022/03/13(日) 17:04:51.20ID:YWz/r5zq
>>681
キミは日本人以外の何をどれだけ知っていて
どれほどのサンプルから有意差を見出しているの?
0684デフォルトの名無しさん
垢版 |
2022/03/13(日) 17:57:01.73ID:e39Fa4ck
>>680
だから一時的なもんだろうと言ったんだが・・・Rust信者は日本語も読めないらしい
個人的には
tiobeは興味本位で覗く人の数、先鋭的だけど流行に敏感
PYPLは実際に学ぼうとしてる人の数、割と実態に近いけど、採用実績というよりは希望に近い
と思っている
0687デフォルトの名無しさん
垢版 |
2022/03/13(日) 19:02:32.50ID:bkBR9GT5
>>686
どちらの言語もグラフがあまりにも乱高下しすぎているため
その調査は信頼できないと思います
まともな調査であればそのように激しい乱高下は起きないはずです
0688デフォルトの名無しさん
垢版 |
2022/03/13(日) 19:06:14.35ID:fVzSesSr
検索数なので素人が多くポインタ周りで検索しがちなCや言語仕様がクソほどでかいC++は多くなりがち。HP作るために仕方なく調べてるケースがあるJSもそういう傾向あるかな
0689デフォルトの名無しさん
垢版 |
2022/03/13(日) 19:08:05.31ID:8lssQzCw
>>686
GoもRustも同じく2017〜2018年あたりで信じられない大急落をしている
tiobeの調査自体に問題があると思われる
tiobeのデータは信用できない
0690デフォルトの名無しさん
垢版 |
2022/03/13(日) 19:08:52.30ID:6ENvev+b
>>686
PYPLもグラフは出せるよ。
678のページで下に行ったら言語と地域を選べる。
WorldWideなら、
Goは飽和気味、
Rustは乱高下しつつも増加中でそろそろGoを抜く、
C/C++は漸減傾向だったが復活気味。
0693デフォルトの名無しさん
垢版 |
2022/03/13(日) 22:01:27.76ID:e39Fa4ck
どちらかというと、このグラフは後発ほど有利なはずなんだけどね
JavaやC#は鳴り物入りで出現してあっという間に広まった
goの良さは玄人にしか伝わりにくい面があると思うので時間かかるのは仕方ないけど
Rustは現状だとごくごく一部の信者が必死になって喧伝してるだけのマニア向け言語だからどう見るかは微妙
0694デフォルトの名無しさん
垢版 |
2022/03/13(日) 22:04:53.43ID:6ENvev+b
>>692
TypeScript/Kotlin/Dartを重ねると現実が見えるかも
自動的に単調増加する程甘い世界ではない(ゼロサムだから当たり前だが)
0696デフォルトの名無しさん
垢版 |
2022/03/13(日) 22:21:31.43ID:E9xpRPLy
>>695
GCなし・高機能・低レベル記述可・データ競合やメモリ安全性の保証あり
というプログラミング言語がRustしかないから
IT大手企業が揃って推している特別な存在ですね
0697デフォルトの名無しさん
垢版 |
2022/03/13(日) 22:29:12.10ID:e39Fa4ck
>>695
MS,Google,Mozilla,Amazonなどは出資してるだけで喧伝などしていない
彼らの土俵に非常に狭い有用な領域があるってだけw
それを見て勘違いしたごくごく一部のマニアが信者化して喧伝してる
0698デフォルトの名無しさん
垢版 |
2022/03/13(日) 22:32:40.90ID:e39Fa4ck
データ競合が起きにくいからってだけだよ
それを実現するために払った代償が大きすぎて、彼らも他の領域に積極採用しようとはしていない
その代償を払ってもお釣りが来るほど、性能+品質が重視されるニッチな領域を彼らが持ってるだけw
0699デフォルトの名無しさん
垢版 |
2022/03/13(日) 22:36:32.94ID:6ENvev+b
>>693
> JavaやC#は鳴り物入りで出現してあっという間に広まった
JavaはそうだったがC#は軟派扱いだったろ。
理由は簡単で、当初はDLLを作れず、unionも使えない、プロの実用に耐えるものではなかったから。
その辺整備して2000年代中頃からMSの主力言語となり、逆にVC++は何となく見捨てられて現在に至るが。
tiobeには下の方にそれも載ってる。
> Very Long Term History
> Java 14@1997 -> 1@2002
> C# 14@2002 -> 8@2007 -> 4@2012
> https://www.tiobe.com/tiobe-index/

> goの良さは玄人にしか伝わりにくい面がある
とはどこ?
開発周りならC#の方が断然上。何も考えずにVSに任せて終わり。
DLL今更いらんやろ、は一理あるが、継承を無くしたのは多分悪手。
あれはJavaで関数ポインタがなかったために馬鹿共がデザインパターンとかいうおかしな事をやらかしまくったのが問題で、
正しく使えるなら継承は有った方が確実にいい。
(ただし、フレームワーク作成ならさておき、ユーザーレベルではあまり必要ないのも事実だが)


>>695
そいつらが入ってその程度、という事実を認識した方がいい。
Rustを選ぶ理由がないんだよ。
最速を目指すならC/C++以外にない。
GCで良ければJava/C#/Goとかでいい。
安全性とか言ってるのは開発側の都合であって、ユーザーにとってはどうでもいい事だろ。
それでC/C++では出来ないような開発速度が出せるのならまだしも、それもないし。
(売りの「安全性」と「メモリリーク無し」はほぼ全部のGC言語が持ってる機能で、
そこから無理矢理GCはがして何とかなるか、という実験としては良いが、実際その程度の意味しかない)
0701デフォルトの名無しさん
垢版 |
2022/03/13(日) 23:00:37.10ID:6ENvev+b
>>700
お前らの「データ競合」が何を意味してるのか分からんが、
試しにJavaScriptでその「データ競合」する簡単なコードを書いてみてくれ。
0703デフォルトの名無しさん
垢版 |
2022/03/13(日) 23:08:56.83ID:6ENvev+b
>>702
分かってて言ってる。
だから「初の」ではないね、みたいな。

まあちょっと意地悪が過ぎたね。やめよう。
0705デフォルトの名無しさん
垢版 |
2022/03/13(日) 23:43:57.20ID:e39Fa4ck
>>699
> JavaはそうだったがC#は軟派扱いだったろ。
> 理由は簡単で、当初はDLLを作れず、unionも使えない、プロの実用に耐えるものではなかったから。
> その辺整備して2000年代中頃からMSの主力言語となり、逆にVC++は何となく見捨てられて現在に至るが。
.NETは1からBeginInvokeがあったりして非同期処理の走りだったし、P/Invokeがあったりしてnativeも簡単に扱えたし、俺もオライリー読んで、Javaの二番煎じかと思ったら、Javaよりいいじゃんって思ってすぐ飛びついたよw
確かに.NETは少なくとも2までは俺の周りではJavaほど盛り上がってなかったけど今のRustよりは期待されてたなw
1でdllが作れなかったかどうかは忘れたけど、COMのI/Fも持ってて当時便利だとは思った

> > goの良さは玄人にしか伝わりにくい面がある
> とはどこ?
goの良さは必要十分なことが実用的な範囲でコンパクトにまとまってること

> あれはJavaで関数ポインタがなかったために馬鹿共がデザインパターンとかいうおかしな事をやらかしまくったのが問題で、
デザインパターンはOOPの分かりやすい成果だと思う(関数ポインタは実装なので関係ない)
最近の言語は構造とロジックは分離してるのが主流だけど、考え方は今でも有効だと思う
構造とロジックが緊密になりすぎて少し窮屈になるきらいはあるし、そうなるくらいなら分離もありだとは思う
0707デフォルトの名無しさん
垢版 |
2022/03/14(月) 00:27:52.17ID:+YaSNWzL
>>706
それは「自分の足を撃てるか」だな
http://www.toodarkpark.org/computers/humor/shoot-self-in-foot.html

>>705
その頃から知ってるのなら教えて欲しいのだが、
俺はC#のその辺は「GUIコンポーネントを触れるのがメインスレッドだけ」という、
GUI部分をシングルスレッド『強制』にしてしまったのがそもそもの問題で、
全GUIコンポーネントをスレッドセーフにしてしまえばその辺の面倒な話は一切無しで単純に済んだと思ってる。
これは今でもそう思う。
(最終的にasyncに持って来たのはすごいが)

これについて、C#が何故そうしたのかがよく分からない。色々尋ねて回った限り、
どうやらその前にJavaのGUIでマルチスレッドのがあって、それで酷い事になったから、
その失敗を見たC#は「絶対にGUIはシングルスレッド」と決めたらしい、というところまでは分かったのだが、その先が辿れない。
この辺について何か知ってたらよろしく。

> デザインパターンはOOPの分かりやすい成果だと思う
その割には今全く聞かないだろ。トレンドもダダ下がりどころではないはず。
頻出パターンを学ぶ、というのは正しいが、考えるのを止めて暗記に走るのが多分不味い。

> 構造とロジックは分離してるのが主流だけど
というよりはCでは分離出来なかった(分離しにくかった)からその頃はそんなもんだと思ってただけで、
分離出来るのなら分離した方がいいし、今はそうなってるだけだろ。
576のリンク先、
> Linux KernelのList構造は、データと分離されており、粗結合の状態です。
何ぞそれ?と思ったけど、
なるほどCでもこうやれば分離出来るのか、マクロって本来はこう使うべきだったのか、
最初のC++なんてただのマクロ集だったってのはこういう事か、
とは思ったね。俺がCやった頃は既に「マクロは使うな」みたいになってて、
小文字マクロオンパレードのLinuxKernelにはちょっと驚くのだけど。
0708デフォルトの名無しさん
垢版 |
2022/03/14(月) 01:03:13.14ID:U570WKgz
>>707
> それは「自分の足を撃てるか」だな
伝わらなそう。
危害を加えられるということではなく、特別に何か出来るわけでもなく、普通に思ったことが思ったとおりに出来て、想定外のことが起こらない的な意味。

> 俺はC#のその辺は「GUIコンポーネントを触れるのがメインスレッドだけ」という、
普通に呼ばれた先がスレッドセーフじゃないからだと思うけど…
同期を取ることそのものがコストになるし、そのコストを嫌ったのが元々の非同期の発想だと思ってたから、俺は違和感なかった
実際のところはMSの中の人じゃないから知らない

> > デザインパターンはOOPの分かりやすい成果だと思う
> その割には今全く聞かないだろ。
そうでもない、GoFの初期のパターンはもう各パターンが独り歩きして日常的に使われてるからそうおもうだけだと思う

> > 構造とロジックは分離してるのが主流だけど
> というよりはCでは分離出来なかった(分離しにくかった)からその頃はそんなもんだと思ってただけで、
classがないって意味だよ

> なるほどCでもこうやれば分離出来るのか、マクロって本来はこう使うべきだったのか、
Cにはテンプレートないからな…
0709デフォルトの名無しさん
垢版 |
2022/03/14(月) 02:05:45.27ID:+YaSNWzL
>>708
> 同期を取ることそのものがコストになるし、そのコストを嫌った
そりゃそうだが、現実的にロックが必要なのはGUIコンポーネントに「書く」時だけで、
つまりGUIを実際にユーザーが操作している瞬間であって、速い必要が全くない。
そしてロック周りはメソッド内に隠蔽してユーザーからは見えない状態に出来る。
だからそうすれば良いだけなのに、
結果を画面に表示したいだけの為にInvokeとかドタバタしないといけないのは間抜けすぎ。
とはいえ当時は我慢してたが、JS知ってC#のGUIは完全にゴミだったと理解した。
そりゃJSが快進撃するはずだよ。

デザインパターンについては俺はゴミだと思ってるよ。
あれは言語機能の不足分を示してる、という奴がいるだろ。それに近い。
例えばイテレーターパターン、コンテナ/イテレータ/処理をコンテナ/(イテレータ+処理)と切るわけだが、
関数型(forEach)は(コンテナ+イテレータ)/(処理)、で切るだろ。
イテレータはコンテナと密結合なのだから、どう考えても関数型の方が妥当。
イテレータの管理なんてしたくもないし。
当然関数型も流行るし、Javaも関数ポインタを入れないわけには行かなかった。
だから、言語機能が整備されたから聞かなくなったけど日常的に使われてる、というのならまあそうだが、
おかしなパターン作りに邁進するのではなく、不足してる言語機能をさっさと充足させれば済んだ話。
方向性を完全に間違ってる。

> Cにはテンプレートないからな…
テンプレートこそマクロで書ける、というより、
テンプレート的なマクロを追い出す為のテンプレート導入なんだけどな。
0710デフォルトの名無しさん
垢版 |
2022/03/14(月) 02:23:54.25ID:U570WKgz
>>709
> とはいえ当時は我慢してたが、JS知ってC#のGUIは完全にゴミだったと理解した。
スレッドセーフにすると同期処理が入って遅くなるだけ、必要な同期を外で取るか中で取るかの設計選択でしかないので、スレッドを作らないときに遅くなる設計選択をしなかったというだけでしょ
逆に言えばもしスレッドを別にするならちゃんと同期してね、という意思表示でもあるだけ
別に俺は何とも思わなかった
当時のJSはクライアント側なので何の関係もないし、そもそもスレッドがない

> デザインパターンについては俺はゴミだと思ってるよ。
言語機能の不足とは違う。OOは言語を限定しないから。

> イテレータはコンテナと密結合
イテレータは抽象化されてるので密結合はしていない

> テンプレート的なマクロを追い出す為のテンプレート導入
俺が導入したわけでもないけど、型がないこと、ただの置換では限界があることの回避だと思ってた
0711デフォルトの名無しさん
垢版 |
2022/03/14(月) 06:28:43.00ID:1OkAcUK7
デザインパターンが大々的に使われる言語ってのは抽象化能力が低いって事だと思うんだよな。まぁあんまり細かいとこまで抽象化しても使いにくいから細かいパターンは何にでもあると思うけど。

GCがあれば安全ってのもちょっと視野が狭いんじゃなかろか。メモリが確保できない時(エラーを生成する余裕すらない時もある)とか、ここでGCに動かれては困る、とか。
0712デフォルトの名無しさん
垢版 |
2022/03/14(月) 06:48:39.07ID:U570WKgz
大々的に使われるという認識がもうおかしい
デザインパターンというのは昔からよくある、前提が揃ったとき、こうやっとくと割と上手く行く定石みたいなもの
そもそも要件次第で適用され、実装言語で表現するだけの代物だよ

GCがあれば安全とは、二重開放やリークなどの問題からの開放を意味するだけ
一般的にはリスクなので安全の一要素ではある
GCの実装は通常最低限の動作をするのに必要なメモリを最初に確保する
ここで動かれては困るは制御できるのとできないのがあるし、そんなのは実装次第
調べれば分かる仕様であり、安全とは無関係
0713デフォルトの名無しさん
垢版 |
2022/03/14(月) 07:21:56.04ID:0o62jolj
概ね同意。
大々的にってのは言葉が悪かったな。パターン以外で表現できず、必然的に乱用された、一時期のJavaみたいなのはおかしいだろってだけなんだ。
0714デフォルトの名無しさん
垢版 |
2022/03/14(月) 10:05:06.21ID:/sMe7Uy5
必要もねえのに勉強しちゃって
必要もねえのに乱用しちゃうのが問題
必要なひとは必要な分だけ黙って使ってんのよデザパタなんて

イテレータパターンなんて
使うだけの人には不要なのよ
イテレータを提供する側の人
ライブラリを提供する側の人が
実装前にそっと紐解くのがイテレータパターンなんよ
で、使う側の人が「イテレータパターンは不要」とか抜かしてる裏で
すでにライブラリ作者によってパターンが適用されてんのよ
0717デフォルトの名無しさん
垢版 |
2022/03/14(月) 19:01:21.66ID:ffXSoD1s
そういえばRustマンセーの人たちはデザインパターンやDI知らん人が多いよな
業務の人じゃないんじゃないかな
0718デフォルトの名無しさん
垢版 |
2022/03/14(月) 19:33:27.88ID:vcnazuXY
rustにもデザインパターンと呼べるようなものはあると思うんだけどね
そう呼ばないだけて
0720デフォルトの名無しさん
垢版 |
2022/03/14(月) 19:38:30.40ID:ffXSoD1s
DI使わないでどうやって大規模開発してるのか謎なんだがな
架空の大規模開発してるのだろうか?
0721デフォルトの名無しさん
垢版 |
2022/03/14(月) 20:31:10.63ID:lMI36uuv
DI使わず大規模開発は普通に可能でしょ
そんな頭で大規模開発してることが謎だわ
0723デフォルトの名無しさん
垢版 |
2022/03/14(月) 20:52:37.91ID:+YaSNWzL
>>710
> スレッドを作らないときに遅くなる設計選択をしなかったというだけ
その通りだが、GUIでは事実上「スレッドを作らない」という選択肢がない。
メインスレッドで(確か)10秒以上のジョブを実行すると「GUIが固まるだろボケ!別スレッド起動しろ」と怒られ、
仕方なく別スレッドを起動すると、結果を表示する際に「GUIコンポーネントは別スレッドからは触れねえよボケ!Invokeしろ」と怒られる。
よって、「計算結果をprintfするだけ」のCUIアプリをGUIにするだけの為に、「別スレッド起動してInvokeする」コードが必要となる。
全く馬鹿げてるよ。
どうせ計算結果を待つしかないのだから、待つ間にGUIが固まってもどうって事無い。
それが嫌なら「別スレッド+Invoke」で、面倒で手抜きしたいのなら「GUI固まりますがどうぞ」でよかったのだが、
MSは後者の選択肢を残さなかった。
JSだとこの辺の糞っぷりが全くなく、別方法で綺麗に解決されてた、というわけ。

まあ見解の相違はおそらくそちらはCUIアプリが主だったか、真面目に実装するタイプなのだろう。
0724デフォルトの名無しさん
垢版 |
2022/03/14(月) 20:53:26.06ID:+YaSNWzL
> イテレータは抽象化されてるので密結合はしていない
イテレーターパターン推し連中の公式見解だな。
ただ、目的とどこまでやるべきかを考えれば、問題点は簡単に分かる。
俺は、

目的: 同一コードを走行させる為、コンテナ非依存にする為
どこまで: 全部

と考えてる。抽象化が「本質(共通)部分のみを抜き出す」事なら、共通部分が残っているようなら抽象化が不十分だ。
iteratorを使う際には必ず「ループの中に入れて.next()を呼び出す操作」が必要で、つまりこの部分
for (=iter.begin(); !=iter.end(); =iter.next()) {}
が共通で残っており、毎回自前で同じようなコードを書け、となってる。--- (A)
ならこの部分もついでにイテレータに入れた方がよくね?と考えれば、
itereator.each(関数ポインタ)形式になり、まんまforEachになる。 --- (B)
だからイテレータとforEachは発想としては連続的につながっており、思いつけないものではない。
敢えてイテレータ(A)で止めてるのは、当時覇権言語だったJavaが関数ポインタを使えず、(B)を記述する能力がなかったからだ。
つまり、

OOP:イテレーターパターン: for (=iter.begin(); !=iter.end(); =iter.next()){ 中身の処理 } --- (A)
関数型:ダックタイピング: container.forEach(関数ポインタ) --- (B)

であって、どちらも目的を達成出来るが、for の呪文を毎回書かなくて済む分関数型の方がいい。
だからあの関数型アゲは腐りきったデザインパターンへのアンチテーゼの意味もあると思ってて、
実際デザインパターンアゲが消滅次第、関数型アゲも消滅したろ。
0725デフォルトの名無しさん
垢版 |
2022/03/14(月) 20:54:38.73ID:+YaSNWzL
で、ついでに言うと、イテレータ自体はコンテナと必ず密結合してる。
コンテナの内部構造を変更されたらイテレータ自体も変更しないといけないだろ。(イテレータを使う側のコードは変更不要)
そして、
イテレーターパターン:オレオレコンテナにはイテレータを用意しろ --- (A2)
ダックタイピング:オレオレコンテナにはforEachメソッドを用意しろ --- (B2)
だが、イテレータの用意は共通インタフェースにする程度の設計は必要なのに対し、
forEachメソッドの用意はただ回せば済むから、A2よりもB2の方が簡単なんだよ。
ここで「簡単」で済む理由は、B2の方が「自然」だからであり、A2で切るのは「不自然」だからだ。
コンテナとイテレータは一体であり、内部処理はそれとは全く関連無いから元々疎結合。
それを(コンテナ)/(イテレータ+内部処理)と無理に切るからおかしくなる。
(コンテナ+イテレータ)/(内部処理)なら元々疎結合のところで疎結合にしてるから余計な手間がかからないという、ごく当たり前の話。

Javaが最初から関数ポインタを扱えれば、イテレーターパターンなんて存在せず、敢えて言うなら
・forEachパターン:コンテナは必ずforEachインタフェースを継承/実装しなければならない
とかになってたと思うぜ。(もはやパターンではなくただのコーディングルールだが)


>>711
> メモリが確保できない時(エラーを生成する余裕すらない時もある)とか
Javaの場合はもしもの時用に1MBのメモリを確保していた。
ただ、メモリで落ちた場合は「あと数KBあったら落ちずに済んだのに…」が大半だろうし、
非常用に1MBはでかすぎるだろ、という事で、最近は500KBに減らされたと聞いた。


>>714
> 必要もねえのに勉強しちゃって
それは「デザインパターンの意義は、命名した事くらいだ」の人達の意見だし、実際これも当たっているが、
もともと「頻出パターンを学んで初心者から中級者へジャンプアップする」為の物であり、学習用だ。

そして「この場合はこう実装しろ」を規定するのはコーディングルールや設計方針であって、
「頻出パターン図鑑」であるデザインパターンではない。
0729デフォルトの名無しさん
垢版 |
2022/03/14(月) 21:09:52.99ID:+YaSNWzL
>>726
そうなんだけど、じゃあ何型だ?と言われて、手続き型に入れるわけにもいかんだろ。

Cでは上級テクニックだった関数ポインタを、
スクリプト言語(Python/Ruby/JS)では初心者でも常用してる。この違いは大きい。
そして関数ポインタをカジュアルに使えばコードは単純になることを証明してしまった。

逆に、Java周りの歪みは「関数ポインタを使えない事」による物が大きい。
(だから今後は徐々に改善していくのだろうけど)
0730デフォルトの名無しさん
垢版 |
2022/03/14(月) 21:11:48.03ID:U570WKgz
>>723
別に全く苦ではなかったね

>>724
書き方だけだし、C++やJavaやC#などクラスある言語でも普通に簡単な書き方がある。Cでマクロがあるくらいなんだから当たり前だけどな。

>>725
シグニチャにiteratorしか入っていない以上密結合していようがない
0733デフォルトの名無しさん
垢版 |
2022/03/14(月) 21:21:31.14ID:U570WKgz
>>729
Reflectionでもinterfaceでも似たようなことできるし、それが必要と思ったことがない
C#のdelegateみたいな機能は新鮮だったけど
0734デフォルトの名無しさん
垢版 |
2022/03/14(月) 21:27:54.46ID:O5nPkwUH
GoFのデザパタ本ではイテレータパターンでは
> ◎実装
> Iteratorパターンには、実装に関して多くの方法とその変形がある。(略)
> 1.どのオブジェクトがiterationをするか
> (以下、内部外部イテレータの紹介部分略)
> 外部iteratorは内部iteratorに比べてより柔軟である。
> 2つの集合が等しいことを外部iteratorを使って比べるのは容易だが、
> 内部iteratorでは実用的には不可能である。(以下略)」
つまり、内部イテレータも外部イテレータもパターンとして既出
どっちの実装もともに検討されている
0735デフォルトの名無しさん
垢版 |
2022/03/14(月) 21:40:17.81ID:vcnazuXY
スレタイの言語の中でjavaで培われたデザインパターンが効果的な言語ってあんの?
0736デフォルトの名無しさん
垢版 |
2022/03/14(月) 21:41:33.54ID:ptWJKaRn
継承自体が古いからな……
0737デフォルトの名無しさん
垢版 |
2022/03/14(月) 21:43:55.10ID:U570WKgz
知らず識らずのうちに使ってしまってるのがデザインパターンだよ
名前がなかったからあえて付けて一言で通じるようにしたことがGoFの功績
0738デフォルトの名無しさん
垢版 |
2022/03/14(月) 21:46:41.46ID:O5nPkwUH
初心者のうちはデザパタに興味持たなくていいよ
必要性を感じてからはじめて手を出せばいい
興味本位だけで手を出しても何も得られない
勉強にもならない
半可通によるデザパタ乱用か
デザパタ不要論者になって暴れだすか
繰り返すが
デザパタには必要にかられてから手を出せば十分
0739デフォルトの名無しさん
垢版 |
2022/03/14(月) 21:48:26.00ID:+YaSNWzL
>>733
> それが必要と思ったことがない
それはJavaの話?なら最悪だと思うのはGUIで、

element.onclick = function(){};

が書けないものだから、
1. elementを継承したオレオレエレメントクラスを作って
2. それにonclickインタフェースを継承して、そこに処理を書く
とかやるんだろ。一応デコレーターパターンになるのか?

どう考えても頭おかしいし、最悪だろこのソリューションは。
当然JavaのGUIなんて早々に滅亡した。


ただまあ、Java作った奴が馬鹿だったわけではない。
(むしろ一番成功した言語なので、一番賢かったとも言うべき存在)
当時は関数ポインタの重要性が今程認識されていなかっただけの話。
ならさっさと入れれば良かったのに、
そこをデコレーターパターンで誤魔化してきた奴は死刑でいいよマジで。

というのもあって、俺はデザインパターンはゴミだと見ている。
そもそもそれが本当に頻出なら、簡単に書ける構文を用意しておくべきだ。
だから整備された言語なら何も意識せず自然に書いてても
結果的にデザインパターンのどれかに分類される事と同じ事をやってるはずで、
今現在はそうだと思ってる。
0740デフォルトの名無しさん
垢版 |
2022/03/14(月) 21:55:55.62ID:mIWYJMZE
>デザパタには必要にかられてから手を出せば十分

後から必要にかられることなんてあるのかね
0741デフォルトの名無しさん
垢版 |
2022/03/14(月) 21:57:36.60ID:U570WKgz
>>739
awtの頃はそんな感じでいろいろ大変だったと思うけど、JWTとか出てきてからは内部クラスでやるようになって、そこから先はJava2Dとかいろいろ出て来たけど追ってない。
今はJavaFXみたいだけど、まるで浸透してる気配はないね。
そもそもで言えばJavaでGUIはあんまりやらんけど、理由はクライアントツールならWindowsだから.NETでいいという感覚からだと思う。
個人的にはnativeと繋ぎやすいなど、.NETの方がメリットを享受できたからだと思うよ。
何度も言うけど、JavaScriptと比較するのは根本的に間違っている。
0743デフォルトの名無しさん
垢版 |
2022/03/14(月) 22:37:01.86ID:+YaSNWzL
>>741
> 何度も言うけど、JavaScriptと比較するのは根本的に間違っている。
何故?JSはGUI用の言語だが、俺がC#の糞さについて言ってるのはGUIの部分であり、
JavaもGUIの時に糞さが際だつから取り上げてる。

元々の原因は(既に言ったが)その時代には関数ポインタの重要性が認識されておらず、
また、GUIもまだこなれておらず、結果的に
C#:GUI部分がJSよりだいぶ糞だった(GUIの方針が間違ってた)
Java:関数ポインタがないのでGUIが壊滅的に糞、とても組めたものではない
というところで、逆に言えばGUI以外ならJavaは問題ないので今の地位がある。
C#も同様だが、こちらはだいぶ変化して、今のC#のGUI側面はほぼJSと同じプログラミングモデルになってる。

ちなみに739で言ったJavaのGUIは、WebAPIだ。(=ブラウザ用。FXやSwingとかは俺は知らん)
一応2015頃まではJavaでもクライアントサイドのコードが書けるようになってたし、APIも生きてた。
(APIだけなら今でも使えるはずだが)
でも糞過ぎて誰も書かなかったので、セキュリティが云々という適当な言い訳で廃止されて現在に至る。


というわけだが、デザインパターンが言語の不備を隠蔽するバッドノウハウ的に使われてるようにしか見えなかったから、
俺はデザインパターンを全く信用していない。
とはいえ、今時の言語とフレームワークを使ってれば、それを○○パターンと呼ぶ事を知らないだけで、
普通に使っているはずであり、これが正常な状態だと思う。
0744デフォルトの名無しさん
垢版 |
2022/03/14(月) 22:52:50.90ID:0o62jolj
継承は結構GUIと相性良いので、その主張はズレてるとしか感じないな。
関数が第一級オブジェクトであるメリットはそんなGUIがどうのこうのなんて狭い範囲で語れる話じゃないし。
0745デフォルトの名無しさん
垢版 |
2022/03/14(月) 22:58:10.20ID:U570WKgz
>>743
Webの画面をGUIとは言わない…
Webであれば、基本はHTML+JavaScript(+CSS)であり、これに最近wasmが付く程度
サーバー側の言語はいくつかあるが、最終的にクライアントに送れるのは上記であり、表現は違わない
最近は仮想DOMを使用するタイプのクライアント側でテンプレートを流し込むコンポーネントを記述するのが普通で、デファクトはJavaScriptを使用するreact
Javaで典型的なSpringは業務に使用されることが多いため、そもそもSPAである必要がなく、昔ながらのサーバー側でテンプレートを流し込むページ記述が普通だと思う
双方を比べるのはいささか不自然で、なんで比較したいのかすら分からない
C#だとBlazorがあって、これだとwasmを使うことでクライアント側も.NETで記述できる
あんまり人気ないけどね
何に対してどんな文句を言いたいのかサッパリなので、よく整理してから話すように
0746デフォルトの名無しさん
垢版 |
2022/03/14(月) 23:03:29.39ID:+YaSNWzL
>>744
エスパーするが、
> 継承は結構GUIと相性良い
これはGUIコンポーネントを『作る』側、つまりフレームワーク作成側の話だろ。
俺が言ってるのは『使う』側、つまり実際にJS同様GUIのコードを書く時についてだ。

> 関数が第一級オブジェクトであるメリット
ちなみにこれは俺は未だに理解出来ないので具体的に教えて欲しい。
実際、関数にメソッドを生やせるだけで、何かが出来るようになるわけでもないので、
全部入りのC++もまだ第一級オブジェクトとしての関数を入れてないし、多分検討もしてない。
0747デフォルトの名無しさん
垢版 |
2022/03/14(月) 23:14:29.77ID:+YaSNWzL
>>745
> 何に対してどんな文句を言いたいのかサッパリなので、よく整理してから話すように
いや文句を言うのは既に終わってて、俺のスタンスを繰り返し言ってるだけ。
だからまあ、もう終わりでいいのも確か。

> Webの画面をGUIとは言わない…
それはない。ユーザーがGUIと思えればそれはGUIだよ。
VSCodeをCUIとは言わないだろ。
WebアプリにしてもGUIだし、ガワアプリは中身がWebコンポーネントだからJSだよ。

> 昔ながらのサーバー側でテンプレートを流し込むページ記述が普通だと思う
それは表示するだけのページだね。それはWeb『ページ』と呼ばれる。
GUIだと言われるような物はWeb『アプリ』と呼ばれる。


まあしかし、合意を形成する必要もないし、
言いたい事は既に言ってるし、まあ終わりでいい。
色々ありがとう。
少なくとも当時のC#使いが全く問題を感じてなかったという事だから、
・C#はもともとGUI向けの設計ではなかった
・.NETはそもそもユーザーの想定レベルが高くて無駄に苦労する
のかもな、とは思えてきた。
0748デフォルトの名無しさん
垢版 |
2022/03/14(月) 23:34:58.46ID:tKTotEWb
>>740
自分が当たり前にやってることを他人に説明する必要が出てきた時にパターンの名前が必要になる
0749デフォルトの名無しさん
垢版 |
2022/03/14(月) 23:43:23.14ID:7sD4WO1E
>>702
データ競合はシングルスレッドでも当然起き得る

>>704
並列処理だけでなく並行処理でもデータ競合は起き得る

>>703
どんなケースでもデータ競合が起きないことを保証する初のプログラミング言語はRustで合っているのではないか
0750デフォルトの名無しさん
垢版 |
2022/03/14(月) 23:45:07.77ID:U570WKgz
>>747
> > 何に対してどんな文句を言いたいのかサッパリなので、よく整理してから話すように
> いや文句を言うのは既に終わってて、俺のスタンスを繰り返し言ってるだけ。
> だからまあ、もう終わりでいいのも確か。
じゃあ終わりで
最後にWebの画面レンダリングをGUIに持ってくるケースはある
JavaScriptのelectronやRustのtauri、古くはIEコンポーネントみたいなので非常に特殊なパターン
vscode他を除けば、ゲームとかワンチャンモバイルも狙うGUIでたまに使用されるとか、アプリでWebの画面を出したいとき稀に使用される
嵩張るために滅多に使用されないか、こっそり使用されることが多い
0752デフォルトの名無しさん
垢版 |
2022/03/14(月) 23:47:54.88ID:U570WKgz
>>749
正確には「保証する」みたいな強い言葉だとそれだけで独り歩きするのでいかんw
「仮定することができる」くらいだな
0753デフォルトの名無しさん
垢版 |
2022/03/14(月) 23:57:31.30ID:7sD4WO1E
>>709
イテレータはコンテナと密結合、は間違い
そのようになってしまっている悲しい言語も存在するだけにすぎない
例えばRustなどではイテレータ連鎖に一度もコンテナが登場すらしないこともあるように
イテレータとコンテナは独立の存在

コンテナの中身を順に出すイテレータを作れるとか
イテレータが吐き出したものをコンテナに格納できるといった
端点で関連するケースがありうるだけにすぎない
0754デフォルトの名無しさん
垢版 |
2022/03/15(火) 00:10:15.67ID:N7uKXWL+
>>718
どんなプログラミング言語にだってあるよ。
デザインパターンってのは似たような問題領域における対処法や設計ノウハウに共通の言葉を定義したコミュニケーションツールだからな。
0755デフォルトの名無しさん
垢版 |
2022/03/15(火) 00:13:54.20ID:YRrS4TOh
デザインパターンの時代には抽象化されたループや分岐が作られた
それを具体化するたびにクラスを作りクラスに名前をつける
まるでgotoの行き先にいちいち名前をつけるみたいに

そのあとラムダが普及して名前をつける必要がなくなった
whileやifやelseのブロックに名前がないのと同じ
0756デフォルトの名無しさん
垢版 |
2022/03/15(火) 00:35:40.32ID:lBfKiKMI
>>753
> イテレータはコンテナと密結合、は間違い
間違ってねえよ。
というか、多分「密結合=悪」と洗脳されてるから否定したいのだろうけど、
俺が言ってるのは、

・コンテナとイテレータの関連は、
 イテレータと中身の処理の関連より100万倍くらい強い

という事。だから

・コンテナとイテレータの結合は、イテレータと中身の処理 より 100万倍密結合

であり、これを密結合と言わずに何という?という話。
そりゃイテレータで無理矢理切り離せばコード上は切り離せるけど、それやっても大してメリット無いし、
ほぼ100%の状況で「頭から全部イテレート」で済むんだからforEach(関数ポインタ)の方が筋がいい。
そしてJSのArrayなんてイテレータはないよ。実際要らんし。

forEachが遅かったからイテレータ、ならそれは「言語の不備」だよ。
C++はその辺順番を入れ替えて同速にしてしまったし、知らんがRubyでもlazyモードで同様なんだろ。
勿論イテレータの方がいい場合もあるはずだが、これは昨今のimmutableや再代入を避けるのと同様、
これまでは不要にイテレータを使いすぎてただけ。
本当にイテレータが必要なところだけイテレータにして、その他はforEach(関数ポインタ)の方がいいよ。
0757デフォルトの名無しさん
垢版 |
2022/03/15(火) 01:11:07.84ID:DajlRg+n
何度も言うが、デザインパターンのiteratorはiteratorが抽象化されている
https://ja.wikipedia.org/wiki/Iterator_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3#:~:text=Iterator%20%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%EF%BC%88%E3%82%A4%E3%83%86%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BB%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%EF%BC%89,%E3%81%93%E3%81%A8%E3%82%92%E7%9B%AE%E7%9A%84%E3%81%A8%E3%81%99%E3%82%8B%E3%80%82
なので密結合にはならない。この図では
ConcreteAggregateとConcreteIteratorは蜜だが、AggregateとIteratorは疎
どうしてここまで説明しないと分からんのだ…

あと関数ポインタなどいらん
内部イテレータ方式喜ぶバカなんてお前くらいだ
0758デフォルトの名無しさん
垢版 |
2022/03/15(火) 01:43:01.13ID:DajlRg+n
Javaで関数ポインタ要らない例
// Main.java
import java.util.List;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.function.Consumer;
public class Main {
public static class MyContainer<T> extends ArrayList<T> {
public MyContainer(List list) {super(list);}
public void foreach(Consumer<T> consumer) {
for(var e: this) {
consumer.accept(e);
}
}
}
public static void main(String[] args) {
MyContainer<Integer> mine = new MyContainer<Integer>(Arrays.asList(1,2,3));
mine.foreach((value)->{System.out.println(value);});
}
}
0759デフォルトの名無しさん
垢版 |
2022/03/15(火) 02:53:52.15ID:rTKg59xg
イテレーター原理主義なんじゃないの
コレクションの要素を列挙するものしかイテレーターと呼ばないと考えてるとか
0763デフォルトの名無しさん
垢版 |
2022/03/15(火) 08:45:32.91ID:bERyk9+R
>>756
コンテナベースのイテレータを提供する言語もあるから誤解しているのだろうけど
本来のイテレータ自体はコンテナとは別の存在
例えばrustで以下のイテレータチェーン
(1..)
.map(|n| (n * n - n) / 2 * 3)
.take_while(|n| n < &23)
.map(|n| n % 4 + 114)
.map(char::from)
.for_each(|n| print!("{n}"))
これは「rust」と表示するけどコンテナ等は全く登場しない
0764デフォルトの名無しさん
垢版 |
2022/03/15(火) 08:52:20.69ID:bERyk9+R
>>760
シングルスレッドでデータ競合を起こす例がwikipedia及びそのソース元の言語公式仕様定義に明記されているね

https://ja.wikipedia.org/wiki/データ競合
> JavaScript (ECMAScript) において、read/writeイベントEとDが以下の条件を満たしている場合「EとDはデータ競合にある」と定義される[2]。
> ・EあるいはDに順序が定義されない(not SeqCst)
> ・EとDが重複したrangeを有する(overlapping range)
0766デフォルトの名無しさん
垢版 |
2022/03/15(火) 18:58:10.48ID:H3mwwYQo
どの言語でも『single writer XOR multiple readers』の原則を守ればデータ競合は起こらない
逆にそれを破ればシングルスレッドでもデータ競合は発生し得る
ほとんどの言語でデータ競合が起きる

>>762
Rustは『single writer XOR multiple readers』を言語仕様で満たしている
そのためRustではメモリ安全性だけでなくデータ競合も起きないことを保証している
もちろんC/C++と同じように生ポインタを使えるunsafeを使った場合はその部分を人間が責任を持つ
0767デフォルトの名無しさん
垢版 |
2022/03/15(火) 19:21:02.60ID:DajlRg+n
>>765
匿名クラスは内部クラスの一種だけど、通常はそういう書き方だね
>>741で言ってるのもそれのこと

>>766
まあRustもunsafeまみれだから安全じゃないけどね
0768デフォルトの名無しさん
垢版 |
2022/03/15(火) 20:31:20.53ID:lBfKiKMI
>>763
配列以外の実体に対しエミュレーションして配列メソッドを使いたい場合、イテレータはインタフェースとしては有効だ。
ただそれは「イテレーターパターン」使用箇所の1%以下だろ。


>>764
それは一般的にはレーシングコンディションと言う。(wiki書いた奴が無知なだけ)
そして、その定義ならErlangは問題ない。理由は、

・変数は再代入禁止なので、定義しか出来ず、書き換えようがないから
0769デフォルトの名無しさん
垢版 |
2022/03/15(火) 20:50:33.68ID:DajlRg+n
まあシングルスレッドでも普通にコールバック多いと意図しないデータ競合はいつでも起きるけどな
言葉の定義の問題になるので俺は黙ってたけど・・・
0770デフォルトの名無しさん
垢版 |
2022/03/15(火) 20:57:03.80ID:bERyk9+R
>>768
それはwikipediaにソースが明記されているように
JavaScript(ECMAScript)の公式仕様書の記載です

ErlangはETSが共有データとなるため
留意してコードを書かないとデータ競合が発生します
0771デフォルトの名無しさん
垢版 |
2022/03/15(火) 21:19:56.63ID:lBfKiKMI
>>765
それもしかしてわざわざ書いてくれた?ならどうも。


名前からしてそれは「アダプターパターン」になるのか?まあこれはさておき、
これがデザインパターンの問題を典型的に示してるとも思う。
デザインパターンは「実際にこう書ける」であり、「こう書きたい/書ければいいのに」ではないので、
実践的ではあるが現状肯定的で、理想的では全くない。
だからどうしてもバッドパターンが混ざり、言語が酷ければ酷い程それが増える。
Javaの場合は関数ポインタを直接取り扱えない事が致命的に欠点で、結果、
関数ポインタ専用コンテナとしてクラスを用いて継承をこねくり回したパターンが多くなってるが、
それらは他言語では不要なものばかりだ。
本当は「あらゆる言語の中で一番美しい書き方」集にすれば良かったのだろう。
0772デフォルトの名無しさん
垢版 |
2022/03/15(火) 21:20:12.77ID:lBfKiKMI
上記の通り、結局それは、関数ポインタを直接扱えなかった欠点を回避する為に、
関数ポインタ専用コンテナとして「匿名クラス」を用いているだけ。
素直に関数ポインタを直接扱えるようにすれば不要だった。
勿論ラムダの代替にもなるが、結局ラムダも入れてしまってるのだから、やっぱり「クラス」に見えるのは使いづらいんだよ。
(この辺はC++も同様で、ファンクタでいいだろ、でずいぶん粘ったようだが、結局ラムダも入れてしまってる。
C++に関しては仕様の直交性なんて誰も求めてないので、粘った意味も分からないが)

Java::匿名クラスのところを
> label.addMouseListener(new MouseListener() {
> public void mouseClicked(MouseEvent e) {}
> public void mouseEntered(MouseEvent e) {}
> public void mouseExited(MouseEvent e) {}
> public void mousePressed(MouseEvent e) {}
> public void mouseReleased(MouseEvent e) {}
> });

JS:汎用コンテナで普通にかけるので、○○パターンとかの命名なんてされない。
> label.addMouseListener({
> mouseClicked: function(e) {},
> mouseEntered: function(e) {},
> mouseExited: function(e) {},
> mousePressed: function(e) {},
> mouseReleased: function(e) {},
> });
ただしこんな書き方は普通はせず、単に
elem.onclick = function()e){};
で済まされるが。
0773デフォルトの名無しさん
垢版 |
2022/03/15(火) 21:21:54.17ID:lBfKiKMI
あとついでに言うと、Java的にあらゆるイベントを纏めて記述方式はコード的に無理があって、 --- (A)
だいたいclick系とmove系(Enterd/Exited/Pressed/Released)は別物になる。
前者はそのelemだけで完結するが、
後者はドラッグ&ドロップ等なので、大体周りのelemにも同じようなコードを走行させる事になるから。
だから「匿名クラスでその場に定義のみ」だとかなり悲惨なコピペだらけになる。
最低限、そのメソッドに直接関数を差し込める書き方、

function click(){}
function move(){}
label.addMouseListener({
mouseClicked: click,
mouseEntered: move,
mouseExited: move,
mousePressed: move,
mouseReleased: move,
});

とかが出来ないと死ねる。で、Javaはこれも出来なかったように見える,。(Java7までは)
だからJavaのGUIは完全に死んだ。

ただしイベントがバブルする場合は上記 (A) の問題は実質的にない。
(どうせ纏めて記述するに近い物になるので。
つってもJavaのGUIなんて全く整備されてないから未だにバブルしないんじゃないかとも思うが。
なお.NETはWPFからバブルする)
0774デフォルトの名無しさん
垢版 |
2022/03/15(火) 21:23:27.75ID:AHjgvQpl
>>770
ESの仕様にあるデータ競合はWeb Worker(つまり別スレッド)とSharedArrayBufferなんかでメモリ共有した場合の話であって、シングルスレッドでデータ競合すると主張しているわけではないと思うが
0776デフォルトの名無しさん
垢版 |
2022/03/15(火) 21:31:28.32ID:lBfKiKMI
>>770
> https://262.ecma-international.org/10.0/#sec-data-races
race は レースであって、競合なら confliction だよ。訳が不適切。

ただ、レーシングコンディションならRustでもいくらでも作れるはずだけど。
shared memory が出来るのだから、
同じ場所を書き換える非同期ジョブを適当に流し込めば自動的にそうなる。

Erlangでは出来ない、ってのは、上記の「同じ場所を書き換える」事が出来ないからだよ。(共有メモリも出来ない)
ETSってのは知らんが。
0778デフォルトの名無しさん
垢版 |
2022/03/15(火) 21:38:08.96ID:eZS8bXEN
>>775
>>769がコールバックの呼び出し順序が非決定的であることを言っているならそれは競合状態(race condition)
データ競合(data race)ではない
0779デフォルトの名無しさん
垢版 |
2022/03/15(火) 21:41:04.21ID:DajlRg+n
>>778
俺が言ってるのは単なる不注意だよ
順序は決定的だけど、離れすぎて分からなくなるパターン
0780デフォルトの名無しさん
垢版 |
2022/03/15(火) 21:43:51.00ID:eZS8bXEN
>>779
決定的なら競合すらしないと思うが…
単に論理バグで値を壊してしまうことはデータ競合とは言わないのでは
0781デフォルトの名無しさん
垢版 |
2022/03/15(火) 21:50:10.28ID:DajlRg+n
だから言葉の定義w
関数やメソッド単位で見る人間にとっては、再入とかコールバックが輻輳してやらかす事件はとても似てるw
組込みの割込みとかシグナルとかのIPCも同様なので、まあ混ぜて考えてもいいと思うって人はいるんじゃないかと思ったw
0782デフォルトの名無しさん
垢版 |
2022/03/15(火) 21:55:39.00ID:bERyk9+R
>>776
data race(英語)⇔データ競合(日本語)です
ETS (Erlang Term Storage)はErlangが標準で持っているインメモリの領域
ETSはErlangで色々辛いところを解決する魔法の道具であり抜け道でもありGCもなくデータ共有もOK

>>778
もちろん競合状態(race condition)もあるけど
それとは別に同じデータ(対象)に対して2者以上がルールを守っていなければデータ競合が発生
例えば>>766の言う『single writer XOR multiple readers』の原則が崩れていればデータ競合が発生ありうる
0783デフォルトの名無しさん
垢版 |
2022/03/15(火) 22:10:46.08ID:eZS8bXEN
>>782
シングルスレッドでshared xor mutableで防げるバグがあるのはそう(イテレート中にイテレート元にデータ挿入しちゃうとか)だが
それはデータ競合とは言わないのでは
少なくともRust公式はdata raceの定義をマルチスレッド前提にしているし、一般的にもそうだろう
https://doc.rust-lang.org/nomicon/races.html
0784デフォルトの名無しさん
垢版 |
2022/03/15(火) 22:23:00.78ID:H3mwwYQo
>>783
それは非同期でマルチグリーンスレッドでも全く同様に起きることであるし
それは非同期コールバックのあるJavaScriptでも同じく起きることであるし
シングルOSスレッドでも発生しちゃうな
0785デフォルトの名無しさん
垢版 |
2022/03/15(火) 22:33:43.93ID:lBfKiKMI
>>782
raceは競『争』。競『合』の訳はないと思うが、
まあお前らがレーシングコンディションの意味で使ってると分かれば俺はとりあえずはいい。
(とはいえ俺はもう終わりでいいが)

あと、JSの定義は>>774が言ってるとおり、
マルチスレッドでの前提で、シングルスレッドでは発生しない。(定義されてない)

多分wiki書いた奴が全く分かってない。
何か不思議な値になるみたいな書き方だが、そうはならない。
一発書きなら当たり前だがどちらかが書いた値にしかならない。殆どの場合はこれになる。
一発書きしない場合は混ざる事があるが、
多分これを著者が理解出来てないからあやふやな書き方になってる。
0787デフォルトの名無しさん
垢版 |
2022/03/15(火) 22:50:45.74ID:MfNILggQ
ここまで出た通りES/Rust/C++はマルチスレッド前提で、Javaも確かそうだったし
シングルスレッド派の人はちゃんと定義されてるやつを示してほしい
日本語Wikipediaじゃなくて

>>785
訳が競争というのはまぁそうかもしれないけど、CS系学部の教科書レベルで競合に統一されちゃってるので、いまさらどうしようもないね…
0788デフォルトの名無しさん
垢版 |
2022/03/15(火) 22:52:23.31ID:MfNILggQ
というかよく考えたら日本語Wikipediaも間違ってはないんだな
引用した人がJSだからシングルスレッドって思い込んでただけで
0789デフォルトの名無しさん
垢版 |
2022/03/15(火) 23:02:06.12ID:DajlRg+n
ほら定義の話になってんだろ
それって正解がないので、どっちかに合わせて結論出したら終わりなんだよ
0790デフォルトの名無しさん
垢版 |
2022/03/15(火) 23:20:05.34ID:38db7Aep
データ競合(data race)だろうと競合状態(race condition)だろうと言語ごとに定義が違うなこりゃ

言葉の定義自体は規格書引っ張り出してきて殴り合うとして、
言語が別だとそもそも話し合うことすら難しいんじゃないの?
どっちかの定義に寄せることすら無理そうだし
0791デフォルトの名無しさん
垢版 |
2022/03/15(火) 23:20:45.51ID:DajlRg+n
あと>>783の定義だと、concurrentだからシングルスレッドな並行もダメかもね
非同期シグナルとかもダメだし、シングルスレッドって前提だけではデータ競合起きちゃうね
0792デフォルトの名無しさん
垢版 |
2022/03/15(火) 23:46:09.49ID:DajlRg+n
定義は両者で共有・合意するだけで問題ないよ
規格書を引っ張り出す必要もない
ただ出た結論は定義込みで語られないと意味がないだけw
0793デフォルトの名無しさん
垢版 |
2022/03/16(水) 00:57:59.77ID:DZO6khEt
>>787
> CS系学部の教科書レベルで競合に統一されちゃってる
よしそいつを吊そう…
と言いたいところだが、語感的に

競争:所詮どっちが先か後か程度、結果はどっちかになる
競合:ぶつかってぶっ壊れるイメージ、結果がどうなるかは分からない

だから敢えて「競合」としたのだろう。
発端はただの競争でしかないが、甘く見てると、結果は全く身に覚えのないデータになってしまう事もあるので、
教育上は「競合」の方がいいのかもしれない。

有名どころはJavaのdouble-checked lockingイディオムが実は全く役に立たず、大騒ぎしてた件とか。
http://www-06.ibm.com/jp/developerworks/java/020726/j_j-dcl.html (多分これだがリンク切れ)

残骸はあちこちに残ってるので雰囲気だけは分かるかも。
https://atmarkit.itmedia.co.jp/bbs/phpBB/viewtopic.php?topic=31199&;forum=12
なお言い分が食い違ってるが、俺はさらに違ってて、「初期化中のクラスが他スレッドに見えてしまって、
Javaの仕様ではこれを防ぐ方法もない」だと思ったが。
他の残骸は以下とか。(全部読んだわけではないけど)
https://en.wikipedia.org/wiki/Double-checked_locking
https://stackoverflow.com/questions/1625118/java-double-checked-locking
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
0794デフォルトの名無しさん
垢版 |
2022/03/16(水) 01:28:32.65ID:0TydPa2f
別に毎回同期すればいいだけのところを無理に端折ろうとすると、複数CPU時代の現代ではインターロックが必要ってだけでしょ
volatileがないのは論外だけど…
競合を回避するには同期(ロック)しようねってだけ
0795デフォルトの名無しさん
垢版 |
2022/03/16(水) 02:53:58.81ID:jNwWVkZm
JSエアプだったからスルーしてたが >>764 の言う「順序」ってのが定義されていればデータ競合にはならんのだよな?

1スレッド内の操作で順序が定義されていないって状況がなんか想像できなかった

まさか value=value みたいのがデータ競合なんてならんだろうし
0797デフォルトの名無しさん
垢版 |
2022/03/16(水) 08:12:09.94ID:kgs87UnJ
>>766
もちろんC/C++と同じように生ポインタを使えるunsafeを使った場合はその部分を人間が責任を持つ

そういうのは「Rustが保証する」とは言わん。
0798デフォルトの名無しさん
垢版 |
2022/03/16(水) 21:28:41.83ID:MkjFLw2M
>>797
それはあなたが理解できていない
プログラム全体に渡り言語仕様に基づきコンパイラが安全性を保証できる
その例外部分がunsafe宣言部分でありそこだけを人間が責任を持てばよい
他の言語はプログラム全体に渡り人間が責任を持たなければならない
0799デフォルトの名無しさん
垢版 |
2022/03/16(水) 22:05:14.42ID:DZO6khEt
この際「Rustのunsafeは綺麗なunsafe」のダブスタは置いておくとして、
仮にRustではデータ競合をunsafe領域だけに局在化出来るとして、それで何が嬉しいんだ?
具体的にそれをどういうアプリに生かせるんだ?


他言語の場合はスレッドセーフにするのには細心の注意がいる。
だから一般的に最小限の部分しかスレッドセーフにしない。結果、共有も最小限だ。

対してこれがunsafe領域だけにできるとして、これだけなら
・ロック周りを記述している箇所は後から検索出来るように必ず ./// LOCK のコメントを付けとけ
程度の意味しかない。

既に言ったが他言語ではロック周りは難しいので最小限に絞られている。
これがRustで楽に書け、もっとカジュアルに使えるとして、
出来上がるアプリは「スレッド間をもっと密結合させ、共有RAMをもっとカジュアルに使うもの」になる。
共有RAM方式は昨今言われている程遅くも悪くもないが、(x86の場合は)
ハードウェアとしては従来通りの「共有RAMは最小限」の方が断然速く動く。

だから単純には、
C++ではロック周りでバグが出まくって実装するにはとても無理だが、
言語サポートがあるRustなら平気で書けるからこそこの構造に出来、断然性能がいい、
とかいうアプリ(適用領域)がないといけないが、これは何?

Go/Rustはマルチスレッドがこなれてからの言語だからその辺に独自のアイデアを突っ込んできてるのは当然として、
Rustのが「ロックをもっとカジュアルに」なら多分ハズレだ。
簡単に書けるのは正義ではあるが、ロックを最小限に絞るのは『大』正義だからだ。
(そして一般的なフレームワークを使えば、
ロックなんてそれ用のクラスを使うしかないから、検索すればすぐに見つかる。
ロックすら考慮せず野良で共有してるようなコードは見逃すが、
これを防ぐ為だとしたらRustは相当の馬鹿向け言語という事になる。
C/C++だったら「そんな奴は死刑」で誰も反対しない)
0800デフォルトの名無しさん
垢版 |
2022/03/16(水) 22:10:43.48ID:1Cs5zQXI
一応確認するけど触っちゃダメな人だよね?
0801デフォルトの名無しさん
垢版 |
2022/03/16(水) 22:14:58.99ID:CXtf6yKM
>>800
スレで一番筋の悪い人が
スレで一番の長文を書いて暴れる

しかしこれは珍しいことではない
自分と他人の力量が見えないことは
こういう風景を生みがちなのである
0802デフォルトの名無しさん
垢版 |
2022/03/16(水) 22:41:00.48ID:0TydPa2f
そもそも何と何を比較したい、とか主張や前提が不明瞭だから長くなってんだよ
日記を書くなら他所にしてね
0803デフォルトの名無しさん
垢版 |
2022/03/16(水) 23:55:27.76ID:yCGU0QjC
>>799
Rustで実際に書けばわかるが
普通のプログラムでunsafeを使うことはないぜ
unsafeは特定のライブラリの中に閉じ込められていて外に影響なし
その部分を除くプログラム全体の安全性をRustコンパイラが保証
他の言語ではプログラム全体の安全性を人間が保証
0804デフォルトの名無しさん
垢版 |
2022/03/17(木) 00:29:26.40ID:WcGjUzZw
銀の弾丸は無いってことを理解できない人が暴れてるみたいだな。
たぶん今までの人生全ての出来事が100点じゃないとダメな人なんだろうけど、なんでまだ生きてるんだろう?
0805デフォルトの名無しさん
垢版 |
2022/03/17(木) 00:41:54.94ID:aVeaiVtR
>>803
ユーザーがunsafeを使う必要がないのはいいが、
それが何を作る時にどう利点になるんだ?


繰り返すが、C++等でロック等を自前で書く事はほぼ無い。
最小にする為にatomicにして、atomicは通常、フレームワークが用意してる物を使うからだ。
だから「ロック等を使う必要がある」事を認識してる奴が書いたコードなら、Rustと同程度に安全だ。
なぜなら、Rustでも「ロック等を使う必要がある」と認識して、特定のライブラリを使わないといけないんだろ。

この側面についてのRustの利点は、
・「ロック等を使う必要がある」とすら認識出来ない馬鹿が書いた時に、コンパイルが通らない --- (A)
というだけのように見える。

・「ロック等を使う必要がある」と認識出来る奴が、ロック等を『うっかり』忘れる --- (B)
のを想定しているなら、はっきり言ってこれはない。
マルチスレッドを直接扱う場合、何らかのロック等が『常に』必要であり、
最初にそこを設計して、かつそれはスレッドについて「入力」「出力」側1つずつとかの最小限に絞るからだ。
つまり、目で見て分かる程度でやってる。見落として苦労する事は無い。
これをRustだとコンパイラがチェックしてくれるから、大量に出来る!見落としもない!のはいいが、
それはどういう時に利点なんだ?という話。

細かいオブジェクトを大量に共有出来たら素晴らしくパフォーマンスが上がる、なんて構造、無いだろ。
0806デフォルトの名無しさん
垢版 |
2022/03/17(木) 01:37:02.04ID:HeUHSOmZ
>>805
Rustコンパイラが保証するのは
・そういうマルチスレッド時の、狭義のデータ競合、だけでなく
・シングルスレッドでの非同期コールバックなどの、普通のデータ競合、や
・ロジックミスなどにより生じる、広義のデータ競合、に加えて
・様々なメモリ安全性、に至るまで
コンパイル時に検出が可能なことを保証
色んな言語で書いてきたプログラマーならば以上の説明で恩恵を納得できる
0807デフォルトの名無しさん
垢版 |
2022/03/17(木) 01:38:54.54ID:faeKJv0z
C++って何か理由があってピンポイントで使うことが多いと思う
だからフレームワークってあんまりないよね
間違ってる上に風呂敷広げすぎ

Rustもそんなこと保証できない
0808デフォルトの名無しさん
垢版 |
2022/03/17(木) 01:39:14.78ID:QB355J6E
もう相手すんなよ
うっかりがありえないとかまともなプログラマならそれこそありえないことを知ってるだろうし
0809デフォルトの名無しさん
垢版 |
2022/03/17(木) 01:49:00.20ID:jsnVHM5N
 :::....   /|\||   
     //|'\\.... ...:::.. .......
    |/ ,'|-、 \\
    |/ ,'|-、 \\\
    |/ ,'|-、 \\\|.... ...:::.. .......
    |/ ,'|-、 \\\|:..。..... ...:::.. .......
    |/ ,'|-、 \\\|__|
    |/ ,'|-、 \\\|:...|ヽ .... ...:::.. .......
    |/ ,'|-、 \\\|::::| |::..... 
 | ̄ ̄ ̄ ̄ ̄\、'\\|;;:.|_,,|___   
 | □□ □□ | |\, \|;;::....     |\
 | □□ □□ | |  | ̄ ̄ ̄ ̄|\;: . |  |
 | □□ □□ | |  |□□□□|  |::...|  |;;:
 | □□ □□ | |  |□□□□|  |::...|  |:;:./
 | □□ □□ | |  |□□□□|  |::...|  /
 | □□ □□ |.._|__,,|□□□□|  |::...|/  
,,| ̄ ̄ ̄|| ̄ ̄\≡\,□□□|/ ,/

今北産業 [IMAKITA INDUSTRIAL CO.,LTD]
     (1978〜 日本)
0810デフォルトの名無しさん
垢版 |
2022/03/17(木) 01:53:13.45ID:nYfWW7l3
彼は確かに色々と間違っているが
彼の言う通りロックが必要なところでうっかり忘れたとすると
Rustコンパイラはそれが引き起こすデータ競合を通さないから
結局ロックが必要な型を使うことになり結果としてそれも保証されたことになる
0813デフォルトの名無しさん
垢版 |
2022/03/17(木) 02:57:11.72ID:75al4ANx
Rustを叩く連中は
長々と長文で頓珍漢なやつと
理由も言わずに嘘とか違うとか言うだけのやつがいる
0816デフォルトの名無しさん
垢版 |
2022/03/17(木) 03:38:46.21ID:faeKJv0z
データ競合の話に決まってんだろ
頭にボウフラ湧いてない?
昨日のまとめ的見解は大枠>>786のような感じw
0817デフォルトの名無しさん
垢版 |
2022/03/17(木) 03:44:26.34ID:3E/T0vc7
データ競合の意味する範囲が様々あるのはその通り
一方で>>806はそれを3種類に分けているのもその通り
いずれにしてもそれら全てに対してRustコンパイラはデータ競合が起きていないことを保証するので問題なし
0818デフォルトの名無しさん
垢版 |
2022/03/17(木) 04:03:48.44ID:faeKJv0z
データ競合の定義が複数あるのがそのとおりなら、もうそれだけで常に真になるわけではないことになる
それを「保証する」なら「嘘」と言わざるを得ない
0819デフォルトの名無しさん
垢版 |
2022/03/17(木) 04:12:17.15ID:4H6NzgN+
どの定義のデータ競合も共通している点がある
それは『single writer XOR multi readers』を厳守しているならばデータ競合が起きない点
そしてRustコンパイラはどんなに複雑な状況でも『single writer XOR multi readers』の厳守/破綻を検知できる
つまりRustコンパイラはどのタイプのデータ競合も起きていないことを保証できる
0824デフォルトの名無しさん
垢版 |
2022/03/17(木) 21:25:25.12ID:7cb0HHrx
>>821
Rustにアンチな人はunsafeを持ち出した時点で敗北だと気付かなきゃ
Rust以外の言語ではプログラム全体がそのunsafe状態なのだから
0825デフォルトの名無しさん
垢版 |
2022/03/17(木) 21:31:34.22ID:faeKJv0z
Rustのunsafeは質が非常に悪いからな
まさに邪悪の一言に尽きるw
ピカピカのRustが一瞬にして継ぎ接ぎだらけのボロ雑巾に生まれ変わるw

かたや他の言語は長い歴史が積み上げた研鑽のたまもので、そこそこ綺麗に保たれているのであったw
0826デフォルトの名無しさん
垢版 |
2022/03/17(木) 21:47:24.40ID:LVblziyo
>>825
unsafeは普通のプログラミング言語と同じという意味ですよ
つまり普通のプログラミング言語はプログラム全てがunsafeなのでデータ競合やメモリ安全などを人間が確実に保証しなければなりません
一方でRustはプログラムのほとんどの部分がunsafeではないのでコンパイラが安全性を保証できます
0828デフォルトの名無しさん
垢版 |
2022/03/17(木) 22:15:39.17ID:H/cd+ZWN
>>823
もうそこしか攻められないってことだろ
そんなところ攻められても痛くも痒くもないけどw
0830デフォルトの名無しさん
垢版 |
2022/03/17(木) 23:08:20.88ID:aVeaiVtR
>>806
やっぱり俺にはRustは要らないという結論だね。

> 色んな言語で書いてきたプログラマーならば以上の説明で恩恵を納得できる
新興言語にかなり有利に出るPYPLですらC/C++比1/6の現実を見た方がいい。
0831デフォルトの名無しさん
垢版 |
2022/03/17(木) 23:13:07.24ID:s2P7MscG
C/C++とRustならば
両方使いこなせる人が常にRustを選ぶことからも言語の優劣差がはっきりしている
0832デフォルトの名無しさん
垢版 |
2022/03/17(木) 23:26:04.14ID:aVeaiVtR
>>831
> 両方使いこなせる人が常にRustを選ぶ
Rust界隈でインタビューすればそりゃそうなる。そういうところがエコーチェンバーだと思うんだけどね。

まあasyncはだいぶ筋が良さそうだし、今後どうなるかだね。
0833デフォルトの名無しさん
垢版 |
2022/03/17(木) 23:27:19.56ID:faeKJv0z
両方使いこなせるけど、常にC++を選んじゃってるんだがw
まあ趣味だし他人にC++は勧めないけどねw
だからといってRustも全く勧めない
言語の優劣は圧倒的にC++が優っている
0835デフォルトの名無しさん
垢版 |
2022/03/17(木) 23:39:33.80ID:faeKJv0z
ここでそんなこと言われたことないし、このスレ系列にも俺が書いたコードあるけどw
コードくれくれビビリ単発IDがココにも湧き始めたねw
書けると何度も言ってるし金くれるなら書くって言ってるんだがな
0836デフォルトの名無しさん
垢版 |
2022/03/17(木) 23:48:09.01ID:76PcfavB
その人は>>825を見るとunsafeの意味も
Rustがunsafeを分離することに成功した価値も理解できていないようだから
コードも書くことができないだろうと思う
0837デフォルトの名無しさん
垢版 |
2022/03/17(木) 23:52:24.83ID:faeKJv0z
お前みたいな胡散臭いのが余計なことしてるからRustがいつまで経っても広まらないんだよw
理念は悪くないのに、嘘までつくからこうなるw
0838デフォルトの名無しさん
垢版 |
2022/03/17(木) 23:58:29.79ID:+BzvG1OL
理解してるとかどうか以前に、精神レベルがどうみても小学生以下じゃん
何を書こうが議論するに値しないよ
0839デフォルトの名無しさん
垢版 |
2022/03/17(木) 23:59:13.49ID:X4t1JDyl
この真っ赤な人はRust叩きばかりしているダメな人でRustスレを出入り禁止になった人でしょ
0840デフォルトの名無しさん
垢版 |
2022/03/18(金) 00:07:42.38ID:slshVm4c
俺はRustスレでRust以外の話はしてない(Rustの説明に必要なときだけ他言語を書く場合がある)し、もちろん出禁になってもいないし、Rustのコードも書いたしお前より貢献してる気がするんだけどw
ビビリの単発連投構ってちゃん君w
0842デフォルトの名無しさん
垢版 |
2022/03/18(金) 00:20:41.88ID:slshVm4c
cargo geigerは忘れずにしような☢
頭おかしいと思っちゃうなら患者は恐らく君のほうだと思うよ
俺は専門家じゃないから知らんけどw
0844デフォルトの名無しさん
垢版 |
2022/03/18(金) 00:28:30.81ID:slshVm4c
お前同様ずっといるんじゃないかなw ビビリの単発ID連投構ってちゃん君w
プログラミングのお勉強()はしなくていいのかな?w
0846デフォルトの名無しさん
垢版 |
2022/03/18(金) 01:55:32.71ID:slshVm4c
どうしてそういう解釈になったのかは知らんし、君の頭が悪いのまで俺のせいにされても・・・
0848デフォルトの名無しさん
垢版 |
2022/03/18(金) 06:34:33.31ID:slshVm4c
勝手に名前付けてんなよw ビビリの単発ID連投構ってちゃん君w プログラミングできないのは君だけだよw
0849デフォルトの名無しさん
垢版 |
2022/03/18(金) 11:03:26.58ID:Rp9aIyi6
>>799
他の言語では細心の注意が払えていなかったことが実行時まで分からない部分が、Rustではコンパイル時に分かることが嬉しいんだろ
だから実際には細心の注意を払わなくても大抵の入力で問題ないケースにも制約が掛かってRustでは難しくなる場合がある
それにその制約を強制されたところであらゆるバグがなくなるわけではない
Rustが定義するバグの範囲に収まるだけ
これを嬉しいと思うかどうかで選べば良いんじゃないの?
0851デフォルトの名無しさん
垢版 |
2022/03/18(金) 11:42:44.46ID:6ALtOjL+
キーワードにunsafeがあるRustはダメ。
C/C++ならunsafeというキーワードは無いからオーケー。
0854デフォルトの名無しさん
垢版 |
2022/03/18(金) 12:29:49.65ID:slshVm4c
C++は最強言語なのでRustを使うメリットなんて皆無なんだが、人類には難しすぎるのが難点w
Rustがゴミなのは、その人類が勘違いをして、unsafeまみれなのに安全とかぬかしてるところw
0855デフォルトの名無しさん
垢版 |
2022/03/18(金) 13:22:00.60ID:euxfX23u
>>853
C/C++はプログラム全てがunsafeだから人間が管理しきれておらず
その結果として様々な問題を引き起こしてきたと各IT大手も明言しているね
0856デフォルトの名無しさん
垢版 |
2022/03/18(金) 13:27:25.17ID:MJwnlpj5
まるで、有能大企業にたった一人のゴミを入れたら無能大企業になるみたいに
0857デフォルトの名無しさん
垢版 |
2022/03/18(金) 13:55:30.43ID:Z0qe6pb3
Rustはプログラミングしやすいから使ってる
安全性の保証とかはオマケで付いてきてる
0858デフォルトの名無しさん
垢版 |
2022/03/18(金) 16:31:30.68ID:7e5S1fGo
C++と比較なら、Rustが良いよねとは素直に思う。

スレタイにある言語との比較だと、
メモリ管理を人がしないといけないRustは遠慮したい。
0867デフォルトの名無しさん
垢版 |
2022/03/18(金) 22:35:08.48ID:OH/M8ZAW
ガイガー君はいつも金を無心しているから金が無いんだよ
コーディング能力も無いけど
0868デフォルトの名無しさん
垢版 |
2022/03/18(金) 23:03:51.44ID:slshVm4c
内容のない煽りしか出来ないビビリの単発ID連投構ってちゃん君じゃないから、どちらもあるけどねw
0870デフォルトの名無しさん
垢版 |
2022/03/18(金) 23:42:11.74ID:Ty44Aa5j
>>849
その通りだが、それは「簡単」のメリットの一面であり、
日本人はそっちしか目指さないから駄目なんだ。つまり、

・従来難しかった事が簡単になった(≒バグを検出しやすくなった)

の使い方だが、日本人はこれを

・従来難しかった事が簡単になったから、『馬鹿でも出来る』ようになった --- (A)

と、下方向への拡張にしか使わない。
結果、よりもっと馬鹿=人件費が安い連中に、という事で、
『文系でも出来た!』『中国人』『ベトナム人』とまあ、

・今までと同じ事を、より馬鹿を使う事によって、人件費を抑えようとする

から、エンジニアの給料が上がる事がない。
勘違いしてる社畜プログラマは
「エンジニアをもっと好待遇にしろ(≒給料を上げろ)」と簡単に言うのだが、
下方向への競争をやってる限り、給料が上がる事はない。
いつしかもっと安い連中を探し出してきて、代替されるからだ。
ならば、

・従来難しかった事が簡単になったから、同じ事が早く出来るようになった --- (B)

とするのもの一つの作戦だ。回転数で勝負というわけだ。
これが得意な奴ならこれもありだろう。
ただ、安い連中の中には早い連中も居るから、安泰ではない。
(A)と同様、給料には下方向への圧力がかかり続けてる状態だ。
0871デフォルトの名無しさん
垢版 |
2022/03/18(金) 23:42:29.09ID:Ty44Aa5j
本来は、

・従来難しかった事が簡単になったから、
 従来では現実的に不可能だった事が出来るようになった --- (C)

を目指さないといけない。これが上方向への拡張だ。
「俺は素晴らしい学歴を持ってるのだから、もっと給料を払え」と言うのなら、
その素晴らしい学歴を獲得する過程で得た知識を持っていないと出来ない事、
知識がない人(≒馬鹿)には出来ない事をやって差別化するしかない。
そしてそれでユーザーにメリットが有れば、製品は売れ、利益が出るので、給料も高く留まる。
馬鹿ではそれが作れないなら、安売り合戦になる事もない。
だからそれは何だと聞いてるんだよ。

(A)(B)は順当な進化だが、それを追求するのは文系プログラマでいい。
CSを学んでおり、それで高収入を得たいなら、
CSで学んだ知識がないと無理な領域を攻めるしかない。
勿論CSだからプログラミングは余裕で、
文系プログラマですら給料払ってくれる日本企業なら楽勝でスーダラ節状態、
「サラリーマンは気楽な稼業と来たもんだ」な人生もありだとは思うが、
何も考えずに(A)(B)しかないと思ってたのなら、ちゃんと(C)も意識しておけ、という事。

実際、アメリカ人とかは(C)も目指してて、
よくもまあこんなもん作りあげたな、というのも多いだろ。
一つ一つは小さな(C)の積み上げなんだよ。

で、話を戻すと、

従来:ロック周りは難しいので、出来るだけ書かないようにする
 = 出来るだけ大きい単位(ジョブ)でしかマルチスレッドを適用出来ない
Rust:ロック周りもコンパイラサポートありなので、従来よりは気軽に書けます!
 → それでロックが大量に書けてバグもないとして、
   ユーザーにとってのメリット(通常は速度)がある領域は何?
0872デフォルトの名無しさん
垢版 |
2022/03/18(金) 23:46:57.28ID:Ty44Aa5j
>>806
思うにそれはGoに必要な機能だ。

今現在もロック周りは難しいとされているので、あまりそこを攻めようという奴はいない。
結果、通常は「ジョブ」という、最大単位でマルチスレッドにして、ロック記述は最小にしてる。

C#の場合は全てフレームワーク内に隠蔽し、ユーザーがロック記述をする必要が無くしてしまった。
メインスレッド+スレッドプールで、共有部分はメインスレッドで処理し、
完全に独立している部分を非同期ジョブとして切り出す。
多分ジョブ内からでもInvokeを使えばメインスレッドにやらせる事は出来るはずだから、
この場合、mutexやatomicを全く使わなくても済む。
(mutexやatomicよりはInvokeの方が簡単だし静的に解析可能、と見たのだろう。
これは実際そうだし、Invoke《意味的には固有スレッドで動かすコルーチン》なら
どこをどう間違えてもデッドロックはしない)

Goの場合はもっと小さい単位(コルーチン程度)でマルチスレッドを使うのが正解だと踏んだのだろう。
それでアクターモデルでやればmutexやatomic系は必要なくなる。
問題はランタイムの設計が不適切で無駄にgoroutineが重い事だが、これは言語自体の問題ではない。
(ただしアクターモデルよりはオブジェクト指向でatomicした方が断然速いので、
Go以外の言語は全部そうしてるわけだが。
この意味ではC#はメインスレッドだけアクター用のインタフェースを持ってる事になるが)
0873デフォルトの名無しさん
垢版 |
2022/03/18(金) 23:47:15.18ID:Ty44Aa5j
とはいえ、マルチスレッドで細かく共有する構造はGoだと圧倒的に記述しやすいのは事実だ。
ただし現実的には容易にデッドロックするから無理だし、
何故か分からんがGoの連中は共有RAMを必要以上に嫌ってて、原則「チャネルで繋げ」となってる気はする。
ここに「ロック周りもコンパイラサポート!バグは静的に検出!!!」出来れば、
新境地が開ける可能性はある。
ついでに言うと、Goの場合は同期チャネルなので、
レーシングコンディションも強引に潰していく事が可能
(EDと来た場合にも、EにD待ちさせてDEと整列させる記述は凄く簡単)なわけだが、
これもデッドロックの巣でしかないので今現在は現実的に無理だ。
ここら辺の扉も開く可能性はある。


ただ一般論としては、

Rust:ロック周りもコンパイラサポートがあるので、気楽に書けます!
C#:ロック周りはフレームワーク内部に隠蔽したので、全く書く必要有りません。

なら、C#の方が正解だとされる。
0876デフォルトの名無しさん
垢版 |
2022/03/19(土) 00:33:29.03ID:DslNhsx1
C#とGoとRustならGoでいいと思うけど…一番ラクじゃん
C#なんてTask.Delay()の代わりにThread.Sleep()使うだけで簡単にデッドロックするよw
0877デフォルトの名無しさん
垢版 |
2022/03/19(土) 00:45:29.31ID:Svl9Tdf5
>>876
俺が言ってるのはasync。
あと、C#の場合はもはやその辺も使う必要がない。同期周りを一切書かずに済む。
そしてtry-catchも強引に持ってきてしまったから、C#が目指しているのは、

・同期のノリで書いて、ほぼ問題なし。
 一切マルチスレッド周りの知識も必要なし。単なる高火力コンロとして使用可能。
 ただし、中身はマルチスレッドなので、分離はしてないと駄目だし、処理順も規定出来ない。

というところかと。殆どの場合はこれで済むのも事実だし。
C#の場合は(B)の生産性最重視だからこれも一つの解だよ。
0880デフォルトの名無しさん
垢版 |
2022/03/19(土) 01:51:16.86ID:Svl9Tdf5
すまん、877の1つ目の中身は以下。(テキストは無いと勝手に勘違いしてた)

public async Task<int> GetUrlContentLengthAsync()
{
var client = new HttpClient();

Task<string> getStringTask =
client.GetStringAsync("https://docs.microsoft.com/dotnet";);

DoIndependentWork();

string contents = await getStringTask;

return contents.Length;
}

void DoIndependentWork()
{
Console.WriteLine("Working...");
}
0881デフォルトの名無しさん
垢版 |
2022/03/19(土) 01:57:24.25ID:DslNhsx1
例えば、Sleepじゃなくて(同期)Waitだけど、WPFなどGUIのプロジェクトでこんなコードを走らせてみれば、デッドロックするよw
// MainWindow.xaml.cs
...
public partial class MainWindow : Window {
private async Task DelayAsync() {
await Task.Delay(1000);
}
public MainWindow() {
DelayAsync().Wait();
InitializeComponent();
}
}
...
.NETのモデルは同期と非同期を混ぜると結構簡単に(分かりにくい)デッドロックを起こす
0882デフォルトの名無しさん
垢版 |
2022/03/19(土) 02:11:20.46ID:Svl9Tdf5
>>881
waitするのが悪いんだろ。
asyncは同期的にずらずら書く用で、手動でマルチスレッドする用ではないので。

C#はそこまで馬鹿な奴を救済する用には出来てない。
正しく書いた時に正しく動く用だ。
(つか、Taskを流用したから混ぜられるのであって、多分それも仕様なんだろう。
新しくAsyncTaskにしてWaitメソッドを無くせば済んだ話だし)


まあとにかく、簡単に書ける、馬鹿でも書ける、ってことを目指してる限り、
給料なんて一生上がるはずもない事は認識しておくべきだよ。
0883デフォルトの名無しさん
垢版 |
2022/03/19(土) 02:31:56.02ID:DslNhsx1
そもそもTaskはasync/await前から同じような動きをする書き方が出来てて、手動でマルチスレッドする用ではないw
給料の問題ではなく、他の言語と比較して、不測の事態を起こしやすいモデルなんだよね
名前に統一感がないまま、いろいろ出来るようになっているからw
0888デフォルトの名無しさん
垢版 |
2022/03/20(日) 00:43:14.80ID:J9wgpmKz
>>881
C#はWPFとしてGo,RustではどんなGUIが標準的に用意されてんの?
それでは同様の障害は起こらないの?

あからさまに比較対象がおかしい
0889デフォルトの名無しさん
垢版 |
2022/03/20(日) 01:44:23.98ID:1+CNf8az
>>888
比較対象がおかしいんじゃなくて、お前が無知なだけw
.NETはSynchronizedContextというのでスレッドのスケジューリングを調整できる
そして、GUIとコンソールでこのスケジューリングが違うから、GUIを出したんだよw
同じことをコンソールアプリでやってもデッドロックしないw
つまりあえておかしいのが何かを選ぶならお前の可哀想な頭ということになるw
0890デフォルトの名無しさん
垢版 |
2022/03/20(日) 08:46:38.88ID:meh5jYAs
>>889
おかしいのはお前の頭だ馬鹿タレ
881は

int main() {
sleep();
return 0;
}

でアプリケーションが終了しない!デッドロックだ!と騒いでいるに等しい。

ぼくのすごいあぷりけーしょんのばぐはぜんぶすたてぃっくにけんしゅつされるべき
このていどすらぼくには「わかりにくいでっどろっく」なのだから!

と思うのなら、GoやRustを使っておけ。
C#は実用言語であって、一通りすら書けない馬鹿を救済しようとはしていない。


一般的に、ロック周りの難しさは再現性が低い事にある。
偶々同時にアクセスした時にのみバグるので、
初心者の「一度動いたから問題なし」ではバグを取りきれない。
そのコードなら必ず再現する=再現率100%のバグを修正出来ないのはそいつの問題だ。
(881のバグは静的には検出出来ないのかもしれんが、動かせばすぐ分かるし、すぐ修正出来る)

一般的に難しいとされるバグは、データ依存性が有り、特定のデータ組でしかバグらないものだ。
そしてロック周りなら、データ依存性+タイミング、となるので、さらに発見も遅れるし、
見た目動くし、実際99%以上の場合で全く問題ないしで、場所の特定が困難になる。
お前以外はこの前提で話していただろうよ。
0891デフォルトの名無しさん
垢版 |
2022/03/20(日) 10:31:18.90ID:meh5jYAs
>>889
あと881については「Task.Waitの代わりにawaitを使え」とモロクソにドキュメントに書いてある。
(884が指摘してるのはこれだろう)

> タスクを待機するコードは非ブロッキング方式で作成します
> Task が完了するのを待機するための手段として現在のスレッドをブロックすると、
> デッドロックおよびコンテキスト スレッドのブロックが発生するおそれがあり、複雑なエラー処理が必要になることがあります。
> 次の表では、非ブロッキング方式でタスクの待機に対処する方法について説明します。
> これを使う/これは使わない/行う処理
> await/Task.Wait または Task.Result/バックグラウンド タスクの結果の取得
> await Task.WhenAny/Task.WaitAny/任意のタスクの完了の待機
> await Task.WhenAll/Task.WaitAll/すべてのタスクの完了の待機
> await Task.Delay/Thread.Sleep/一定期間の待機
> https://docs.microsoft.com/ja-jp/dotnet/csharp/async

フレームワークには要求されたコードを書く必要があって、好き勝手書いていいわけではない。
ある程度の腕前があるつもりならドキュメントを先に読んだ方が正解だぞ。
(そもそもそんなコード書く必要すらないが)
それ、コンソールアプリなら(コンパイラがフォローしてくれた結果)動くだけの気がするが。
0892デフォルトの名無しさん
垢版 |
2022/03/20(日) 11:59:41.08ID:w4XPcyom
GUIアプリだとWPFとかがメッセージループ回してくれる

コンソールアプリだとメッセージループがないからそもそもの土台が違うだけでしょ
GUI周りの制限とかもないだろうし

もしかしたらメッセージループを自前で回せばasyncとかのデッドロックをコンソールアプリからもできるかもしれん
0894デフォルトの名無しさん
垢版 |
2022/03/20(日) 12:05:49.90ID:1+CNf8az
awaitが使用できないシチュエーションにしてる上に、引数なしのsleep()なんて存在しない上に仮にそれが永久スリープだとして、そういう現象ではないw
非常に自然な使い方なんだよw
またこの例は簡単&再現性100%を挙げただけで、合せ技で再現性低のすごい分かりにくいバグ(終わらないスレッド)を混入させられるw
そしてその自然な使い方がNGであることがドキュメンテーションされていないとは一言も言ってないw
モデルが悪いと言っているw
だからお前はバカだと言われるんだよw
0895デフォルトの名無しさん
垢版 |
2022/03/20(日) 12:08:13.64ID:1+CNf8az
>>892
書いたとおり、SynchronizedContextにより、await後のスレッドが何になるか?って話だ
コンソールとGUIで違う
0899デフォルトの名無しさん
垢版 |
2022/03/20(日) 12:36:36.62ID:meh5jYAs
>>894
まあとにかく君にはGoやRustがいいと思うよ。
どんなかきかたをしてもこんぱいるがとおりさえすればぼくのあぷりけーしょんにはばぐがないことをほしょうしてくれないといや!なんだろ。


既に言ったとおり、
フレームワークは一般的に「こう書け」と要求してるとおりに書かないと誤作動する。
async/awaitにてTask.Waitを使うなとはドキュメントに書いてあり、一般的にはそれで十分だ。
そもそもasync/awaitは細かく動作タイミングを指定する為の物ではないので、通常はそんなことしないし。


>>892
一応SynchronizationContextを弄くれば、
メッセージループやasync/awaitでのスレッドプールでの動作とかも変更出来るらしい。(override)
> https://devblogs.microsoft.com/dotnet/configureawait-faq/
ただ普通は必要ないからしないと思うが。
Forms/WPF/WinRTで異なるとは書いてある。
コンソールでどうなのかは知らんが、881のコードでも動くモデルが差し込んであるのだろう。
ただそれは間違ってるコードが偶々動いてるだけの気がするが。
0900デフォルトの名無しさん
垢版 |
2022/03/20(日) 12:44:20.26ID:1+CNf8az
ここまで書いてやってもまだ理解できてないのか・・・
await後に元のスレッドで再開するのがGUI用のSynchronizationContext w
だから、Task.Waitを同期的にやると同じスレッドなのでデッドロックする
GUIだとUIスレッドでawaitしたら復帰したときに同じUIスレッドで処理したいからそうする
コンソールだとそういう縛りがないから、await後は別のスレッドになる可能性がある(典型的には使用中なら別のスレッド)w
それだけw
こんなこと言われないと分からないのなら、お前はC#を「使えていない」w
0901デフォルトの名無しさん
垢版 |
2022/03/20(日) 12:49:33.87ID:D3rJhAId
馬鹿はなぜ周りから馬鹿扱いされているか気が付かないからバカなんだ
周りが馬鹿なんじゃなくて本質的に理解してないでデッドロックがどうこう書いてくる
0902デフォルトの名無しさん
垢版 |
2022/03/20(日) 12:50:34.94ID:D3rJhAId
周りが馬鹿なんじゃなくて本質的に理解してないでデッドロックがどうこう書いてくる人間が馬鹿
0903デフォルトの名無しさん
垢版 |
2022/03/20(日) 12:56:56.16ID:1+CNf8az
ぼくちゃんたちには難しくて分からなかったかもねw
ぼくちゃんたちの頭が悪いのまで俺のせいにされても困るw
0904デフォルトの名無しさん
垢版 |
2022/03/20(日) 13:06:31.37ID:D3rJhAId
C#とWPF使うとデッドロックが起こる!簡単には使えない!

GoとRustでCUIでやればデッドロックが起こらない!簡単だ!

↑馬鹿すぎますよね?
0905デフォルトの名無しさん
垢版 |
2022/03/20(日) 13:09:30.45ID:1+CNf8az
バカの自己紹介ほどツマラナイものはないなw
.NETは玉石混交の継ぎ接ぎだらけでモデルが悪いと言ってるだけなんだがw
0906デフォルトの名無しさん
垢版 |
2022/03/20(日) 13:11:24.97ID:D3rJhAId
この人がスゲー馬鹿なのは同意してくれないの?

876 名前:デフォルトの名無しさん[sage] 投稿日:2022/03/19(土) 00:33:29.03 ID:DslNhsx1 [1/4]
C#とGoとRustならGoでいいと思うけど…一番ラクじゃん
C#なんてTask.Delay()の代わりにThread.Sleep()使うだけで簡単にデッドロックするよw
0908デフォルトの名無しさん
垢版 |
2022/03/20(日) 13:25:26.04ID:meh5jYAs
>>900
それで君がC#を使えている事にもならないとは思うがな。


プログラミング言語は一般的に「正しく書けば正しく動く」であって、
「間違った使い方をした時にもそれなりに動く」事は期待されてない。
これが707で言った「自分の足を撃てるか」で、C#については、

> You forget precisely how to use the .NET interface and shoot yourself in the foot. You sue Microsoft for damages.

となっているが、君はまんまこれではないか。真っ当なら、

× 俺はSynchronizationContextの中身まで熟知しており、Task.Waitをコンソールアプリで使ってもフリーズしないと知っている。だから使う。
○ MSが「async/awaitではTask.Waitは使うな」と言ってるから、使わない。

だと思うが。
0909デフォルトの名無しさん
垢版 |
2022/03/20(日) 13:39:56.48ID:1+CNf8az
アホだなw
じゃあUIイベントをasyncメソッドで受けてawaitしてからUI処理すんなよw
俺が言ったこと(await後のスレッドの話)はC#使えるやつなら基礎として知ってることなんだよw
知ってないとawaitしてUI処理できんからw
逆にTask.Waitがスレッドをロックしてしまうブロック処理かどうかはよく読まないと知らないことw
でも有名な話だからまともにC#使える人なら皆知っているけどねw
特定の状況でしか必要にならないから、await後でデッドロックすることがある、ということしか知らず、へぇ〜コレか〜という形になる人が稀にいる程度w
なので、
○ 俺はGUIアプリでawait後に元のスレッドで継続することと、コンソールアプリでは別スレッドになることがあることを知っており、だからC#を使える
× 俺はMSが「async/awaitではTask.Waitは使うな」と書いてあることを知っており、だからC#を使える
ってことだw
0910デフォルトの名無しさん
垢版 |
2022/03/20(日) 14:07:36.11ID:meh5jYAs
>>909
そうじゃない。

何度も言ってるが、フレームワークはフレームワーク製作者が要求したとおりのコードじゃないと駄目なんだ。
これはどのフレームワークでもそう。
MSが「async/awaitではTask.Waitは使うな」と言ってるのだから、これに従う限り、
Task.Waitを混ぜた時の動作については知る必要はない、というのが一般論。

フレームワークにデタラメなコード(=製作者が予期してないコード)を食わせたらどうなるか、を把握する為には、
フレームワークの中身まで知る必要がある。
一々こんな事をしてたら生産性なんて上がらないし、正しく使っている限り必要ないから、
一般的にはこれは要求されない。
だからお前の考え方は根本的にずれてるよ。

例えばHTML、これはWeb系に於いての暗黙のフレームワークHTML/CSS/JavaScriptの一角を担ってるわけだが、
実はデタラメなHTMLでもブラウザはそれなりには表示してしまう。
だからといって、「デタラメなHTMLを食わせた時にどう動くかを把握して、デタラメなHTMLを書いてもいい」とはならんし、
「デタラメなHTMLを食わせた時の各ブラウザの挙動を把握してこそWebを『使える』と言える」ともならんだろ。
「正しいHTMLを書け」で終わりだ。


ただまあこれはもう平行線だし、これについての俺の主張は上記だから、これで終わりでいい。
C#のモデルが悪いというのなら、
「MSが正しい使い方だと認めるコードでも容易にデッドロックが発生する事例」を持ってくるべきだ。
間違ったコードでフリーズしたところで、あっそう、でしかない。
一般的にはそんなのを書く奴が悪いとされるし、C#でも実際そうだと思うよ。
0911デフォルトの名無しさん
垢版 |
2022/03/20(日) 14:19:36.23ID:1+CNf8az
お前が頓珍漢な主張を繰り返しているだけだろw
仕様通りの使い方が出来ているかどうかという話をしておらず、その仕様の出来が良いか悪いかの話をしているんだろうにw
理由はそういうスレだからw
俺はそういう話をするために事例を出し、.NETのモデルの悪さを指摘したw
ただ、その原因すらお前が理解していないようだから、一般常識レベルの説明をしただけだw
一応言っておくが、俺は使用するAPIはドキュメントを全て読んでから使用しているw
でもそんな話は今していないんだw お前が言ってることが周回遅れすぎてるだけw
というかC#すら分かっておらず、当該言語もよく知らない上にスレの主旨も理解できてないなら口出してくんなw
0912デフォルトの名無しさん
垢版 |
2022/03/20(日) 14:26:39.18ID:AzzPxPqt
デッドロックの話ならGoなんてチャネルの扱いを間違えたら簡単にデッドロックするでしょ
C#もGoも両方プロダクションでそれなりに使い込んでるけど、感覚的にはGoの方が遥かにデッドロックを起こしやすいよ
0913デフォルトの名無しさん
垢版 |
2022/03/20(日) 14:35:25.89ID:meh5jYAs
>>911
> その仕様の出来が良いか悪いか
フレームワークは『使い方』も含めて仕様なんだよ。


>>912
Goはチャネルの使い方を間違えればすぐデッドロックする。
(だからRust信者かな?とも思うのだけど)

ただしGoの出来が悪いわけではなく、
単に、「何であれ、スレッド間の同期を取ろうとするとデッドロックしやすい」ので、
C#ではasync/awaitでユーザーが同期周りを一切書かなくて済むようにしただけで、
自分で書けばGoと同程度にデッドロックするとも思うよ。
0915デフォルトの名無しさん
垢版 |
2022/03/20(日) 14:50:44.84ID:oojzEd61
なるほどね
・チャネルを使わない
・ロックを使う場合のロック順序は守る
という制限があっても簡単にデッドロックが起きてしまうのがC#という結論かな
0916デフォルトの名無しさん
垢版 |
2022/03/20(日) 14:59:33.25ID:Su88XcRk
>>914
その回答を見てもわかるように
RustではMutexなどのロックはそのブロックを抜けると自動的に解除されます
だからその質問のプログラムがそのロックしたブロックを完了していないというバグだということが今回の例でもすぐわかるわけです
0917デフォルトの名無しさん
垢版 |
2022/03/20(日) 15:03:54.72ID:1+CNf8az
channelでデッドロックするのはよほど使い方悪いだけだろw
プロダクトでそれはありえないw
channelを使わずにmutex使うとかバカとしか言いようがないw
mutexなどの同期リソースを手動で使う場合は、どんな言語でも細心の注意を払わないとデッドロックなどのバグが発生するw
goのchannelはgo固有w
IPCの接続をsocketと呼ばずにchannelと呼ぶフレームはあるけどねw
0918デフォルトの名無しさん
垢版 |
2022/03/20(日) 15:07:57.75ID:1+CNf8az
まあでも並列動作で一番厄介なのはMutexを使わずにatomic readを期待しちゃった系読み書きのバグかなw
0919デフォルトの名無しさん
垢版 |
2022/03/20(日) 15:13:13.79ID:59buMwU+
デッドロック起きないことを保証できたらまさに次世代言語って感じがするな
そんな言語あるのかは知らんが
0920デフォルトの名無しさん
垢版 |
2022/03/20(日) 15:20:14.57ID:1+CNf8az
非同期プログラミング(async/awaitなど)は正にその辺を狙った技術だよw
非同期処理完了の戻り値としてデータ授受をすることで複数スレッドからのデータアクセスの同期処理をなくしやすくしているw
保証するものじゃないし、する必要もないけどw
0921デフォルトの名無しさん
垢版 |
2022/03/20(日) 15:24:25.24ID:BxWAUZWU
>>917
> channelを使わずにmutex使うとかバカとしか言いようがないw

それは失言です
データ読み書き競合をchannelで防ぐことは出来ません
mutexなどのロックが必要となります
0922デフォルトの名無しさん
垢版 |
2022/03/20(日) 15:28:04.92ID:w4XPcyom
lock要求された順番を検証して、
順序にループがあればlock要求時にthrowする仕組みは作れそう

lock/unlockのたびに全threadのlock状況を検証する必要があるからパフォーマンスがお察しになるが
0923デフォルトの名無しさん
垢版 |
2022/03/20(日) 15:39:08.57ID:meh5jYAs
>>915
どの言語でも、間違った使い方をすればデッドロックはする。

(Task.Waitなどを使うという、明らかに間違った事をせず、)
async/awaitだけで(ジョブ間に依存性がないように)書けばデッドロックしない。
これはC#でもJSでも他言語でも同じのはずだけど。

ID:1+CNf8az だけが
まちがったつかいかたもできるし、それがぼくにとってはわかりにくいからもんだいだ!!!
と言ってるだけ。
0924デフォルトの名無しさん
垢版 |
2022/03/20(日) 15:39:50.43ID:1+CNf8az
>>921
何を言ってるの????
共有データを作らないためのchannelではないの?
channelだけではどうしても無理な場合だけmutex使って共有データにアクセスするだけだろw
まずは例を出せw
0925デフォルトの名無しさん
垢版 |
2022/03/20(日) 15:42:03.81ID:1+CNf8az
>>923
お前がお味噌なだけw
俺も含め誰もそんな話はしてないw お前が無知だっただけで僻むなw
0926デフォルトの名無しさん
垢版 |
2022/03/20(日) 15:45:30.35ID:1+CNf8az
>>922
function method1() { lock(objA) { lock(objB) {
処理;
}}}
function method2() { lock(objB) { lock(objA) {
処理;
}}}
みたいなmethod1とmethod2が別のスレッドで同時に動いたときにデッドロックする
0927デフォルトの名無しさん
垢版 |
2022/03/20(日) 16:07:28.81ID:KN3blaKP
>>926
バカなのか?
そのコードは皆が共通して言ってることすら守れていない

>>915
> ・ロックを使う場合のロック順序は守る

>>922
> lock要求された順番を検証
0932デフォルトの名無しさん
垢版 |
2022/03/20(日) 18:10:14.51ID:1+CNf8az
別にGCじゃなくても検出はできるよw ただのバグだから余計なコストがかかる処理を入れてないだけでw
0933デフォルトの名無しさん
垢版 |
2022/03/20(日) 18:40:40.29ID:ED0sGA+M
毎度毎度、c#もあんまり詳しくないよねこの人。
Rustは俺はわからんのだけど、c#とgoの話だとこの人が言ってんのは重箱の隅をつついて「これが大問題であるっ!!」って騒いでるような感じ。
まあGoでコンパイラ書いたらGCから逃れられないみたいなアホも居たわけだからアレなんだけど。
0934デフォルトの名無しさん
垢版 |
2022/03/20(日) 18:48:20.78ID:OVL9TeC6
>>933
GC言語はどうしてもそれ故の種々の制限があるからしょうがない
もちろんGC言語はその代わりに有利な面もある
そこへGC言語でないRustが初めてGC言語と対等に比較可能な存在として登場した
しかもGCのない有利さを保ったままで
0935デフォルトの名無しさん
垢版 |
2022/03/20(日) 18:57:31.06ID:3v4+I3Ge
この人rustスレではc++に比べてrustはクソと
同じように知ったかぶりでトンチンカンな叩き
してるからまあこういうことやるのが目的なんだろ
0936デフォルトの名無しさん
垢版 |
2022/03/20(日) 18:57:43.35ID:eHF+L46q
> そこへGC言語でないRustが初めてGC言語と対等に比較可能な存在として登場した

SwiftにもGCは無いよね
ARC(Automatic Reference Counting)でやりくりするんよね
Swift使っこと無いし完全に俺はニワカだけど
0938デフォルトの名無しさん
垢版 |
2022/03/20(日) 19:16:00.62ID:NhMlqBrF
>>936
C++とRustでも所有権を共有する時だけはARCと同じ方法を使っている
しかしC++とRustはそういう特殊なケースでのみ使用だからGC言語とは言われない
一方でSwiftは常にインスタンスに対してARCでメモリ管理をするため非常に重く効率が悪い
そしてARCが常に行われるということは参照カウント方式のGCそのものである
そのためSwiftは非GC言語とは言い難い
0939デフォルトの名無しさん
垢版 |
2022/03/20(日) 19:21:33.37ID:x160hDIc
>>937
そのGo製コンパイラ自体はGCランタイムを含むしGCを起こすよ
他にもGoで記述して例えばWebAssemblyをブラウザ上で動かそうとすると
当然GCを含むGoの巨大なランタイムがWASM上でそのまま必要となるため
Goを使うと巨大で重くて遅い
0940デフォルトの名無しさん
垢版 |
2022/03/20(日) 19:50:10.66ID:eHF+L46q
> そのためSwiftは非GC言語とは言い難い

https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html
> In systems that use garbage collection, (略).
> However, with ARC, (略).

ここでは「ガベージコレクションを使用するシステム」と「ARC」を対比させてるっぽいね
あと個人的にもやっぱりスマートポインタの一種でしか無いように見える
RustのRcといっしょ
循環参照はプログラマが頑張ってweak使ってなんとかしてね、ってのも
ただおっしゃるとおりRustはRcを全部に使うわけじゃあないからまた雰囲気も違うのは確か
0941デフォルトの名無しさん
垢版 |
2022/03/20(日) 22:21:15.61ID:RXl78SgQ
C++のshared_ptrやRustのRcは必要不可欠な最小限でしか用いないから必須なコストを払っているだけと言えるが
SwiftのARCは全てのインスタンスに適用されるから無駄なコストを浪費しているとしか言いようがない
0942デフォルトの名無しさん
垢版 |
2022/03/20(日) 23:09:41.16ID:1+CNf8az
>>933
実際大問題だっつーのw
C#の非同期系の諸問題は大抵これが原因w
ごく稀にスレッド間の同期(排他制御)が不足してる競合が原因のがあるって感じ
お前こそC#使った開発とか本当にしたことあるのか?w
0944デフォルトの名無しさん
垢版 |
2022/03/20(日) 23:38:33.20ID:gQLNPKUR
なんかそういうデータあるんですか?
0947デフォルトの名無しさん
垢版 |
2022/03/21(月) 00:04:44.37ID:BAdp3agq
>>946
仕事で作った数人x半年レベルのWindowsアプリ(製品)の話だよw
全然違う分野のだけど、C#は1.xと2.0と4.6?で作ったかなw
なので俺の問題ではないw 全員C#の練度はお前よりは上だったけどw
0948デフォルトの名無しさん
垢版 |
2022/03/21(月) 00:15:23.07ID:g32P+Ld/
>>939
そんな話はしてないが。

>>942
GUIじゃない部分で不用意にTaskを処理しようとすると死にがちよね。
コピペで毎回FireAndForget持って来て慎重に使ってるわw
ID:1+CNf8azの事ではないよ、ごめん。
0949デフォルトの名無しさん
垢版 |
2022/03/21(月) 00:31:38.49ID:IPXTt6Bp
>>947-948
ならそれはお前らの技量が足りなかっただけだ。
そもそもデッドロックするかどうかは言語関係ないだろ。

新旧の仕様を混ぜて使えるようになってるのが落とし穴だ、というのなら、
それはそうかもしれんが、C#としてはそこをすぐに塞ぐのは無理だ。
それでRust使えば全く問題ない!と思うのならガンガン使ってみればいいだけ。
そんな単純な話ではないと思うけどね。
0950デフォルトの名無しさん
垢版 |
2022/03/21(月) 00:58:46.04ID:BAdp3agq
>>949
俺は助っ人で行っただけだからなw
現象はデッドロックだけではないし、まあお前には想像もできないし、遭遇しても解決できないから安心しろw
そして何度でも言うが、彼らはお前よりはC#についての知見が遥かに多かったよw
デッドロックの話にピンと来ないC#erは初めて見たし、await後のスレッドの話、GUIにおけるUIスレッドの役割に対する見解の話、全ての話において、お前は最低限C#技術者に必要な知見を有していないw
0951デフォルトの名無しさん
垢版 |
2022/03/21(月) 08:32:36.49ID:t8rbivUy
小学生ですがみなさんの情報たいへんおもしろいです
でもどうして大人のひとってけんかばかりしてるのですか?
0952デフォルトの名無しさん
垢版 |
2022/03/21(月) 08:45:38.05ID:BAdp3agq
こんなところに来る小学生はあんまり小学生とか言わないで使いそうだけどなw
喧嘩なんてしなくて、じゃれ合ってるだけだからだよw
0954デフォルトの名無しさん
垢版 |
2022/03/21(月) 08:56:52.04ID:BAdp3agq
もちろん.NET Frameworkのバージョンだよw C#のバージョンなんて誰も覚えてないだろw
0955デフォルトの名無しさん
垢版 |
2022/03/21(月) 09:13:23.58ID:IPXTt6Bp
>>950
それはやり方を間違ってるからおかしな事になってるだけ。
例えて言うなら、舗装道路が用意されてるのにイキって荒地を走行してパンクしてるようなもの。
天の邪鬼も自由だが、それでフレームワークや言語のせいにするのは違う。
0956デフォルトの名無しさん
垢版 |
2022/03/21(月) 09:56:39.42ID:+0SCi87t
結局程度の低いプログラマーがC#が悪い!って言ってるだけだろ?
話を見てるだけでも.netのフレームワークも別に悪くない

C++で文字コードの扱いが悪いと言うならわかるけど…
0957デフォルトの名無しさん
垢版 |
2022/03/21(月) 09:57:03.43ID:BAdp3agq
お前まだいたの?w ここでの話は
・.NETのモデルは出来が悪い
・お前C#erに必要な最低限の知見がない
これだけだし結論出てんだよw
0958デフォルトの名無しさん
垢版 |
2022/03/21(月) 10:08:50.17ID:bf5EvDSb
>>957
C#erって言葉を使ってるだけで相手を見下してるよね

Rustで同じ状況じゃ競合が起きないとかいうならわかるけどそういう話でもないし
あなたが勝手に出来が悪いと言ってるようにしか見えないんだから
出された例も馬鹿らしくて.NETのモデルも別に悪くないと思う

誰もあなたに同意できない
それだけの技量があなたにはない

他人を見下したり自分が悪いと思える謙虚さがないと低級プログラマにしかなれない

いい加減に静かにしてもらえないかな
それかどこか別に行ってやるか
0959デフォルトの名無しさん
垢版 |
2022/03/21(月) 10:12:21.44ID:bf5EvDSb
デッドロックに対応できないのは言語やフレームワークのせいじゃないだろ

実際にモデルが悪いのはそっちの設計の方だろ?
0960デフォルトの名無しさん
垢版 |
2022/03/21(月) 10:38:31.66ID:BAdp3agq
まだ言ってるしwwwww
普通にTaskをwaitするのがawaitなのにTask.Waitって名前でデッドロックする仕様はモデルが悪いとしか言いようがないだろwwww
0961デフォルトの名無しさん
垢版 |
2022/03/21(月) 10:39:34.38ID:BAdp3agq
謙虚さとかプログラマには要らないからw
色眼鏡かけてなければ問題ないよw
0964デフォルトの名無しさん
垢版 |
2022/03/21(月) 12:07:23.76ID:BAdp3agq
色眼鏡かけてるのはお前だけだよw
公平に見るために謙虚さはむしろ要らないw
謙虚にすると周囲に合わせることになり、自分の意見が100%反映されなくなるw
迎合してエコーチェンバーの一部になると、色眼鏡をかけることになり、公平な判断は出来なくなるw

不具合出したわけではなく、.NETのモデルが悪いだけw 日本語不自由なんだねw
0965デフォルトの名無しさん
垢版 |
2022/03/21(月) 12:20:03.99ID:9hJO1ac5
Tas.Waitでデッドロックする条件分かってんだからライブラリ側で例外投げてくれよとは思うが

1ライブラリのクソ要素を根拠に言語自体をクソと言い張る思考には感心するよ
0966デフォルトの名無しさん
垢版 |
2022/03/21(月) 12:38:23.15ID:BAdp3agq
C#をクソと言ったことはないぞw 日本語不自由さには事欠かないねw
マルチスレッド同期機構と非同期処理を言語で比較する話で、やれデッドロックがどうのと言っており、かつC#が良いという結論を出していたので、>>876で.NET Frameworkのモデルの悪さを指摘し、goでいいのでは?と言っただけだろうにw
話を続けた結果、彼は案の定デッドロックの話を把握しておらず、Task機構についても誤解しており、await後のスレッドについても知見がなかったので、彼の知見は一般のC#erに劣るという結論を出しただけw
0967デフォルトの名無しさん
垢版 |
2022/03/21(月) 14:48:44.25ID:bf5EvDSb
いい加減に辞めたら?

それを持ってライブラリのモデルが悪いと言うのは変じゃないか
あなたの主張が誰一人説得できないのはあなたの問題であってスレの住人の問題じゃない
0968デフォルトの名無しさん
垢版 |
2022/03/21(月) 14:55:29.99ID:+0SCi87t
次スレでも不毛な話が続く予感

と言うか最初からこのスレは不毛地帯だった
0969デフォルトの名無しさん
垢版 |
2022/03/21(月) 18:06:00.78ID:BAdp3agq
こんなに分かりやすいモデルの悪さを納得できないとか、お前がプログラマ向いてないだけwwww
0972デフォルトの名無しさん
垢版 |
2022/03/21(月) 22:18:23.01ID:IPXTt6Bp
>>966
まあ君は「ぼくはわるくない!まわりがわるいんだ!」のタイプで、一生間違いを認めないんだろうけどさ。

C#はasync/awaitの導入で、『正しく使えば』、同期周りをユーザーが全く書く必要がなくなった。
結果、『意図的に間違えるような事をしなければ』、デッドロックはしなくなった。
そして見た目はほぼ同期であり、素晴らしく分かりやすかったので、他も追従した。
(だから他言語でもasync/awaitを『正しく』使ってる限りデッドロックはしないはず)

『正しく使えば』『意図的に間違えるような事をしなければ』なんて一々言わずともまともな人には大前提だし、
そもそもフレームワークは規定通り使わないとまともに動かない。
君がイカレてるから君の周りも同様の人しか居らず、自分達が掘った墓穴に落ちて大騒ぎしてただけだと思うぞ。
(「正しく使おう」とか、君は考えた事ないだろ)

とはいえ、平行線だし、合意を取る必要はないので、まあこれで終わりだね。
0973デフォルトの名無しさん
垢版 |
2022/03/21(月) 22:18:46.22ID:IPXTt6Bp
ちなRustの所有権とか見直してみたが、
以前読んだ時よりは大分文面が修正されてるのか、マシな印象だが、
いずれにしてもゴミなのは事実だね。RustはC++の出来損ないになってる。
一番の問題は、所有権でライフタイム管理を「入れ子」ではなく「投げ捨て」型にした事であり、
これで余分に手間が増えてしまってる。
「入れ子」の方が自然なので殆どの言語で採用されており、
問題は「入れ子」にならない場合にどうするかだが、

C:全部プログラマが管理しろ
C++:スマポ入荷しました
Rust:スマポと所有権(投げ捨て型)

なら、全く進歩してない。
必要なのはスマポに変わる何かであり、Rustは何ら役に立つ新規提案がない。
基本的にC++の構成をなぞっただけであり、おかしな補助輪を付けてしまってるので、
C++で苦労してない人にとってはC++の方がマシだろう。
それで改善点がメモリリークしなくなった程度では、流行りようがないよ。
(そもそもC++も『正しく使えば』メモリリークはしない。
君の視点だと文法的に問題がない=コンパイルが通る=正しく使う、なのだろうし、
実際こう出来ればいいのも確かだが、現状のプログラミング言語の大半はこうなってない。
これは一概に悪いというわけでもなく、プログラミングスタイルに自由度を与える為には必要でもある。
文法エラー=新しいスタイルを試しようがない=進歩しない言語、という事になるので)
0974デフォルトの名無しさん
垢版 |
2022/03/21(月) 22:34:35.67ID:uhwdA/oK
記述や理解が楽になる言語、ってわけじゃなくて、そもそも安全で高性能な言語であることが前提の言語だし、別にRustはメモリリークは解決してない
手間が少なく、安全である必要もないなら、Rustを使う必要性は薄れる
0977デフォルトの名無しさん
垢版 |
2022/03/21(月) 23:25:18.39ID:IPXTt6Bp
>>974,976
「GC無しで!!!」と謳ってたから「メモリリーク無し」は当然だと思ってたのだが違うのか?
(なお見てるのは主に公式勝手訳日本語版。そこすら全部読んでもないので)

> 手間を少なくしたくて、安全である必要もないなら
手間は少なくなってない気もするが。
安全って型安全の事?なら俺は型無しでもまあいいや程度なので、
確かに俺には意味がない言語なんだろう。
(型があっても困らないが、
C++みたいに関数ポインタを常用しようとするとテンプレートを書きまくらなくてはいけなくなるのは困る。
この点、関数型やスクリプト言語がどれもこれも型無しなのは非常に納得)

見た目Rustは、C++をある特定の使い方(と言っても多分本流本筋だが)に特化しただけのように見える。
だからそのプログラミングスタイルだった人には素晴らしく嵌るのだろうけど。
0978デフォルトの名無しさん
垢版 |
2022/03/21(月) 23:37:51.67ID:5Szv6JZQ
>>973
あまりにもデタラメすぎてむしろ苦笑
理解できなかったこと自体は仕方がないが
それにも関わらず他の言語をデタラメに叩くのはまともな人がすることではない

あまりにも間違いが多すぎて指摘しきれないが
例えば所有権はC++のスマートポインタ(unique_ptr/shared_ptr)で導入された概念
それなのになぜかC++にはスマポと書きながら所有権がなくRustのみに所有権と書いている
まずこの時点でC++の所有権とスマートポインタからして理解が出来ていない
さらにその後のRustに関することは妄想だらけになってしまっている
0980デフォルトの名無しさん
垢版 |
2022/03/21(月) 23:51:09.41ID:Juhg7nIl
>>973
貴方がC#に関して戦っている相手ID:BAdp3agq (>>966など)も同じくRustのアンチでRust関係スレで暴れているが
貴方は同じRustのアンチでもダメな彼より劣る
貴方は他の言語の知識も薄くRustについては何も理解しないまま嘘を書いている
0981デフォルトの名無しさん
垢版 |
2022/03/21(月) 23:54:59.16ID:IPXTt6Bp
>>978
書き方が悪かったかもしれんが、
ブロックスコープで済み、それが最適な場所にすら所有権を強制して、
結果的に無駄に借用とかする羽目になってるのは事実だろ。

問題は、プログラミングでは大半の場合で「入れ子」が最適な事。
「投げ捨て」が向いてるのは、上から下に流れて終わり、のようなプログラムで、
サーバーは確かにそうだが。
0982デフォルトの名無しさん
垢版 |
2022/03/21(月) 23:58:58.49ID:uhwdA/oK
あの子みたいにまともに議論する気がないのはお話にもならないけど、
知識が足りないのはまあしょうがないやろ

全部わかってるひとなんてこんなスレには1人もいないだろうし

>>977
伝わらなかったみたいだけど、そうそう、Rustは手間を少なくする言語でもないよ

データ競合なくして型も省略しまくりたい、みたいなのだったらHaskellみたいに型推論がやたら強い言語とかもあるし
0984デフォルトの名無しさん
垢版 |
2022/03/22(火) 00:10:38.80ID:5pgpy3FW
>>981
他の言語を批判したいなら、せめてもう少しは勉強したほうがいいよ
その意味不明な文章は理解不足が引き起こしている
もしどうしてもRustについて理解できないのならば、先にC++のunique_ptrを学んで所有権とは何かを理解すべき
あと他の人たちも指摘しているが「入れ子」や「投げ捨て」が意味不明
0985デフォルトの名無しさん
垢版 |
2022/03/22(火) 00:14:23.89ID:JFwrpdmf
>>982
なら何を目指してんのよ?
他に謳ってたのは「ゼロコスト抽象化」だが。

公式勝手訳日本語版まえがき、には
> 既に低レベルコードに取り組んでいるプログラマは、Rustを使用してさらなる高みを目指せます。
> 例えば、 Rustで並列性を導入することは、比較的低リスクです: コンパイラが伝統的なミスを捕捉してくれるのです。
一文目は素晴らしい。
が、二文目は、無いよりまし程度だし、そもそも無駄に手間が増えてる部分もあるから意味なくね?
0986デフォルトの名無しさん
垢版 |
2022/03/22(火) 00:14:49.50ID:5pgpy3FW
>>982
Rustを使うことで様々な手間が省けるのは事実
もちろん元の言語が何であるかによって、どんな手間が省けるようになるのか変わる
だから手間が省ける議論に関しては、比較対象を毎回固定しないと一般的な議論は無意味
0987デフォルトの名無しさん
垢版 |
2022/03/22(火) 00:23:48.60ID:RldJWe6f
>>985
色んな言語やればわかるが
その並列性に関してはRustがベストで間違いない
データ競合が起きないことをRustは保証する
言いがかりをつけているだけの君の負けだ
0989デフォルトの名無しさん
垢版 |
2022/03/22(火) 00:37:24.63ID:TacRn98V
Rustの利点はプログラミングがしやすいことに尽きるかな
とにかく書きやすくて全体の効率がいい
自分にとっては安全とか保証とかはオマケで付いてくる位置付け
0990デフォルトの名無しさん
垢版 |
2022/03/22(火) 01:10:05.14ID:JFwrpdmf
>>987
それについてはさんざん言ってきたが、同様に前書きには
> 伝統的にこの分野は難解で、年月をかけて
> やっかいな落とし穴を回避する術を --- (A)
> 習得した選ばれし者にだけ可能と見なされています。
> そのように鍛錬を積んだ者でさえ注意が必要で、 --- (B)
これも事実だが、逆に(A)が存在するのも事実なんだよ。
ただ、(B)も事実だから、やってくれる事に越した事はないが、
それでも「全部完璧にやってくれる」のでなければ丸投げは出来ない。
具体的に言えば、GCならメモリ管理一切しなくて済むけど、そういうわけでもないし、
並列時のロックや競合も完璧にはやってくれない(だろう)から、手間自体は大して減らないよ。

例えば(A)だけどさ、
> データ競合が起きないことをRustは保証する
実際Rustがどこまで検出出来るのか知らんが、データ競合を回避したいのなら、
そもそもディスパッチ前に全部解決してしまう
(共有部分に書き込み出来るのはメインスレッドだけにする、
ディスパッチ以降は不変、無理ならディープコピーを渡す)のがセオリーで、
この形式でメインスレッドからサブスレッドをこき使うのがC#のasync/awaitの形であり、
こう「正しく使えば」全く問題ないわけ。(上位構造で問題を解決する)
このセオリーを知らない=『術を習得もしてないし選ばれてもない者』にはRustは役に立つかもしれんけど、それは、
> Rustを使用してさらなる高みを目指せます。
なら、嘘だね、という話だよ。術を修得してれば同じ事は既に出来てる。

だから何度も言ってるように、
Rustが得意(らしい)、細かく共有しないと無理か、爆速になるアプリは何?
(セオリー通りに構成した時に性能が出ないアプリは何?)
と聞いてきてたわけ。

馬鹿向けの杖ならいらねえ、な奴はいくらでもいるでしょ。
(俺が賢いというのではなく、ノウハウは既に溜まってるという意味で)
0991デフォルトの名無しさん
垢版 |
2022/03/22(火) 01:12:15.32ID:pDa7kf85
>>985
Rustは性能、メモリ安全性、安全な並行性を目指して設計されているシステムプログラミング言語です
結果としてベアメタル環境でも利用可能です

>>986
そうっすね、同意するし、こだわりたい話でもないのでどうでもいいけど一応今回の手間に関しては >973 の文脈だよ
0992デフォルトの名無しさん
垢版 |
2022/03/22(火) 01:29:51.72ID:vkqcnRJV
>>990
C#の人かね
それならば習得すればRustの方が圧倒的に楽
後発言語なだけあって既存言語の問題点を解決しつつ良いところを洗練して採り入れてることが習得するとよくわかる
0993デフォルトの名無しさん
垢版 |
2022/03/22(火) 01:38:14.59ID:JFwrpdmf
>>991
> 結果としてベアメタル環境でも利用可能です
ちなみに、以下の

> Rustの非同期プログラミングで出来るようになること
> 組み込み
> https://tech-blog.optim.co.jp/entry/2019/11/08/163000
この「組み込み」は面白いと思ったよ。(妄想らしいが)
見た目ポーリングにしか見えない点が問題だが。(慣れかもしれんが)
0994デフォルトの名無しさん
垢版 |
2022/03/22(火) 02:21:54.43ID:q+lZbjeY
データ競合なんて言葉を使うから議論がかみ合わないのであって
例えばgolangでforループで逐次処理してた部分をgoroutine使って並列動作するよう修正したときに
うっかりループカウンタをgoroutine内でそのまま使ってしまって意図通り動かなくなったりすることがある
普通はテストなりで検出できるけど、条件が込み入ってくると検出するのが難しいバグの原因になるかもしれない
rustの場合こういったうっかりをコンパイル時にできるだけ検出できるように言語仕様が考えられている

rustを使えばあらゆるミスを検出できるわけではないけど、うっかりの入り込む余地を減らせるだけでも嬉しい人はいるだろう
逆にそんなうっかりはしないから好きに書かせてくれよという人もいるかもしれない

それぞれの考えに合った言語を選べば良い、と言ってしまうこのスレのテーマの否定になってしまうか
0995デフォルトの名無しさん
垢版 |
2022/03/22(火) 02:41:35.79ID:w7t1sqYz
>>991
その>>973を見てみたが意味不明すぎる

>C:全部プログラマが管理しろ
>C++:スマポ入荷しました
>Rust:スマポと所有権(投げ捨て型)

C++が所有権を導入したことがunique_ptrとshared_ptrのスマポであるのに
なぜかスマポと所有権が別扱いになっている
さらに所有権が初めてRustで登場するのもおかしい
『投げ捨て型』に至っては何のことやら意味不明
C++もRustも理解していない人が妄想で批判しているようだが
0996デフォルトの名無しさん
垢版 |
2022/03/22(火) 02:59:56.03ID:ZDHdo9X7
>>972
.NETのモデルの悪さを指摘されてそれを認められないのはお前だろwwwww
俺はそれ以外の話をしてないんだよw 向いてないよマジでw
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 113日 11時間 15分 5秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

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