次世代言語23 Go Nim Rust Swift Kotlin TypeScript
レス数が1000を超えています。これ以上書き込みはできません。
スレタイ以外の言語もok
前スレ
次世代言語22 Go Nim Rust Swift Kotlin TypeScript
https://mevius.5ch.net/test/read.cgi/tech/1629590343/ ▼スレタイ言語ランキング
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〜) >>3
泡沫言語だけどわりと海外のossで使われてるの見るよ
NimやVなんかより有望だと思う IT業界の状況
プログラミング言語「Rust」のための「Rust Foundation」設立 -- AWS(Amazon)、Microsoft、Google、Mozilla、Huaweiが創設
https://japan.zdnet.com/article/35166267/
Facebookが「Rust Foundation」に参加
https://japan.zdnet.com/article/35170192/ JavaScriptはブラウザが解する言語がそれしかないから人気と言うか使わざるを得ない 単調非増加では?
というのはさておきDart人気なんだね rubyやobjective-cより下の13位から上がるどころか新規のdartに抜かれて14位に落ちてるんだがwwww >>6
TIOBEより納得できる結果だけどDartはなんで伸びたの DartにはFlutterっていうキラーアプリがあるからね
みんなFlutter使いたくてDartを使ってるだけっしょ >>6
> ・Rust
> 過去2年間、他のどの言語よりも急速にユーザー数を伸ばしている。
> Rustを使う開発者は、2019年第3四半期には40万人だったが、2021年第3四半期には110万人に達し、ほぼ3倍に増えた。
すごい勢いで増えているね。 rustは元がゴミすぎて3倍近く増えても順位は上げられずdartに瞬殺されて順位落としてるじゃんwwww visual development toolsって何? Flutterらへんのカテゴリは、システムプログラミングらへんとはユーザ数が桁違いだからな flutterなんて流行り始めてしばらく経つけどほとんど出てきてないし、どの言語もguiのbindingくらい持っているんだが
dartは昔から何かと出てきたけど、flutterで注目されて爆発したイメージ
何にせよrustは元々ゴミで注目された今もゴミということ >>13
やっぱRust凄いな
完全に次世代言語の本命確定か 数だけで優劣が決まるならJSの圧勝だね
Rust理解できない子が、大歓喜するのも仕方がない でも >>6 の データを見ると、SwiftやGoの半分ほどもRust開発者いるの? って思ってしまうなあ
自分の身近が偏ってるだけで、どこかにはRust開発者がたくさんいるんだろうか バックエンドだけでなくフロントエンドもRustで行こうという話も出てる rustで書かなきゃならんほどランタイム速度必要なとこなんてほぼないけどな。
組み込みにはメモリデカすぎだし、数値計算、アルゴリズム分野じゃ共有のめんどくささから使われんし、
本当にごくごく一部しか使い道がない。
ほとんどはファッションでrust理解してる俺すげーーしたいだけのカスユーザーだろ。 現状C++じゃない領域にも適用しようといてるん?
個人的にはエンジニアの底上げになってうれしいけど discodeはバックもフロントもgoからrustに移行したな
遅延がサービス品質に直結してるようなアプリなら移行する価値があるんだろう 逆にフロントエンドだけでなくバックエンドもDartで書こうという話も出てる
書けるようになったから書いてねという発表があった程度だけど Ruby on RailsのクックパッドもバックエンドをRustにしてたな >>25
それはアンチ的視点だからそんな偏った見方になってしまうのであって
現実にはどの分野でもRustに置き換えるとかなり高速化されるか
あるいは旧C/C++分野ではかなり安全化されるのでその両分野からじわじわと話が出てる 実際にはRustほどのパフォーマンスがいらなくても
型が強くてそこそこ速いって選択肢があまりないんだよな
Goくらいの速度でいいとしても、あの言語機能には
耐えられないって場合はRustになってしまう
ランタイムありで良ければJVM系とかC#もいいんだけど C++の巨大プロジェクトは絶対にメモリ関連のバグがたくさんあるからな・・・。 C++とtypescriptやってる人は大抵rustもやってそう
>>25の意見は正しいと思う
rust推しだったけど意味不明な推しが多くて最近はもうgoでいいって思った >>31
それはある
強力な型の扱いや関数型言語に近い性質などが非常にプログラミングしやすくてRustは言語のセンスが良い
高速になるとか安全になるとかはオマケとして付いてきたw Rustはシャローコピーに関する地雷を極めて踏みづらいのはメリットかな NimはRustのような値付きenum及びそのパターンマッチングがないから使えん
Nimだとオブジェクトバリアントが限界で機能不足 どちらもどうでもいいよそんなの趣味の範疇
オマケだというならgoの圧勝で終わり パフォーマンスどうでもよくて、そういう好みなら、ScalaとかHaskellが合うかもね ある意味
Haskellから美味しい部分をもらってきた手続き型言語がRust そうね、Rustはいろいろなシンタックスが用意されててすごいよ
パフォーマンスがどうでもいいなら、borrow checkerとかで安全にしてるRustより、
GCを使いつつ参照透過性を保つHaskellのほうがいろいろ整然とされてて見通しが良い気がする
まあいろいろ好みや、向き不向きとかあるだろうけど >>40
Goの機能不足は誰もが認める合意事項
だからこそGo2作っているわけで Nimも機能少ない方だから、Goでいいじゃんってなりがち
そういう意味ではGo/Rustの次世代って難しいな
GoとRustでシンプルと複雑の限界まで振ってあるから
その中間解を取ってしまうと中途半端になるという goはテンプレート有れば私的には文句ねぇが現今のinterfaceのアプローチと異なる且つ重複する部分が多くきな臭いよね
ただまぁあそこまで洗練されたcoroutine featureは他に見ないしgcの改良だけでもいいかなとも思う nimはオリジナリティがなく器用貧乏な感じ
golangだけでなくどの言語も独自の進化を続けているだけで機能不足なわけじゃない
rustは高速性と安全性を取ったら何も残らないゴミクズ >>47
Go信者は根拠なくデタラメに他言語たちを罵倒するのはどうして?
理解できないから具体的に指摘できないため? 元々rust推しなのは事実だからなw
ただ俺が推してるのはごくごく一部の高スループットや巨大データを扱うサーバーやデータベースなどの分野であって
OSなどハード寄りや普通のアプリで向いているとは思っていない
rustの流れなんて誰も作ってないし意識もしてないと思う
自然に流れが出来るなら流れに任せるけど違和感しかなければ推せなくなる
根拠がないのは客観的な話ではなく、主観をそのまま言ってるからだよw
あと俺はgo推しじゃないし、汎用なやつだと消去法で総合的にgoのコスパが一番いいと思ってるだけ >>51
具体的にRustを使って何が問題なのかをどうぞ
コピペでは無理な具体的かつ詳細な説明をお願いします Nimは言語自体の機能は必要最低限にしてtemplateやmacroでユーザが自由に言語の機能を拡張できるようにしようという考えだから。 分かるだろw 議論しても荒れるだけだから無駄
大雑把に言って初心者に難しい理由の説明しづらいルールが多いから一般向けに流行らないということ
nimについてはそうだね ゴミクズとまで言い切った割には普通の話だな…
PythonやJSから入った初心者に勧めるならそりゃGoだろう そうだよ大雑把な話でないと定義や粒度が合わなくてそもそも話せないからな
あとrustから「高速性と安全性を取ったら」って前提を抜かないでゴミクズだけ引用しないでくれ こいつネット記事で聞き齧った程度の
浅いことしか言えてないし
実際はrustで hello world 書いたことすら無さそう 遅くて安全じゃない言語は元がなんであれゴミクズなんでは... 何をもって「安全」とするのやら
非同期回りも含めるとスクリプト系だいたい全部アウトになります? なんのことやらしらんけど、Rustや他の参照透明性のある言語のことを言いたいのかな >>59
マルチスレッドでのデータ競合を入れるならコンパイル型もほぼアウト
実際静的にチェックできるのはRustくらいじゃない?
Goなんかはgoroutineで気軽にデータ競合しうるから、コンパイル時にチェックできるといいんだけどなぁ >>57
その人とは別人で悪いが、Rustでは最早ハロワを自分で書く必要がない またしょうもない定義の話になってるし・・・
分かれよw 変なところに噛み付いてないで自分の意見をちゃんと言え rustは言語処理系書きやすい
安全性とか高速さは関係なくて代数的データ型が使いやすければ他の言語でも代替はできるとは思うが
rustが一番使い慣れてるのでrustで書いている データ競合については、Haskellとかも起きないよね このスレの言語で挙げられてる問題すべて解決してるものある?
NimはCにコンパイルされるからブートストラップの問題も対応アーキテクチャの問題もなくなるのかな? むしろブートストラップの問題が表面化してる点はもうrustの圧勝って話に見える >>69
Nim言語のコンパイラはNim言語で書かれているんだけどCコンパイラさえあればビルドできるようになっている。
Nimコンパイラをソースコードからビルドするときは、Nimのコンパイラから出力されたC言語のNimのソースコードのリポジトリnim-lang/csources_v1をビルドしてから最新のNimコンパイラをビルドするようになっている。
https://github.com/nim-lang/Nim#compiling サーバーサイドは本当にGoが丁度いいな
typescriptと構文にてるし、node.jsから移行しやすいのが最高 NimがGoとRustの間を縫って次世代トップに躍り出る予感
巨大IT企業のバックアップが付けば一気に跳ねると思う GoやRustと比べると言語としての魅力がよくわからないんだよな。
オフサイドルールスキー専用言語? Nimなんか別に誰も使ってないし特に期待もされてないでしょ
世の中に山ほどある俺言語の一つに過ぎないよ Nimはわざわざ選択する理由がないんだよな
楽に書くならGoだしちゃんと書くならRustなわけで
もうちょっと特徴が欲しい 1. 実行速度、バイナリサイズ、メモリ使用量
→CトランスパイルなのでCに近い値
2. 安全性
→メモリ安全性高い
3. 生産性
→スクリプト言語並み
4. 機能性
→シンプルな機能と、強力なメタプログラミング
Nimは1・2と3の両立性が高く、比肩する言語が無い
3と4は常にトレードオフなので正解が無いが、Nimの割り切り方は良い GoもRustも実行速度とメモリ使用量が大きすぎるし、C/C++は生産性や安全性に問題が大きすぎる
その打開策としてNimを使う事ができる
複数言語を使い分けるよりも、1つの言語でまかなえるならば、学習コストや再利用性の面から越したことはないしね ただ他の言語と違ってコミュニティが貧弱すぎるのが欠点
言語性能自体とは直接の関係はないが、こればっかりは痛い
大手企業とか人気ソフトに使われる様なきっかけが無いと永遠に人気に火がつかないままだと思う
Go/Dart/KotlinはGoogle、Rust/JuliaはMozila、SwiftはAppleの後押しがあるけど、Nimは一切そういうの無くて、コアな人気だけが細々と支えてる状態 >>79
NimってRustより速くてメモリ使用量少ないの? >>78
1と2ってGo/Rustくらいの世代だとほぼ標準装備なんだよね
そりゃ多少の優劣はあるだろうがアプリの特性差やプログラマのスキル差から考えると誤差
そうすると構文が一部の人にマッチするって部分しか残らない感じ nimは、goと比べると今風の書き方が出来るのが良いかな。
でも、コミュニティが弱いのが辛い。 https://kdy1.dev/posts/2022/1/tsc-go
tscの型チェック機能をgoで書き直すらしい、vercelが支援してるみたい
初めはテストとしてrustで書き直して型チェック速度が62倍になって
ただ、rustで書き直すのは適していないと考えてgoに移植することを選択したと
フォーラム https://news.ycombinator.com/item?id=30074414 >>86
要約
一部Rustで書き直してテストしたら62倍速となり当然速かったけど
tscのコード全体がGCに依存しまくっているため移植ではなく全面書き直しとなってしまう
そこで妥協案としてGCで動作するGoへ移植することにした こんなもん本家の開発についていけなくなって早晩放棄されるのが目に見えてるだろ
まだRustだったらMSが支援してくれる可能性もあったかもしれないけどね
完全に手段が目的化している不毛なプロジェクトの典型だな SASS なんて、元々のRuby から、
多言語でも使えるように、C++ のnode-sass(LibSass)へ移植したけど、
開発が難しすぎるから、頓挫した
今は、Dart Sass
Dartもマイナーな言語だし、
TypeScript か何かで作らないと、また開発に行き詰るかも
C/C++, Rust など実行速度が速い言語は、開発が難しすぎる。
可読性が悪く修正できないので、開発費・開発期間が増える >>89
C/C++の可読性の悪さは
Rustで改善されていてとても使いやすくなっている
GC依存で設計された既存システムをそのまま移植するのは無謀だが
最初からGCに依存せずに設計が可能でありRustなら可読性が問題になることはない 自分はRustのCargoとその気になればunsafeで自由に書けるのが気に入ってる
Rustはとにかく美しいと思うな たしかに、Cargoらへんのエコシステムに関してはC++とは勝負にすらならないな
npmを反面教師にしたのかな、よくできてるよね Rustが美しいと思うのはどういう点なのか、具体的に聞きたくなる。これはC/C++と比べてる話じゃなく現代的な言語の話で
無駄にタイプ量が多くマクロと言語が一貫してなく、アトリビュートも独立しおり言語との一貫性が全くない 例えば const fnやコンパイル時定数などはコンパイル時にコードを動かして計算したりするが、一方でアトリビュートで
#[cfg(unix)]とかやったりして思想がバラバラ、まあ破綻はしてないしC/C++のマクロなんかと比べれば100倍ましだけど >>93
型推論も賢く強力な静的型付け言語なのにタイプ量は少ない
アトリビュートが言語本体と独立していて区別しやすくプログラミングする上で見やすい >>93
マクロと言語が一貫してる言語ってどういうイメージなんだろう
Lispしか思い浮かばなかったけどさすがに違うよね >>92
Cargoが良すぎて今まではちょっとしたスクリプトをPythonで書いてたのだけど
そういうのも全部Rustで書くようになってしまった
>>93
むしろこのアトリビュートが好きで
同一ファイルにtestをちゃちゃっと書けるのだったり
あーこれこれ、こういうのが欲しいんだよってのがほぼ全て揃っている
大小様々なソフトウェアを書くためにやっと人類が手に入れた言語かなって
だがなんかマンセーしすぎてスマソ >>93
マクロはRustの言語ルールを満たしていなくてよいところが要点
その定義文法も変換が主たるものだから別記法が理に適っている
>>98
Rustは強力な静的型付けにより安全と効率を両立させている
結果としての型名が長くなることがあっても
強力な型推論およびトレイト静的実装型宣言により実際の型名を記述する必要がない
その例は極端な特殊な例にも関わらず同様にして最終型名を記述せずに済んでいる もしかしてrustってめちゃくちゃ完成度高くね?
バックエンドだけじゃなくて
wasmでブラウザのフロントエンドにも進出してくるっぽいし
typescriptのシェアも奪いそう Go人気らしいけど嫌い
やっぱりC++使いはRustに行くべきなんかな >アルゴリズム書くのは普通疑似言語でやるわな
何言ってんの? アルゴリズム自体の記述には自然言語か疑似言語かpythonみたいなスクリプト言語使うのが多いのでは
「アルゴリズムを書く」ってアルゴリズムを使ったプログラムを書くという意味?
そうだとしたら対象が広すぎるのでもうちょっと具体化して欲しい アルゴリズムと一概に言ったってソートみたいなのは別にrustでも普通に書けるでしょ
どういうアルゴリズムを実装しようとして困ったのか教えて欲しい じゃあB-tree、赤黒木、ダイクストラ、フィボナッチtree、なんでもいいから書いてみりゃいいよ。 変な日本語だな
アルゴリズムの勉強には向いてない、ということを言いたいんだろうけど どうでもいいイチャモンづけにこだわるやつだな。。
だから実際組んで見ろって。。何もしないくせに。 新しいrustの弱点の話聞けるかと思ったら結局いつものグラフ構造の話だったので興味を失ってしまっただけです >>112
Rustでキューとかスタックとかって便利に使えるの?
所有権の関係で、要素をいじるときはpopしてから操作するのかしらん? >>113
普通は get_mut に類するメソッドが用意されててコレクションから取り出さなくても編集できるはず
同じコレクション内の他の要素への参照を持たせようとすると難しいかもね >>114
サンクス。
さすがにスタック・キュー(所有者)に要素の操作を移譲するようなことはしないか。実用上は妥当なところか。 >>113
言語と切り離して論理的に考えた時に
安全な構成と操作ならばRustでも簡単
危険な構成や操作ならばRustでは出来ない(unsafe使えばCと同じ操作が可能)
さらに加えて
危険な構成や操作に成り得るが
限られた一貫した用い方をしている限り安全な場合
新たな型を作って危険な操作を内部に閉じ込めてしまい
安全な操作のみ外部に提供することで利用者はunsafeを用いずに済むことができる
Rustの標準ライブラリもそのようにして作られている >>112
毎回そうやって曖昧にして逃げてるんだね。進歩ないね。 >>117
そこはグラフも表現できないクソ雑魚言語乙ってあおるべきなのになんで下手くそな人格攻撃してしまうのか 具体的にするならミュータブルなグラフ構造をスレッドセーフに扱うのは人類が思っている以上に難しいことで、それを言語側の制約で扱うならこうならざるを得ないくらい難しい問題だ、ということではないの? 例えば何かノードをたどっている最中にいつの間にか戻り先が変わってるとかいちいちケアしてコード書けないから、結局排他処理やスナップショットすりなんらかの工夫が必要
データ構造の操作だけ完璧に仕上げても応用きかないからそこまで深く考える必要ない そうね
スレッドセーフを諦めれば他の言語に近いくらいに簡単にできるのではないか C言語→Rustするトランスパイラーですべて解決じゃね?
Rustだからメモリも安心安全だぞ >>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++風にしたのは、好みで{}スタイルを好む人が
多いから(タイプ量は増えますが)許容範囲でしょうが・・・ 趣味・好みじゃなくて問題があるという話なら
なぜ本家じゃなくここに書くw 0.2からおっかけてたのならattributeの文法議論の時にそれ主張しとけば良かったのに
あとcargoのせいでコンパイルが遅くなるというのはどういうこと?
パッケージマネージャーがあるせいでcrateが細分化されてリンク時間が延びることを言いたい? >>123
Rust 1.0がリリースされた2015年よりも昔の0.x時代の話で叩いても無意味ですぜ
あとは1文字タイプ量が多いとかどうでもよい話ばかり
言語機能については批判がないということはRustの優秀性を認めてるわけか Rust並に実行速くて
Rustよりもプログラミングしやすい言語がない
結果として現時点でのベストな選択肢はRust Rustの唯一の欠点は、メモリ管理をしないといけないところだな。
ここも選択肢を用意してくれれば良いのに。 そうは言っても、メモリ管理したい人って需要少なくない?
今のままでは、C.C++代替以上にはなれない気がする。 言うほどメモリ管理してるか?RAIIとスマポに頼りっきりのくせに
参照カウンタとかもはや実質的に確定的ですらないやん >>133
そこはC++も同じだけど
C++よりも更にメモリ管理の記述が少なく済むのがRust
それでいてコンパイルが通った時点でメモリやデータ競合などの安全性が保証されるのがRust その上でRustは現代的なプログラミングパラダイムが洗練されて採り入れられているため書きやすい
つまりちょっとしたメモリ管理を意識してプログラミングするだけで他より数倍〜十倍速くなることもあるのだから
例えばサーバー経費を何分の1に激減させつつレスポンスも良いという実利的なメリットにも効いてくる >>133
> 参照カウンタとかもはや実質的に確定的ですらないやん
原理的には確定的やん
GC有り言語でガベコレタイミングに苦しんだことあるやつなら
ハッキリとRAIIとGCの間に線が引ける >>136
不要となったら直ちにデストラクタが呼ばれる点で優れてるよな
GC言語ではそれが出来ないので後始末の記述を毎回書くことで一部補うかその機能がないか RAIIとGCは対立する概念じゃないがな。C++/CLIで共存できてる。 RAII言語は必要があれば言語の枠外でGCライブラリなどを用いてGC利用も可能
その逆にGC言語はRAII利用が不可能 それはRAIIの機能がない言語ではRAIIが使えないと言っているに等しい。 循環参照もプログラマが自分でWeak<T>使ってなんとかするっていう言語だ
面構えが違う >>126
で、Rustって駄目ブラウザ以外に何作れんの?お前何作ってんの?内容ゼロで優秀性なんて言い出すウンコのコード見せろよ 数年前ならいざ知らず未だにRustに実用プロダクトあるのという
煽りは痛い人になっちゃったな なんかRuby界隈みたいに知識のアップデート止まってる人たち多いね
もうRustなんてそこら中で使われまくってんのに Rustは低レイヤやライブラリから徐々に侵食していく感じだからなかなか気付かれにくいかもね
Cのライブラリと思ってたら実装はRustに置き換わってた、とかよくある 自分はGNOMEとFirefoxしか知らんな
既存の実装がrustに置き換わるというよりrustで書き直された代替実装が登場してる印象 VSCodeの検索にripgrepが使われるようになったのも広義の置き換えとは言えるか? この手の手合はそんなものは下らない一般的じゃないと
言い続けるだけだからなあ curlとかpycaもかな
この手のは最初に入るときはレガシープラットフォーム対応の問題とかで話題になるけど
一度入ってしまうと採用が広がっても特に取り上げられることはないからなぁ pythonのファンシーコンソール風ゲームライブラリであるpyxelの実装がrustで書かれてて、お?ってなったわ その言語で書き直された〜みたいなことが話題になるうちはほぼ広がってないと考えて良いわ。 >>153
こうなったらOKというお前の合格ラインは? >>150
「よくある」とやらの根拠に興味あるだけだから心配すんな
絶対批判したり非難したりしないからリラックスして述べてみ >>155
最近じゃITニュースサイトでも
Rustで書き直しましたという記事がちょくちょく出てることに
興味もないレベルだと次世代言語スレは難しくない? >>153
スクリプト言語のボトルネック部分をCで書き直さしたなんてよく話題になるからCもマイナー言語ということで良いか? Rustは現代的なマルチパラダイムが洗練されて採り入れられているためプログラミングがしやすい
それなのにCやC++のように最高速で動いてくれて快適かつリソースや経費の節減となってくれる
さらにオマケとしてメモリ安全やデータ競合安全などの保証まで付いてくる まあまあ他人に期待するのではなく自分で何か書けばいいだけでしょ
今なら車輪の再発明と叩かれることもないだろう いうほどランタイム速度を必要とするようなアプリ、どいつもこいつも書いてないってのが現実。
はったりかましたバカはよくいるけど。 だいたいのアプリはAPI呼び出しの塊だからアプリ自体が実行時間のボトルネックになることはレアかもね Nimを使って作られたゲームを紹介しよう。
https://goodboygalaxy.com/
ゲームボーイアドバンス向けに作られた2Dアクションゲーム。
https://store.steampowered.com/app/1444480/Turing_Complete/
論理回路を組み立てて自作CPUを作るゲーム。Godotっていうゲームエンジンが使われている。 >>157
そんなこといちいちドやって報告しないって意味だよ。どこぞの言語と違ってな。 >>164
へー、リリースノートとかにも載せずにしれっと更新するのが世の中では当たり前なのね >>164 CからRustに書き直されることはあっても逆は無いから当然だろ まっ、Cはこれだけ広範囲に使われているからね。基礎教養みたいなもの。
知っていて、使えて当たり前。
Rustでなにか画期的に高速化されるわけでもないし、コーディングの量が圧倒的に減るわけでもない。Pythonのように特定分野で格段の強みがあるわけでもなし。
メモリ安全性といっても、それが課題になってくるほど大きなプロジェクトに関わってるわけでもないしなぁ・・・
組み込み的にはオブジェクト志向な方がハードウェアと馴染みがいいって感じもあるかな。 >>167
>メモリ安全性といっても、それが課題になってくるほど大きなプロジェクトに関わってるわけでもないしなぁ・・・
俺のやってるプロジェクトは小さい自慢かよ >>167
オブジェクト指向の方がハードウェアとなじみが良いというのはどういうこと?
カプセル化とか継承とか、もしかしたらメッセージパッシングとかがハードウェアの抽象化に適しているということ? デバイスドライバーみたいなソフトウェアだと、linuxのVFSみたいなインターフェイスを意識するのが普通だから
オブジェクト指向や関数ポインタ渡しが普通。
動的に操作方法を変える必要性が大きいものはこういう仕組みは必要になる。 そういやRustって、コールスタック重視なのになんで所有権移動をデフォルトにしたのかね?
スタックにデータがあるなら、戻ってくるのを想定して借用をデフォルトにした方が効率良い気がするけど。 値渡し警察「参照渡しは存在しない。あるのは借用<T>の値渡しだけだ」 >>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では概念上や記述コード上は「値返し」でシンプルにわかりやすく
実行コードでは最適化されて「返り値の格納場所を参照渡し」になる
もちろん小さな型を返す場合は実行コードも効率よく「値返し」のままである >174
いや、RVOの話じゃなくて、
スタックにあるオブジェクトの所有権を関数呼び出し先に移動するのを
デフォルトにした設計的な意図は何なんだろう
という話。
継続を第一級オブジェクトとしてサポートするのでもなければ
サブルーチンはいずれリターンしてくるんだから、スタックに積んだ
オブジェクトも呼び出し先に所有権を移動しないで持ち続けるのが
自然な感じがするんだよね。
それをわざわざ移動してスタックの奥で破棄する(=スタックに残骸が残る)
ようにしたのはなんでかね、と。 >>175
ヒープにあるオブジェクトだと deep copy にコストかかるから shallow copy (move) をデフォルトにして
コストかかる処理はソースコード上明確になるようにしたかったからだと思う >176
Rustもなんだかんだ言ってヒープ使用を想定している、ということかね。
それなら所有権移動をデフォルトにした理由は判る。 https://www.reddit.com/r/rust/comments/fa9pkp/what_is_the_motivation_behind_default_move/
このスレで作者が答えているけど、すでに参照を示す&が広く使われてるのにデフォルトを借用にすると、moveを示すために「非参照演算子」みたいなものが必要になって整合性が取れないから、とのこと
あとはスタックにどう置いてどうアクセスするかはコンパイラの最適化の問題であって
言語のセマンティクスとは別、みたいな話も >>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では無駄なことは起きない >>174
Rustは所有権がはっきりしてるためコンパイラが安全に最適化をガンガン出来る点が良いな
しかもプログラマーはそれを意識せずにRustのセマンティクスだけ把握して書けば後はコンパイラが勝手に最適化してくれる
これがC/C++だと自分で戻り値の場所を確保して自分でポインタを渡していき競合安全性も含めて自分でメモリ管理しなければならない
CG言語だとスタック上はあきらめてヒープで確保して返して後始末はGC任せ
Rustが有利 >>178
どちらかに指定が必ず必要なのだから
ライフタイムを管理する必要のある参照の方に&指定する現方法が大正解だな
参照にはsingle writer XOR multi readersのルール義務もあるしな ある程度は既存のメジャー言語と作法を揃えないと、タダでさえヤバい学習曲線がさらにとんでもないことになるしねえ 可変参照と可変じゃない参照の区別が安全性保証の要になっているため
参照の方に記号を付けるのは理に適っている
いずれにしてもC/C++で安全に書く時はそれら含めて意識せざるをえない
それがRustでは様々な点でかなり楽になっているのだからC/C++より学習が大変ということはない >>178
なるほどねぇ。
個人的にはconst refを標準にして非参照演算子を用意するのも有りだと思うけど
(変数そのものの状態変更を呼び出し元で明記するという意味で)
そのあたりは作者の設計思想だからなぁ。
ただ、コンパイラの最適化と言語のセマンティクスを切り離すのは単純すぎる気が。
>>180みたいな話もあるんだし。 >>184
参照を返す関数を書いてみればわかる
参照の方が特殊な存在であり記号は何でもよいが記号を付けるべき存在だとわかる
そして適切な記号としては微妙に概念が一部重なるC言語の&を選んだのも適切 >>185
もともとコールスタック(>>172)の話をしているのに、ヒープデータ前提の参照戻し関数の話をされてもねぇ。
Rustが「効率的にするという約束はしているが、コールスタックとかヒープとかは関係ない」というスタンスなら別だけど。 >>186
ほら理解できていない
まずは実際にプログラミングしてみなさい
ヒープなんか一切用いなくてスタック上しか使わなくても参照返しは必ず起きるしライフタイムの管理が必須となる >>187
そこまで言うんだったら具体的なコードを例示してくれない?
「参照返しは必ず起きる」と理解できるような普遍的なコードで頼むよ。 >>187
>ヒープなんか一切用いなくてスタック上しか使わなくても参照返しは必ず起きるしライフタイムの管理が必須となる
これは嘘だろ。実際fortranはヒープ使わないし、変数の寿命なんて問題は考えなくて済む。
そういう意味じゃめっちゃ安全。 >>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 ああ、データ自体を外部から参照する関数なら参照返しも普通か。>>186自体は間違いだな。
ただ、>>184(参照・実体の表記法/関数呼び出し規則)とはあんまり関係していない気が……やっぱり、Rustの設計思想が>>178だからというのが結論に思えるなぁ。
まあ、このあたりをいじくると、所有権を持つ変数が必ずひとつ存在するRustの設計思想からいじくらなきゃいかんような気がするから、Rustじゃ無理か。 >>191
そこはRust限定の話ではなく一般的な話だと思う
参照というのはあくまでも実体があってこそ生きていられる存在
だから実体を保有する変数がどこかに必ず存在していて
その実体が参照よりも長生きしていないとダングリングポインタになってしまう
(ここからはRustの話)
したがって実体の方を本体として無記号にし
それに依存している存在にすぎない参照の方を&記号で示している >>189
すべての関数呼び出しが末尾再帰であれば、呼び出しにあたって現在のスタックフレームを保存する必要はないから、中途半端な
手続き言語で分かった風に語りだす人は、どこかおかしい。コンピューターサイエンスとか齧ったことは無さそう。Rustをやってる人の
こういう語りは言語の発展の邪魔でしかないね >>193
どうみてもその>>189はRustをわかっていない人がむしろ(デタラメにRustを)批判してるような Go言語の作者Rob Pike氏が2015年に発表した「Go言語が成功した理由は何なのか?」で
> mapやfilterのような機能は言語の表現力を高めるものであり、 書いていて楽しい言語 に繋がるわけだが、
> これはそのトレードオフとなるメンテナンス性が高く扱いやすい言語という点をを犠牲にするだけでなく、
> (極めて素晴らしい方法で実装しない限り)コンピューターリソースを非常に消費するものだ。
と述べていて当時はその通りに思われてGoでは毎回for文で書くことがシンプルで良いとされてきた
しかしその後Rustのイテレータ実装ではfor文とほぼ同様に速く動かせるようになり
for文で毎回ごちゃごちゃ書くよりメンテナンス性もよく扱いやすいとわかった どうみても言語の否定じゃなく、どうでも良いようなことを延々と語りだすそいつの思考の人格・性格的否定だろうに。
こんな読解力も何もない奴ばっかか・・・ 所有権という概念を生み出したrustの人(名前わすれた)は天才だよ
効率性と安全性を同時に実現してる
これを関数型言語の人が生み出せなかったのは謎すぎる Ruby にはLazy があるから、無限配列でも、iterate できる
実行順序を変える。
書いた通りに前から実行しない 所有権というかRAIIパターンはC++の方が先でlifetimeの方が独創性あると思う ライフタイムによって本体だけでなくその参照の正当性まで保証できるようになったわけだ
>>200
Rustのイテレータは受動的に遅延生成だから無限生成もできるけど
勝手に実行順序を変えるようなことはなくプログラマーが書いた通り >>199
あいつら本当はラムダ計算をしたいのに実現出来なくて仕方なくチューリングマシン考えてる妥協の民だからそんな発想なさそうw >>199
関数型言語は同一データの共有が極めて多く発生するため、GCなしの実装は実用的ではない
参照透過な言語ならメモリの共有さえしなければいいわけでGCなしの実装は極めて容易だけど、無限のメモリを必要とする 関数型はGCが問題になるような途中過程の実行タイミングのシビアな用途に使われないからってのも大きな理由だと思う
性能面で言えば、ガベージの数が命令形に比べて桁違いに多いからいちいち参照カウントとかやってたらクソ非効率だろうし 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 に変わる >>201
確かに所有権っぽいことならC++でもそれっぽく書けはする
ライフタイムは最初なんじゃこれって思ったけど
我慢して書いてみると見事に"missing piece"を埋めてくれた 我慢して書いてみるって発想は
ルールを守るよりも抜け道を探してそうなハッカーの発想とは対照的だね >>206
当たり前のことを書いてるだけじゃん
Rubyではlazy導入で遅延処理となり必要最小限だけをようやく処理できるようになったけど
例えばRustでは最初からそのlazyになっている
だからイテレータを連鎖した時に途中に毎回の無駄な一時配列が生成されることもない
それゆえRustではガベージが途中で生じずスタック領域のみ使用で連鎖でき軽くて速い array::mapは複製が生じるだろ、普通はarr.map(...).map(...)は使わないにしてもlazyだから無駄な一時配列が
生成されることもないとか言い過ぎだ。ちゃんとドキュメント読んでんのか?そもそも一時的な集合要素が必要に
なるのはアルゴリズム次第であり、”理解してないのに”信じてしまう事は愚かすぎる >>210
array::mapはイテレータじゃないよ array::mapで複製は生じるけどイテレータがlazyか否かの議論には何も関係ないよね
mapはOption::mapなどと同じでイテレータとは関係なくコレクションやコンテナの中身を写像する関数であって、イテレータにも同様の意味を持つ関数が用意されているというだけ
>>209 のイテレータだから無駄なものは作られないは言い過ぎで反例はありそうに自分も思うけど、イテレータじゃないものを持ち出すのは例として適切ではない
イテレータそのもののせいではないが borrow checker のせいで余計なアロケーションが必要になる場合はある
以下の記事の最後の方のコード例なんかが一例
https://fasterthanli.me/series/making-our-own-executable-packer/part-6 >>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}")) <[T ; N] as Iterator>::map() のドキュメントを参照してlazyなことの裏取りをしようとしたら array::map() にたどり着いちゃったのかな
だとしたら rustdoc が分かりづらいのが悪い <[T; N] as Iterator> なんて存在しなかった
正しくは
<<[T; N] as IntoIterator>::IntoIter as Iterator>::map
または
<std::slice::Iter as Iterator>::map
だった
こんなの初学者わかんないよね >>213
イテレーター連鎖の途中で「無駄な一時配列が生成されない」は常に正しいです
ただし「そのイテレーターの機能として必要不可欠な無駄ではない」一時配列(Vec)を利用するイテレーターは存在します
いずれにせよ無駄な一時配列が生成されることはありません >>213
そのリンク先の記事を読ませていただきましたが
借用ルール(single writer xor multiple readers)違反が原因でその回避のため途中collect()しているだけでした
具体的には&self.objectsで借用中なのに&mut selfと定義されているself.get_object()を呼び出しています
したがって今回の問題とは無関係ですね >>217
「無駄な一時配列」の意味するところがあまり腑に落ちてなかったのだけど、
例えばイテレーターアダプターを呼び出す場合に、全要素列挙して配列で返す方式ではなく、
必要に応じてイテレーターアダプターのIterator::nextが呼ばれて、
さらにその中から元となったIteratorのnext()が呼び出されて...
と、lazyに必要な分だけ呼び出される仕組みになっているということが言いたかったわけね
>>218
はい、イテレータというかborrowの制約なのでlazinessとは関係ない話ですね >>219
Rustの配列(array)はスタック上に置けるようコンパイル時サイズ固定なのはご存知ですよね
したがってイテレーターがもし一時配列を吐くもしくは使おうとすると必然的にサイズ可変のVec利用となりヒープを使うことになってしまいます
ところがRustの標準ライブラリのイテレーターは core::iter::Iterator すなわちcore::はヒープが無い環境でも動作可能を意味します
つまり『Rustの標準ライブラリのイテレーターは一時配列(Vec)を絶対に使わない』ように設計されているのです
一方で外部のライブラリにおいてはデータが全て完全に揃わないと動作できない機能を持つイテレーターの場合に「必要不可欠な無駄ではない一時配列(Vec)」を用いるケースがあります 上で出ていたこれなら配列は複製されない
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}")) そのように書くのはあなたであって"Rustだから"というのは明らかな間違いです。無駄な事をしているのはあなたであってRustではありません Rustのイテレータは他と機能も同じ以上なのにプログラミング言語最速
さらにヒープを使わずOSもないベアメタル環境でも動作可 >>225
次世代言語スレで2年も前のリンク持ってこられても、、、 2020年の記事なんですけど
2020年が2年前な訳が無いんですけど Rustは言語仕様が汚くライブラリもいまいちなので
同じような概念できれいな文法の言語が欲しい >>231
言語仕様が汚くない言語
ライブラリがいまいちじゃない言語
それぞれ例えば何? >>232
言語仕様が汚くない → C言語
ライブラリがいまいちじゃない .net >>233
Cが好きならZigとか良さそうだけどどうなの? >>231
Rustは言語仕様が洗練されていて綺麗なので気に入った
Option / Result に ? や
match / if let / while let あたり
諸悪の根源の null / nil / undefined などが無くなり清らかになった >>238
英語でmutの語感覚ははラテン語mutare(変化する)から来ていて
mutable以外にもpermutationやtransmutationなど変化を感じさせる語源だから良いと思うけど >>237
ここのResult 型の説明で出てくるソースが理解しにくく非常に気持ち悪く汚く見えてしまいます
https://zenn.dev/mebiusbox/books/22d4c1ed9b0003/viewer/bba4b4
これを説明なしでソースだけでパッと流れがわかるなら優秀な人だと思います >>227
>2020年の記事なんですけど
>2020年が2年前な訳が無いんですけど
言ってることがわからないんだけど。
もしかして異世界からアクセスしてる人か? オッサンの時間の流れは早すぎて、もう2022年になったとは思えない
っていうジョークだろう
もうどうでもいいよ >>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)の時の処理のみに記述コードを専念できる >>245
そういうレベルの話じゃなくて単にパターンマッチの構文が見慣れないから読みづらいってだけだと思うよ
やってることはファイルをopenしてみて、失敗したらファイルを作成するってだけで何も難しいことはしていないので モダンな言語ならパターンマッチ構文とか当たり前だし、慣れるべきとしか思わんよな んなことはない
switchの中にswitch入れてる不気味なケースと同じで理解の妨げとバグの温床になっている そのうちmatchの中にmatch入れるな見たいなルールが出来て
それが当たり前になるw > Err(ref error) if error.kind() == ErrorKind::NotFound => {
ここが
Err(ref error.kind() == ErrorKind::NotFound) => {
こうなっていない時点でrustは汚い そもそもがさあ
他の言語のライブラリにあるファイルオープン時に指定したファイルがなければ作って開いてくれるようなオプションないのか? >>250
それこそクソ構文にしか見えないけど採用してる言語あるの?
Point(x, y) if 0 < x && x < 5 => {
みたいなガード条件書けなくない? C#とかだと複数のプロパティ値を使ったマッチングも当たり前にやっている >>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と覚えればよい C#はここ十年さわってないので分からんけど
> Err(ref error.kind() == ErrorKind::NotFound) => {
みたいに書けるってこと?
そもそもC#にパターンマッチなんかあったやろか?
switchがせいぜいあるだけでは?
あと型もletでdestructできるやつじゃなくて
せいぜい (変数 is 型) でシコシコ調べていくだけでは? >>250 のkind() は構造体のフィールドとのマッチじゃなくてメソッドの戻り値との比較だから
パターンとして取り扱えるようになるべきではないと思う
構造体のフィールドなら普通にパターンマッチできるよ >>251
File::options()
.write(true)
.create(true)
.open("hello.txt")
で済む話ではあるから例が微妙というのはあるかもね 見返してみると
Err(ref error.kind() == ErrorKind::NotFound)ではなく
Err( ErrorKind::NotFound)
とかけたほうがいいなと 上のソースは海外の有名なサイト???からほぼ丸パクリなんだな
そっちも突っ込みどころ満載のソースなんだけどパクったほうはさらにおかしくなってる
変なところだらけ
これとか
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)
}, >>256
ググればわかる
C#はもう全然別物になってるしこれからも変わる予定
誰得?と思うけど >>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 を読むべし >>260
その変数のシャドーイングも二段階のmatchもpanic!の使用もそれ自体は間違っていない
君は文句をつけることと間違った動かないコードを出すことしかできていない
こちらは改善案として二段のmatchではなくResultをorする>>254というシンプルで動くコードを示した 視点がずれてる
変なところが多い=美しくないと言ってるんだけど
意味のあるシャドーイングならわかる
変数使って受けてるのに次ではmatchダイレクト
panicを一行で書いたりブロックをつけて書いたりちぐはぐ
書いた奴は馬鹿なんだろう クソど素人にこれだけ書かれるのは馬鹿なんだろうしそれも理解できないのはどうなんだ? 批判だけならバカでもできる
具体的な代案を出せるかどうかが全て
これはどの世界でも同じ いやいや
何を例としてるか全然わかってなかったろ?
具体的に書かれて初めてわかったろ?
そういうところだよ
汚いソースすらわからないんだろ? rust入門サイトにこんなクソみたいなコード乗せるな
Rustの品格が下がる >>267
こちらは具体的な代案を>>254に出した
君は文句をつけるだけで何も生み出せなかった
これが全てだ rustが汚いって話からサンプルコードが汚いって話にすり替わってるな >>257
>>250は単一化あたりを想定しているんだろ。
本来なら
Err(ref error),
error.kind() == ErrorKind::NotFound
か
Err(ref error) and
error.kind() == ErrorKind::NotFound
あたりだけど。 もう十分だよ
初心者にありがちな「言語仕様が汚い発言」でしかないのがわかったからもういいよw 彼は当初Rustの言語仕様が汚いと主張
それが無理筋だとわかると誰か個人が書いたサンプルコードが汚いと主張を変更
ところがそれも修正案すら示せず敗走か 初心者にありがちな発言
「コンパイラのバグ」
「言語仕様が汚い」
「バリバリ書く」 >>271
それ前者はパターンで後者は条件
だからRustのmatchの『パターン if 条件』がわかりやすい まだ富士山2合目な発言「美しい言語、感銘を受ける」 「コンパイラが教師」 「初心者にありがち」 >>274
Objective-Cだけはマジ言語仕様汚ねーなって思った Objective-Cはちょっとしか触ったことないけどすこ
mac開発で使ってる人からすると欠点が見えてくるのかな? Objective-Cは、あの突き抜けたキメラ感が好きかな。 Obj-Cそんなに悪くないぞ
RubyのC拡張書いてる感覚に近い そういえばC#やってからJavaに触ると.NETフレームワークの設計が如何によく出来てるかを思い知る OSXが出てから一般向けの参考書が本屋に並ぶとか信じられないことになったが
昔は図書館の奥底まで潜らないと本が出てこなかったり
興味あるけどなんか手を出せる状況になかったなObjectice-Cは
linuxにgnustep入れてちょこちょこっとサンプル動かして満足してた
いやほんとAppleのおかげでだいぶ脚光当たったなマジで Obj-CはどうかしらんけどSwiftはまあ良いと思う
依存がでかいときのビルドはつらすぎだけど >>283
具体的にどういうところがでしょうか?
興味あります
1つか2つ例を挙げていただけると幸いです >>283
Javaの何と比較しての話?
標準ライブラリとか? そいつはC#おじさんだから触っちゃダメ、Goスレでも暴れてる 波かっこによるブロックのため、
}
}
}
}
でディスプレイを無駄に占有されて可読性が減る事と
文末のセミコロン(C系)やコロン(Python等)強制で無駄にタイピング量が増えるのが嫌なのですが(強制でなければむしろ好き)、
あれらって、どんな魅力が有るのですか?
javascriptでデータ量を減らせて難読化できるメリットはわかりますが・・・・。
ちなみに自分は{}もpython.nimの様なインデントによるブロックで良いと思うし、
function()はfn()で良いし、println()はp()で良いし、arrayOf(1,2,3)は(1,2,3)で良いと思います。 C言語の出始めは関数名とか省略していて可読性悪いとか言われてたなぁ。 C言語が出る前からプログラミングしてたん?
すごい大先輩ですね 記号=読めない
英単語=読める
みたいな批判は古いけど今でも一理ある
char **argv;
pointer< pointer<char> > argv; 頻度が高いものほど短くていい
意味不明な記号でもいい
*こそがまさにそれで
*こそがまさにC言語の象徴 >>289
Lispスタイルの }}}} はどう?
シンタックスハイライトや自動インデントなどで後続の文のネストのレベルは適切に調整されるという前提で >>289
だからおのずと深いネストや長い関数を避けるようになる教育的効果がある。
とかpython信者が言うんだよな どうせお前らは嫁や彼女のおっぱい見てオッパイソンとか内心思ってるんだろ。 Lispは基本すべてが()で
関数の終わりは
))))))
とかなりがち
スーパーカッコ
]
というのも提案されたが流行らなかった
カッコを閉じると対応するカッコを自動で示してくれるのが
よかったのかなあ(viの show match)
プログラムが大きくなるとどっちにしても一画面では
収まらなくなるし
識別子の名前を短くすると一見してなんだか分からないし
プログラムが大きくなるとわけが分からなくなりやすい
一応理由はある。経験則だけど >>295 Lispスタイルという名前がついていたのは知りませんでした。Thanks。
昔、それをやった時に「{と}の対応がわかりにくい」 => 「}のつけ忘れで謎のバグを誘発」という結論に達しました。
だから{と}で囲む事自体が無い言語が良いなと思っています。もちろんendで閉じるのも面倒です。
>>289 {}でブロック形成する言語のメリットは「対応するカッコにジャンプ」機能が有るエディタでは多少メリットが有りますが、エディタに「ブロックの先頭・末尾に移動」機能が有ればインデントでブロック形成する言語も互角なので、あまり意味がないメリットかもしれませんね。 >>299
Lispスタイルというのは世の中にそういう用語があるのではなくて
単にLispでよくやられているように〜ということが表現したかっただけ
紛らわしくてすまん 凡人なので Bracket Pair Colorizer みたいなエディタ支援がないと
3階層以上のカッコの対応が正しいかどうか自信が持てない >>299
中カッコやendで閉じないとエディタが助けてくれないのよ
インデントをどうするかをエディタが助けることができない >>301
Bracket Pair Colorizer は、もう必要ない
既に、VSCode に実装されたから >>303
>Bracket Pair Colorizer は、もう必要ない 既に、VSCode に実装されたから
良い世の中になったなぁ。vimでも実装されればいいのに。特に、対応するカッコを線でつなぐ機能はExcelにも無いのでステキ。 >>305 Thanks。対応するカッコを線でつなぐ機能も有れば更にステキ。
>>289
>javascriptでデータ量を減らせて難読化できるメリットはわかりますが・・・・。
javascriptは行末セミコロン強制ではないので、自分で書いていて今ごろ意味不明な事が発覚。修行が足りぬ。
C言語の先輩であるFORTRANは行末セミコロンは無くてもプログラミングできていたので、C言語系の文末セミコロン強制の意義はいまだに不明です。
構文解析の負担を少しでも減らして、コンパイルを高速にするためでしょうか? Cのセミコロンはalgolのセミコロンやcobolのピリオドを引きづっている
ここで一連の処理が終わりという意味でターミネータを置いた
改行を書かずにぎっしり書くときにどこで切っていいか分かるからね
自然の文に近かろうといういい加減な理由
当時はまだ人間にとっての書きやすさとか
人間にとっての読みやすとさかほとんど配慮されてなかった 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において非常に重要な意味を持つ
きちんと活用したプログラミングにおいてはセミコロンも波括弧も無駄ではない Ruby on Rails で有名な、民泊のAirbnb、JavaScript スタイルガイド
ステートメントを明示的に終了し、
不足しているセミコロンを検知するようにリンターを構成すると、
問題に遭遇するのを防ぐのに役立ちます
一方、Rubyでは、セミコロンを付けない JavaScriptはセミコロンを省略しようとすると、ハマる罠がいろいろあるからね 自由な書き方ができるというのは無駄だと思うけど?
”波括弧は区切りとして不可欠であり(略)波括弧はブロックを形成し(略)変数がブロック終了時に自動解放”
これも別に2種の異なる記号文字の波カッコである必要はない。いちいちカッコ対応を合わせる必要もあるし、Pythonのような
オフサイドルールでも実現できるし、Rubyのように{}とbegin/endで意味が違う言語のほうがしっかりしてますよ
もともとのCではセミコロンはソースのパース処理を楽したいだけで、こんなに好意的に信じられるとはw >>311
そういうおもちゃ的な簡単な言語は波括弧なしでも書けるような構文しかないから何とかなってるけど
そうでない場合は波括弧が最もベストであるから様々な言語で採用されています ErlangもHaskellも波かっこなんて使わないけど? Fortranもないし、Juliaには合併型につかうけどブロックじゃないし
これらをおもちゃと言えるならさぞかし素晴らしいプログラム書いてるんだろうな。私の意見は「最もベスト」ではなく
ただ単に何も考えず人口の多い言語からひきずられただけ Juliaのendで閉じるのはマジでメリットがわからん
予約語が増えるし、エディタの機能で閉じ括弧にジャンプすることも出来なくなるし
Juliaなんて特にFortran出身のガイジみたいに長いコード書くガイジを招き入れようという言語なのによ 既に書いたようにRustは積極的にセミコロンも波括弧も活用していて無駄がない
波括弧もブロックだけでなく列挙体定義、構造体定義、モジュール定義、トレイト定義、実装定義など多岐にわたる
ブロック自体も様々な制御構文に登場するだけだなく、クロージャや非同期のブロックなどの他に、所有権スコープを別にするためにブロック内ブロックも使うため、開始も終了も1文字で済む波括弧はRustにとってベストとなっている
セミコロンも>>308に書いたようにセミコロンの有無で文となるか値となるか変わってくるなど重要な意味を持っている
このようにセミコロンと波括弧はRustにおいて非常に重要な意味を持つ
これらをきちんと活用したプログラミング言語においてはセミコロンも波括弧も無駄ではない rubyでもたまに変数名にend使っちゃって(´・ω・`)ってなるわ >>306
FORTRANは行末記号を使わない代わりに行継続を明示しているだけ。 昔は画面に出せる文字数も少なく見通しが悪くなるのでインデントなど使わなかった
フルスクリーンエディタでもなかった
誰もインデントなど使わず意味の通じる範囲で一行に区切り入れてどんどん文を書いていった
fortranなんて一行の文字数が固定だったし複数行になる場合は非常に見づらかった 大学でfortranの授業があり友達が勉強のためにと20万ぐらい出してパソコン用のFORTRANのパッケージを買った
俺達が今はFORTRANは実質大学でしか使われておらずモダン()な言語がもっと安く買えることを教えると
もっと先に言ってくれと激怒した
彼は一年の前期しか使わないFORTRANを購入したんだ
後期はPascalだった
Pascalを買っててもそれはそれで…
自分はCのパッケージを買ったんだなあ インデント言語はコードの自動生成がやりづらいという欠点はあるかな
文を出力するときにその文を含むスコープのインデントレベルだけ空白文字を出力するようなロジックが必要
括弧が必要な言語なら生成後フォーマッタにかけれぱきれいなコードになる
まあたいした差ではないとは思うけど Rustは配列の1要素の更新参照を渡したら
ほかの配列要素がすべて更新できないという
発狂するような仕組みになっている 本当にそれがやりたくて、かつインデックスが重ならないことを保証できるんならunsafe使っても許されるケースっぽい 配列の1要素の更新参照をとるときにどの要素が選ばれるかが実行時に決まるとどの要素も変更されうることになるからじゃないの? >>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 CやRustの波括弧とセミコロンはインデントがあろうが無かろうがタブとスペースが混じっていようがインデント幅がバラバラになっていようが一行に式や文がいくつ書かれていようがルールさえ守っていればコンパイルできるようにしろ、自由にコードを書かせろ、というために存在しているんじゃないか。
コーディング規則をきちんと守ってインデントする書き方なら波括弧使わずにインデントでブロックの範囲を指定できる。 >>327
Nimでは一行に複数ステートメントを書きたいときだけセミコロンでステートメントを区切るようになっている。
Statement list expressionを使えば以下のように書ける。
var b: int
let a = if condition: (b = 1; p + q) else: (b = 2; x + y) >>324
かなり習熟が必要だけど、あらかじめそういうことを理解して考慮していれば
そもそもそういう操作が必要ないように設計できるようになってくるので、どんどん困らなくなってくるよ
ライフタイムらへんはもっと難しいから、初心者はしばらくの間悩まされるし、
やはりどうにもこうにもRustの学習曲線はやばいよね >>324
split_mut使うなどのworkaroundはあるよ >>327
Rustだとブロックの先頭ですぐに別のブロック開始させる場合もあるけど
インデント方式でやるといきなり二段階インデントが深くなるのはわかりくいから波括弧が向いてると思う
あとセミコロンも関数の最後の返り値の場所で別の関数を呼んだとき
セミコロンを付けると文になって呼んだ関数の副作用のみ利用で返り値無しとなり
セミコロンを付けると式(値)となって呼んだ関数の返り値が自分の返り値となる
完全にセミコロンの有無しか違いがないからRustでは波括弧もセミコロンも必須かな 昔とはコーディング環境が違うから何とでもできるけど
本当にRustはコーディング時間と学習時間が他の言語の倍ぐらいかかる 専用のIDEがあって、インテリセンス使えれば学習曲線が明らかに下がると思うよ >>332
>インデント方式でやるといきなり二段階インデントが深くなるのはわかりくいから波括弧が向いてると思う
いきなり二段階インデントは確かに嫌ですね。
そういった場面が思いつけないので例を出して頂けるとありがたいです。 他の言語はパフォーマンスの改善とタイミングバグの対応に10倍かかんのよ 他の言語で1%ぐらいで発生するバグがrustでは発生しにくいように書ける
でもアホだとそもそもそこまでコードが書けないで放り投げる
コードはバグ込みでも動くものが完成しなければいけないと思うけどRustはそこまで到達しにくいかしないか
同じコードでも3倍ぐらいコーディング時間がかかる 色んなプログラミングをやってきたがRustが一番プログラミングしやすい
色々と言語仕様が洗練されていて書きやすいことが大きい
それに加えて開発効率が非常に高いことが挙げられる
特に実行しながらのデバッグが激減した rustではブロックも式だから、インデントは向かないだろう? c++で書いたコードをRustで書き直してると叫びたくなるがしゃあない 静的型付け言語の中だとRustが最も書きやすいかな
特に強力なおかげでデバッグなどでもロジック本体に集中できる点がいいかな
この点は異論があまり聞かれないよね ロジック本体に集中できると書いてる人はjavaかC#あたりでも使っていたら良かったんじゃないかと rustが書きやすい理由は関数シグネチャの情報量が多いこともあると思う
関数の型定義を見るだけでパラメーターや戻り値の値域や、所有権の移動有無が明確に分かるのは大きなメリットかと あと関数に渡したオブジェクトの変更可能性の有無が分かるのも良い点 (これはC++などでも分かるが) 機械的にやってないからってだけだよね
そりゃ自分でRustっぽく書き直しちゃってたら時間かかるのは仕方ない とにかくRustが好きでただ褒めたいだけみたいなレスばかり Rustは割と学習コストが高いぐらいが欠点らしい欠点 C++やってるとそんなに学習コストは高くないな
デフォルトでムーブっていうのはムーブ知らない人は苦労すると思うが 学習コストが高いっていうのって正直みんなどう感じてるんだろ?
ある意味、RUSTでプログラミングできるっていうのがステータスになってプログラマとしてこういう言語でやっていきたいワクワク感ってのがある。
昨今のPythonのブームは、AIとか自動化とはいいんだけどPython自体は確かに誰でもプログラミングできるかわりに、pythonでプログラミングできるということがなんのステータスにもならない歯がゆさを感じていた。
やっぱりC言語でポイントをマスターしてmalloc/freeとかでメモリ管理をガリガリ書いていて誰でもできるわけではないプログラミングができていた達成感というのを欲していた。
そういう悶々としていた自分にRustがでてきた久しぶりにワクワクしている。
そういうのってない? RefCellのborrow_mutとかその辺がマジで難しいと思うよ
なんでこんなことしなきゃならんのかって思う C++のヘッダ取り込みの仕組みを改良してくれたら普通に現役で戦えるのに >>354
めちゃくちゃわかる
Pythonは便利さで考えると間違いなく個人的一位なんだけど、何らかの別の知識と組み合わせないと価値が生み出せない感じは確かにある。
C書いてる老人からしたら「インタープリターなんてけしからん」って感じで毛嫌いされるし...
純粋にプログラマとして名乗るなら一つはコンパイラ型言語を習得する必要がありそうだ。 Pythonはパッケージ管理とか型付いてないライブラリがウザい というかCargoはマジで優秀すぎて、他のあらゆる処理系に真似してほしい フロントエンドの人が最近Rust書いてるけど
JSしか書いたことない人が書ける言語じゃないと思うが JSでちゃんとしたものを書けるスキルがある人にとっては楽勝な気も。 プログラム言語に求められるニーズはホント、多様なんだな、と思った。
GoやPythonの様に仕様を簡単にして仕事をサクッと済ませたい人も居れば、「一般人では到達し得ない難易設定に取り組んで他者と差別化したい」という人も居る。
商品開発と同じで皆にドンピシャハマる言語は無いし、それを無理に作ろうとしたら、万人が物足りなさを感じる折衷案になってしまうのだろうな。
と言いつつ、皆にドンピシャハマる言語を模索している自分が居る。
「型設定、メンドクサイ〜」という人はC++で言うautoを使えばいいし、「自動化・縛り無しはバグの元!」という人はintやconstや所有権を追加すれば良い。どちらの書き方でも同じ言語上で動くし、お互いの書き方が気に入らなければ「付け足す・削る」だけで対応できるような、そんな、移植性の高い言語を作りたいものだ。 >>355
どの辺に難しさを感じたの?
コンパイル時のborrow checkerと同じことを実行時にチェックするだけだからRefCellが難しいと言うより借用周りの規則がややこしい? >>357
マクロはほとんど影響ないと思う
小規模のcrateをたくさん組み合わせることが多く、プロジェクトごとにそれぞれコンパイルする必要があるので
単純にコンパイル対象のコード量が多いというのはよく言われている その通り、cargoを持ち上げてる上げてる奴とは全く仲良くなれそうもない。
cargoが遅くてダメダメ、なんで遅いのかを調べるとRustのトレイトの仕組みに行き着くという罠... >>365
可変参照を実行時に得たいというrustの事情はわかるのだけど
そもそもコンパイル時に参照解決できないデータ構造はめちゃくちゃ多い
その辺りをもう少し書きやすくならないかなと思う
結局面倒だからunsafeに逃げてしまうのではないかと
まだうまく言語化できずモヤモヤしてるが Rust以前のコードしか書いたことない人は
借用しっぱなしで平気だからいろいろ困ってしまう
Rc<RefCell<T>>で考えられるようになると
共有所有権をクローンして持っておいて
必要な瞬間のみ動的に借用するって方法を覚える
そうして、時間軸上のスコープとでもいうか借用の瞬間を小さく管理することを覚えるのである
そうして、今まで人類は所有権と借用についていかに無頓着にやり散らかしてきたのかを反省するのである >>371
それはわかるんだけど
その代償としてプログラマーが支払わなきゃならない代償がデカすぎると感じる
これはコンパイル時の様々なチェックとは本質的に違う努力で
rustを騙すためにやらなきゃならないバッドノウハウの類であると感じる >>371
GCで困らない、システムプログラミングしない人としては、
そんな面倒な事したくないなって、思ってしまう。 せめてどうにか速くならないかとcargoをRAMDISKにしようとするとCARGO_TARGET_DIR=/tmp/.cargo/...と出来るのは
良いんだけど、コンパイルのためのworkじゃなく、targetディレクトリだから成果物がそこにできてしまうという(笑
速くなるんだけどね。。 >>369
はっきり言ってツリー構造とかはunsafeでいいと思うよ >>372-373
それはrustがnot for youという話なのでは Rust持ち上げてる内容を見ると他の言語でも普通にあるやつが多い
C++しか使ったことがないうぶな人なんじゃないかな 頓珍漢で的外れ
型推論も賢い ← むしろ型推論実装されてて賢くない奴ってどれなんだよ
アトリビュートが言語本体と独立していて ← 当たり前 他でも同じそれが属性
Cargoが良い ← 他より優れているとは思えない
強力な型推論およびトレイト静的実装型宣言により実際の型名を記述する必要がない ← 当たり前 もともとそういうもの >>374
たしかに中間ファイルのビルドキャッシュはプロジェクト間で共有しつつ、最終生成物はプロジェクト内に出力するオプションがちょっと欲しいな
Goがそういう感じだったかな そもそもrust自体言語機能が優れていることは標榜してない
他のモダンな言語の "当たり前" をシステムプログラミング領域でも実現したというのがポイントでは >>380
GCなく高速で動く便利なプログラミング言語が登場したことが非常に大きい
そこへ加えて強力な静的型付けにトレイトの枠組みが加わりプログラミング開発の生産性が大きく上昇 せやなあ
あくまでRustの重要なところはオーバーヘッドが少なく比較的安全に、システムプログラミングやベアメタルプログラミングが行える処理系だというところだよね
この特徴だけでも他の言語と大きく差別化されるけど、モダンな型システムも便利だから低レベル以外のレイヤーでも使いたがる人がいる、って感じよね >>380 みたいなのを見ると安心するけど、
>>381-383 みたいなのを見ると新興宗教団体のように見えるのがRust 381はおちょくりだし383は380と同じことを言っているだけのような
382は自分の主張を繰り返すだけの人 >>380で終わっておけば「今週末ちょっとRustやってみようかなぁ」になるけど
>>381-383が続くことによりくどくなり、「うへぇ・・・Rust関わりたくねぇ」になりそうってこと
壁からちょっと手を出すと子猫が飛びついてくるけど
全身見せて手を差し伸べようとすると逃げていくのと一緒 ムリに関わる必要はないし
誰もそれを強いてはいないぞw
あの言語はC++で苦しんだ連中が手を伸ばすもんだよきっと うちの場合だけどスクリプト言語からRustにして良かった点
・型を中心とする強力な言語機能による開発効率の大幅上昇
・メモリ省力化と高速化CPU負荷激減によりサーバー/クラウド等リソースとコスト大幅削減
・アプリやシステムなど反応速度も高速になり様々な利用者が快適となった スクリプト言語から移行出来るような高機能なデファクトのフレームなんてRustにあったっけ・・・ I/O待ちが大半なWebアプリじゃなくて
I/O処理やデータ加工が主体な処理なんじゃない?
そういうのでもスクリプト言語で書かれてるケース結構みるし >>390
そんなしょうもないケースわざわざRustにしたらメンテする人いなくなるだけ
そもそも>>388以外が答えても意味ない 「コンパイル時に参照が決まらないデータ構造に対して解決にはなってない」のがrustのいけてないところ
ここにたどり着いた俺を褒めてくれ 過剰アンチも異常者に見えるからやめといたほうがいいぞ >>392
バグがあるとしたらそこが怪しいって絞り込めるだけで十分。
しかもそういう参照が決まらない場所なんて限定的だし CPU セントリックな処理じゃないの?
少数の同じデータを繰り返し使うような、行列処理みたいな
Ruby on Rails みたいな、全ての関数が平均的に呼ばれるようなものは、
どうにもならないでしょ?
例えば、Ruby JIT で、1万個の関数を機械語にコンパイルしても、対して速くならない
手続き中心処理はダメ。
データ駆動型じゃないと、速くならない >>395
そういうのにスクリプト言語を選択してるのがおかしいだけで、Rustでなくても何でも普通に書けばそれなりに速い。
また繰り返しになるがRoRを置き換えられるようなRustのフレームなんてあったっけ?
そもそも>>388以外が答えても意味ない >>389
各自の分野と対象レイヤーがバラバラだろうから一般的な話になるが
開発のできる普通のプログラマーにとってはほとんどの分野でRustが実用的に使えるようになってるな
しかし切り貼りや書き換えや各種設定などだけでやりくりする似非プログラマーにとってはまだ厳しい >>392
それはRustが最高速を出すために
ジェネリクスを具体的な型に対してコンパイル時に静的にモノモーフィングするからであって利点の一つ
もちろん稀なケースでは動的にディスパッチしたほうが有利なこともあるのでRustは静的と動的のどちらも選べる >>396
うちではRoRは使っていません
その階層での汎用的なフレームワーク全体を作るのは大変でしょうが
必要な機能のみを必要な用途に特化して用いていますのでそのようなものを必要としていません >>397
エコシステム完成を宣言!?なんでもござれ????
なわけないだろw 嘘乙w >>398
その利点は理解してるよ
ポインタをつなぎかえるようなプログラム以外ではそこまで面倒だとは思わないし
ほとんどのプログラムは静的に決まるように書けるしね ポインタ繋ぎ変えるのはRustでは面倒です←まあわかる
ポインタ繋ぎ変えるのはバッドプラクティスなのでアリーナ使って富豪みたいなメモリの使い方しましょう← ?????w??!???????????????????w >>403
いや何でもかんでもArena使えってことではないよ
Arenaは処理の間、メモリの解放が起こらずに解放する時はまとめて解放するようなデータ構造で使うものだよ
rustのソース読んでたらAST作る部分で使ってた
ASTはまさにそのような部品
rustのソースは学びが多すぎる arenaって富豪的なの?
最近のmalloc実装はarena使ってるからそれも富豪的ってこと? >>405
arenaは解放処理が行われるときは必ず全てのオブジェクトが解放される
mallocはslab allocatorが上手いことやらないと解放されない >>406
なんでslab allocatorが関係してるの? >>404
ASTみたいな構造+途中で解放する必要があるって時の解がRustにないので、オレオレ実装をプロジェクトごとに入れるか、アリーナを何度も作っては捨ててを繰り返しながら世代型GCもどきを作るかするしかなくない?
これは事実上なんでもアリーナでやるってことになると思うけど 強力な静的型付けと言うのは普通のプログラム言語は当たり前でスクリプト崩れがそうでないだけだと思うけどなあ… >>408
そういうのはまさにRefCellを使うしかない
arenaはあくまで処理の間は絶対に解放されないデータ構造をまとめて確保するために使う
例えばASTだったりネットワークグラフだったりね
こういうメモリの使い方のセンスってGC言語が当たり前になったせいで完全に失われた技術って感じがする >>409
静的型付き言語の中でも代数的データ型や型制約のような型の表現力の違いというのはあると思うよ >>408
ちなみにarenaみたいな仕組みを実はV8は実装している
HandleScopeという仕組み
これはHandleScopeが生きている間はメモリが解放されないが
HandleScopeが死ぬタイミングで全てのローカル変数のメモリが解放される >>409
CやGoはどこに分類されるの?
スクリプト崩れ? ObjCのautoreleaseみたいなのが最初からあると楽でたすかる いやRefCellはしんどいって
やっぱgcpointer復活して欲しい RefCellなんてたまにしか使わないものだし使うときも困るようなものじゃないぜ
おそらくRustのアンチが不利っぽく見えるところを取り上げようとしてるんだろうけとさ そりゃテキトーなスクリプトで済むようなコードばっかなら使わんだろうね 分野にも依るんだろうけどWeb関係やってるとRefCellの出現は超レア
ライブラリの方のソースも全て見たけど
RustのHTTPデファクトスタンダードのhyperで1ヶ所だけ出現
その上のレイヤーのライブラリ群ではゼロ、HTTPS扱うhyper-tlsでもゼロ Webだとメモリ上に状態を永続的に保つ必要はないからrust向きだよね
所有権を渡していくことで自然と安全なプログラムが書ける
永続情報はデータベースかmemcacheみたいなkvstoreに入れるし >>416
gcpointerって@のこと?
あれはgcと言いつつただのRcだしinternal mutabilityとは関係ないよ >>420
ほとんどの動的アロケーションはリクエストスコープだからという理屈?
だったら所有権というより自動変数で十分でしょ 循環参照が必要な時にやれることが「プログラマが注意して管理しましょう」しかないのキツくない? >>423
現実に色んな分野でプログラミングするとわかるが循環参照なんてほとんどの分野で出てこないか回避できる
なぜなら現実の様々なシステムからアプリまで全てにおいて出てくるデータ構造は何らかの視点で見ると木構造になっているからである
だから非現実的な机上の空論で悩む必要はない > なぜなら現実の様々なシステムからアプリまで全てにおいて出てくるデータ構造は何らかの視点で見ると木構造になっているからである
これが真ならベルマンフォードとか使うケースはどうなるんだ
まあ無理筋に頑張って木と同一視するのかもしらんが >>425 >>426
抽象的な話しか出来ないなら相手にしないが
具体的に木構造の視点を持たないグラフを扱うシステムやアプリがあるなら挙げてごらん
そしてそのデータをどのように永続化しているのかも語って欲しい
あったとしても非常に特殊なレアケースだろう >>427
ベルマンフォード法で扱うデータをポインタ(参照)で指し合うなんて非効率なことはしないので不成立
普通に配列に格納する よくわかっていないけど
鉄道の路線図とか簡単にループするけど
どうするの? >>430
プログラミングでそういうのを扱うときに
駅の個数だけ駅ノードオブジェクトをメモリ確保して路線毎に隣接駅をポインタ(参照)で指し合う、なんてことはしない
それだと何かするたびにポインタを何度も辿りまくって遅いし
そのポインタで指し合う構造をデータベースに格納するのも大変
現実にはどう扱われているかというと
データの配列として持ってそのインデックス等で他を指す
つまりポインタ(参照)は出てこない
配列とインデックスの方が扱いやすいし、メモリアクセスも速いし、ファイルやデータベースに格納するのも容易
>>431
現実に必要となることが無いか、代替手段があるか、となり、
残る超レアケースがあるなら出してごらん >>432
お前が>>424で
> なぜなら現実の様々なシステムからアプリまで全てにおいて出てくるデータ構造は何らかの視点で見ると木構造になっている
と宣うから、俺が
> グラフとか木構造になるの?
って聞いてるんだがwwww >>433
現実の様々なシステムからアプリまで全てにおいて出てくるデータ構造ならば
何らかの視点で見ると木構造になっている
もちろんその一番簡素なパターンである配列構造を含めてね
今のところ誰も反例を出せていない
もしあるとしても超レアケースなのだろう >>435
現実の様々なシステムからアプリまで全てにおいて出てくるデータ構造の何のグラフですか?
ベルマンフォード法ならば>>429に書いたように配列で扱われます
鉄道の路線図についても>>432に書いたように配列で扱われます >>436
> グラフとか木構造になるの?
こう聞かれて特定のグラフだと思う方がおかしくね?
答えられないなら何レスも使わずに分からないと言って欲しい >>437
そこまでキチガイならば相手をしない
こちらは最初から一貫してこの話しかしていない
>>424 引用
| 現実に色んな分野でプログラミングするとわかるが循環参照なんてほとんどの分野で出てこないか回避できる
| なぜなら現実の様々なシステムからアプリまで全てにおいて出てくるデータ構造は何らかの視点で見ると木構造になっているからである
| だから非現実的な机上の空論で悩む必要はない
そしてそちらが挙げた具体例に対して
それらは現実に配列として扱われていることも述べた 言ってることは分かるよ
俺はrust書き始めてポインタを使わないプログラミングをするようになった
C/C++に毒れてたことに気がついた
例えば木構造も配列とインデックスで同じことをやるように書き直した
昔のAhoやUllmanのアルゴリズムの本はポインタを前提にしてないから
配列とインデックスを使ってアルゴリズムを書いてる
その本を引っ張り出してきて読み直したりした
まさか現代において70年代に書かれた本を参考にするとは思わなかった >>438は「分からない」ようだから話を進めると、グラフ構造は木構造にはならない
なぜなら、木構造はグラフ構造の一種だからw
グラフ構造を単純に実装すると、親ノードが子ノードを参照する形になり、簡単に循環参照を発生する
そういうこともあり、古来通常の実装はノードから直接参照するのではなく、エッジというものを用意し
各コンテナに保存した上で参照先をコンテナのキーにすることで表現する
つまり循環参照は簡単に発生し、それを回避する努力を惜しまない必要がある
>>423の言う通り、まさに
> 循環参照が必要な時にやれることが「プログラマが注意して管理しましょう」
であることが明確に分かる
これをろくに議論もできない頭で否定するものではないw 配列とインデックスを使うとして、ある要素のインデックスを取った後にその要素が削除されるとそのインデックスが想定していない要素を指すことになるじゃん。そういうのはみんなどうやって防いでいるの?
あと、双方向リンクドリストって普通に実装すると循環参照になるけどこれも配列とインデックスでやるの? 原理的には整合が取れない状態にならないように操作がatomicになるように実装する
もちろん実装方法なので、構造を変えたり、方法は具体的にはいろいろあるよ >>441
そこまでアホとは思わなかったw
一般的なグラフが木構造にならないのは当たり前だろ
まさかそんなことを言いたいがためにこちらの質問に回答できなかったのかw
呆れた
現実に色んな分野でプログラミングするとわかるが循環参照なんてほとんどの分野で出てこないか回避できて残りはレアケース
なぜなら現実の様々なシステムからアプリまで全てにおいて出てくるデータ構造は何らかの視点で見ると木構造になっているからである
さらに既に例で示したようにベルマンフォード法などのグラフにおけるアルゴリズムを扱う場合も現実のプログラミングでは配列として扱われている
だからそんな非現実的な机上の空論で悩む必要はない
>>442
そういうレアケースのために
Rustでは双方向リンクドリストも含めて標準ライブラリに用意されている
その上で注意書きとしてほとんどのケースではリンクドリストを使うよりも配列やリングバッファ(RustではVecDeque)を使った方が有利と明記している
これは言語に関係なく成り立つ話 >>444
そんな単純なことが返事できなかったのはお前だろwwww
そんな頭で「非現実的な机上の空論」とか言ってる場合じゃない
循環参照問題はレアケースではなく明確で常に回避を必要とし、各分野で日々回避方法が研鑽されている
Rustも例外ではない >>445
そんな当たり前のことをわざわざ尋ねてくるほど君が低レベルとはその時は想定していなかった
結局のところ君は具体的な反例を出せずに非現実的な机上の空論を続けるだけなのかね
現実の様々なシステムからアプリまで様々なものにおいて出てくるデータ構造は何らかの視点で見ると木構造になっているものがほとんどであり循環参照で悩む必要はない
一般的なグラフ上の各種アルゴリズムについても配列上のデータとして扱われるのが通常
ポインタで指し合うデータ構造をとってもポインタを何度もたどるのはメモリアクセスで不利でキャッシュ的にも不利であり、もちろん永続化として格納する時も同じく 俺が言ってるのは循環参照問題は重大な問題であるということw
反論出来てないのはお前w
Rustの標準ライブラリはunsafeのオンパレードだなw >>447
その最後の行「Rustの標準ライブラリはunsafeのオンパレードだなw」によって
あなたがプログラミングについて無知だと判明しました
言語関係なく一般的にその「unsafeな操作」無しではプログラミングは成立しません
そのため各プログラミング言語はその「unsafeな操作」を様々な方法で閉じ込めようとしたり
あるいはC/C++のように全開放して全てをプログラマーの自己責任としたりしています
いずれにしても各言語の内部では「unsafeな操作」が当然ながら頻出となります
一方でRustでは従来にない以下の方針を取ることにしました
・GCを言語としては採用しない
・それにも関わらずプログラム全体のメモリ安全性をコンパイラが保証できるようにする
・必ず残る必須な「unsafeな操作」は型やモジュールの外に影響が出ないよう内部に閉じ込める
・その型やモジュールが外に提供するインタフェースは(unsafe宣言されているものを除いて)安全に提供する
つまりプログラミングをする上で避けることができない「unsafeな操作」を
C/C++のように(結果的に)プログラム全体に散りばめてしまうのではなく
ライブラリなどの内部に完全に閉じ込めて外に影響が出ない安全なインタフェースのみ提供することにしたのです
Rustはこの方針によってプログラミングに不可欠な必須の「unsafeな操作」なだけでなく
実行効率の良さのための「unsafeな操作」も型やモジュールの内部に閉じこめることが可能となりました
そして安全なだけでなく速さも両立することに成功しました いやいや、普通unsafeなコードというのは外部とのやり取りの薄皮一枚だけで収まるはずなんだがw
Rustだと都合により内側でも使います!
みたいな使い方で、標準ライブラリの中ではやりたい放題されてるように見えるってことw
ベアメタルとかになると標準ライブラリも使えないわけで、薄皮一枚だけunsafeにしても足りず泣く泣くunsafeを使う羽目になり、、、
安全とは一体・・・になりそうってことなんだわw >>449
そんなに無知を曝け出さないほうがいいと思いますよ
「unsafeな操作」とは何か、そしてその避けられない操作に対してRustがどのように
並行並列環境に至るまでメモリ安全性の保証を実現させたのか勉強するのをお勧めします 所有権と速度の問題を回避するためにunsafeに走ってませんか????w >>449
ベアメタルでliballocは使えるからデータ構造を再実装しないといけないケースはあまりないのでは? >>449
unsafeは無くすことできないから閉じ込めるってことなんだが。
unsafeあったらダメ原理主義者ですか? >>432
結局データの配列として持つことになるのはわかるけど、それって指す先が存在するか分からないから実質ポインタとやってること同じだし、途中で要素削除があるとインデックスの整合性保つのに一苦労するじゃん
まあ君にとっては「レアケース」であり「現実に必要となることが存在しない」のかもしれんが、実際に存在するとだけは言っておくわ
あと、配列とインデックスの方がメモリアクセスも速いってのはわからんかった。配列とインデックスの方がポインタより速いってなんでだろ まあベルマンフォードする前に配列とインデックスの形式に変換するくらいのことは出来るけど、結局その前段階のミュータブルなグラフを配列とインデックスで管理するのはキツい
アリーナでオレオレ世代型GCモドキを作った方がまだマシ あとは配列とインデックスの代わりにHashMapとkeyにするとかかな? 配列とインデックスってすげーunsafeなコードだよな
unsafeブロックの外側でunsafeな処理をしている分余計性質が悪い >>455
配列indexでグラフ構造表現する場合、インデックスが変わるような方法で要素を削除することはしないのでは
要素ごとに削除フラグを立てるとか、free listで未使用要素のインデックスを管理するとかが普通だと思う
>>458
ここで言うunsafeってどういう意味のunsafeなの?
rustの定義のunsafeとは違うことを言っているようにみえる >>456
>その前段階のミュータブルなグラフを配列とインデックスで管理するのはキツい
>アリーナでオレオレ世代型GCモドキを作った方がまだマシ
同意 グラフなどのノード構成において
他のノードを指す方法として「idを用いる」のと「ポインタを用いる」のは完全に同型
というのがプログラミングでの常識です
同型というのは通常の管理からダングリングの発生やその防止も含めて同型です
配列に格納してそのインデックス方式も「idを用いる」方式の一種ですから
これも当然「ポインタを用いる」のと完全に同型です
どちらか片方の管理方法がキツイと言ってる人は完全に間違っています
これはGCを考慮した場合についても完全に同型です
誰もそのポインタを指さなくなったことと誰もそのidを指さなくなったことが対応します
したがって配列とインデックスで管理することで管理がキツくなることはありません
そしてGCをする場合も全く同型なので同じ方式同じアルゴリズムで互いに行うことができます >>452
標準のをそのまま使えと?
想定ケース次第だと思うけど、どういうのが多いんだろうね
>>454
主旨が伝わってない...
まあ標準ライブラリ以外でunsafeを使ったら、それをcrateごとに分かるように名前にunsafeを付けるなりはしてほしいね
>>461
循環参照の回避はできてんだろ何言ってんだ… >>461
それは全て正しいが
現実にはそこに付け加えるべき重要な事項がある
GCのコードを書くとわかるが使われたidの一覧が必ず必要となる
ポインタ方式ならば使われたポインタの一覧が必ず必要となる
インデックス方式ならば使われたインデックスの一覧が必要となる
すると『使われたポインタの一覧を管理するコスト』よりも
『使われたインデックスの一覧を管理するコスト(=最大インデックスまで)』がはるかにコストが低い
つまりGCをする場合でもインデックス方式が有利となる
もちろんそれ以外のアルゴリズムなどは同型なので同じという点には同意 循環参照がレアケースとかいう人はもう発言しないでいいと思う
数年間は黙ってみんなの意見を読んで勉強しましょうね
>>423
> 循環参照が必要な時にやれることが「プログラマが注意して管理しましょう」しかない
それがGCなし言語
それがRustの選んだ道
メモリ管理はプログラマが手動でなんとかするしかない
>>445
> 各分野で日々回避方法が研鑽されている
心静かに同意だわ
>>458
> unsafeブロックの外側でunsafeな処理をしている分余計性質が悪い
キミは賢いね >>465
その点についてはおっしゃる通りです
ポインタ一覧を管理するコストとインデックス一覧を管理するコストは同型か否かの枠外です
ダングリング防止やGCアルゴリズムなどは同型となるでしょう
>>466
あなたはRustにおけるunsafeとは異なる意味でunsafeという単語を用いているようです
もちろんRustと無関係な場においてunsafeの意味を独自に用いるのはあなたの自由です
しかしあなたはRustという単語を出していますからRustにおけるunsafeの意味に従う必要があります
勉強して出直してくることをお勧めします だんだん話がオレオレGCになってきたな
結局GCは必要なんだよ
必ずしも標準に入ってる必要はないが、優秀はGCライブラリが存在しないのはかなり痛い >>468
いいえ、GCは必ずしも必要あるわけではありません
GCが必要になるのは少なくとも以下の2点を満たす必要があります
・継続して動作させる必要がある
・使われていないメモリが有意に存在している
例えばGC言語であっても前者の継続動作が必要なければGCさせないモードで動かすケースもあります
一方で後者はGC言語であれば常に使われていないメモリが溜まっていきます
しかし非GC言語ではたいていの場合はメモリ開放をすることができるためGCは不要です
どうしても循環強参照を起こしたいというかなり特殊な状況でなければGCが必要になることはないでしょう あ、循環参照はかなり特殊な条件派のひとだったか
じゃあ話すことはないや >>470
循環強参照を起こしたいかなり特殊な状況であっても
プログラムを継続して動作させる必要がなければGCは不要です
これは広義にはプログラム自体は継続してもその構造が長期継続しなければ成り立ちます
例えばRustならばtyped_arenaなどを用いればその構造の利用を終える際に一気に全体を消去可能です
また別の視点からはデータが単調増加ならば不要部分が発生しないのでこれもGCは不要です
これら全ての条件を相反するような条件が全て揃った時のみGCが必要となるでしょう
もしそのような具体的なケースが頻繁に多数有るならば教えていただけると勉強になりますのでよろしくお願いします なんで特殊な条件派を説得しにかからず初手会話放棄するかというと、仕事で使っていておいそれとネットに晒せないからですね
なので秘密を打ち明けなくても前提に同意してくれている人とのみ話す訳ですよ >>474
一般的な用途ならば仕事に関係なくその一般的な用途だけ話せばよい
そうでないのならば
君も一般的な用途でGCが必要となる具体例は無い派ということになる >>475
一般的な話をすると増えたり減ったりする双方向グラフを更新し続けて持ち続けるという要件になるな
それ以上の説明を求められると何に使うのかという話をすることになり、俺の仕事の説明をすることになる 「一般的な用途」というのがどういう定義なのかしらんが、「Rustで簡単に出来る範囲を一般的と呼ぶ」と恣意的に定義するのであれば俺もその派に入れてくれて良いよ >>476
それならばその双方向グラフの安全な型を作るのがベストソリューションです
ちなみになぜそのような一般的なライブラリがないかというと各々で求められる条件が異なるからです
あなたの場合は求められる条件が確定しているのですからそれを満たす双方向グラフの安全な型を実装できます
例えばノードが削除される場合もその際の条件やその後の処理が独自に確定しているはずです
したがってそれを元に双方向グラフの安全な型を実装して安全なインタフェースのみ提供すればいいのです
そうすればRustのコンパイラに対してもプログラム全体が安全に通るでしょう
そして循環参照についてもその双方向グラフの安全な型が責任を持って取り扱えばよいのです
汎用的なGCは不要でその状況に特化したものを用意すればいいだけなので容易に実現できると思います >>478
まあできるかどうかで言えば出来ますけどね。容易とは思わないけど。
結局>>423なんだよな。そもそも頑張って安全なインターフェースを提供するだけならCでもできるし(>>478には容易かも)
まあ汎用GCついてる言語ならこんな面倒なことしないでいいのでGC言語使おうってことだろうな $ 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
$ >>479
いいえ、C言語にはここでいう「安全な」の定義がないので無意味です
一方でRustでは「安全な」インターフェースを提供する型を作れば
それを用いてコンパイラによりプログラムの安全性を保証することが可能です
>>480
「unsafe」の勉強をして出直して来ることを勧めます
そのread_address_4byte関数は条件を満たせていないので
unsafe fn read_address_4byte(address: usize)と宣言しなければいけません >>481
あー。まあそれはそうね外側でもunsafeなのは頂けないたしかに あれぇ・・・コンパイル通ってないと実行できないんだけどなぁwwww
エラーも何も出てこないんだけどなぁwwww
安全とは???
Rustが安全!?
何をご冗談をw 教官「GC無しで手動メモリ管理してきた言語だ、面構えが違う」
C/C++/Rust「( ゚ω゚ )」 >>482
そう
外側ではunsafeを使わない
その上で今回のケースはその独自仕様の双方向グラフの「安全な」型を作れば、Rustではプログラム全体の安全性が保証されます
そして「安全な」型を作るには
・型が外へ提供する「安全な」インターフェイス群を用いる限り、それらをどのように用いても、型の内部に矛盾や危険な状態を生じさせないこと
・たとえ型の内部でunsafeな操作が存在していても、型の外へは影響せずに内部に封じ込められていること
このような形で新たな型を実装することで全体を安全に解決できるところが他の言語にはないRustの特徴でしょう まあGCライブラリさえあれば双方向グラフも簡単に作れるんですけどね
Javaくらいの出来のGCライブラリがついたら最強 Rustには静的型付けがあるすげー ← スクリプトから来た人
Rustは強力な型推論がある ← スクリプトかC++から来た人
こういう主張をする人は世間知らず
つまり雑魚 関数型言語以外の型推論は大体が変数の型や戻り値型の推論で、HM型推論採用してる言語ってあまりない気がする
もしそうならば非関数型言語にしてはRustは型推論が強力と言っても良いのでは お猿さんは『「安全な」型を作れば、Rustではプログラム全体の安全性が保証されます』などと宣っているが、それは言語で保証しているのではなく、プログラマが手で保証しているに過ぎないw
つまりunsafeなブロックを少しでも含むものはC/C++と変わらないわけで、それを使っている部分も、どこでどう使うものなのか分からない限りC/C++と変わらないということw
さらに悪質なのは、Rustの外のライブラリなどunsafeな何かを呼び出しているわけでもないのに、自前で破壊的なコードを内包できる仕組みw
こうなると、もう外面だけでは分からないわけで、Rustの安全神話は完全に崩壊するw
またこのような状況に拍車をかけているのが自前で破壊的なコードを内包する動機になりやすい所有権の概念w
安全性の根幹をなす部分であるにも関わらず、双方向参照への例外なく簡単に適用可能な安全かつ高速な対応方法が存在していないw
これはプログラマに対してunsafeへの誘惑を助長する形で、逆に安全神話の崩壊を招いているw
まあRustは数ある実装言語の1つとして今後も使っていくとは思うけど、何でもRustに肩入れするお猿さんとはちゃんと線を引いていきたいw 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として挙げられてる主張そのまんまじゃん
まずは議論のベースラインとしてこの記事読もうぜ >>490
全然違いますよ
CやC++ではunsafeなコードがプログラム全体に散らばってしまうため複雑になればなるほど人間にはどうしようもなくなります
一方でRustではunsafeなコードを各ライブラリや各型の中に封じ込めて外へはその影響を及ぼさないことを保証するだけでいいのです
あとはプログラム全体がどんなに大きく複雑になろうともコンパイラが安全性を保証してくれます Rustの推論はプログラム追記で破綻する
後方で馬鹿が型を間違えて追記した場合予想した結果と異なる結果になる
しかもエラーが出ない
仕様が悪い >>493
Rustは孤児ルールがあるからそんなことは無理だぜ >>492
それが実際に違ってなくて同じという主張だろw 日本語読めないのかよw >>491
クソ長い英文読まされた上に被ってる部分が全くなかった悲しみ >>487
javaの出来は良くないぞ
ヒープのサイズかなり引き上げないとすぐメモリ不足になります 底辺プログラマにunsafeを使わせないってことで安心安全になる仕組みなんだね より正確には底辺プログラマや広範囲な用件にRustを勧めないことで、双方向参照要件などの対応に破壊的なコードを混入させない/混入しても経験豊富なC/C++プログラマが書くコードに匹敵する品質にさせることで、安心安全になる仕組みw Rustはお馬鹿さんには使えない
それが一番の参入障壁 >>458
確かにimmutableな配列とインデックスは整合性を保って更新される保証が無いから別の仕組みでラップする必要がある
それってunsafeをラップするのと変わらないかもな out-of-boundsとsegmentation faultは違うw
前者はsafeかつ検出可能な実装ミスで、後者は検出可能か不明な未定義動作w rustがむずかしいお陰で仕事あるからその点はありがたいね >>503
プログラミングできます→馬鹿の可能性あり
Rustできます→馬鹿でない
ステータスになるな プログラミングできます→馬鹿の可能性あり
Rustできます→ステータスになると勘違いした馬鹿確定 実際問題、言語知識の有無なんかよりもそういう無駄なプライドのがよっぽど開発の邪魔をするからな。 アマチュアがステータス目的で手を出す言語:C++, Haskell, Scheme
ドカタが生きるために手に取る言語:Java, JS, php
情報系出身が身につけていがちな言語:C, C++, Pascal, Prolog, Emacs Lisp
電気屋さんが必要にかられて手を出す言語:C
測定機器に囲まれてる人が手を出しがちな言語:matlab, LabVIEW ゲーム開発で使う言語 C++ C#
その他の人向けの言語 Python PrologとLispくらいは簡素なわりに他言語と差があり
学習しておくと各言語を客観視しやすくなって役立つね Prologは果たしてプログラミング言語なのかと言う疑問は置いといて 業界用語だろ
電気屋さん
電子屋さん
はかり屋さん
現場に色々いる 電気屋さんも馬鹿にできないんだぞ
日頃ハンダゴテ握ってるような人も
PICやFPGA触ってたりするんだもん 馬鹿にしてるのは馬鹿だけだから気にすることはない。 >>515
さすがにチューリング完全をプログラミング言語じゃないと疑うのは不勉強。
brain f*ckですらプログラミング言語言われているのに。 よくチューリング完全を引き合いに出す人いるけど、その定義だと感覚的に合わないものまでプログラミング言語の枠に収まるし、prologはそんなこと考えるまでもなくプログラミング言語だろ
しかも(俺は>>515ではないが)515が言いたいのは自然言語に近いと言いたいだけだと思う
実際中身は手続き型の言語と大差ないんだけどw >>522
自然言語は形式言語じゃないから、もしそうならもっと勉強不足だな。 自然言語は全く関係ないな
手続き型言語しかやったことのない似非プログラマーには宣言型言語がそう見えるのか 頭固いねw 例えば、
親(ひろし,ももこ).
親(友蔵,ひろし).
親(友蔵,すみれ).
親(すみれ,ももこ).
男(ひろし).
男(友蔵).
女(すみれ).
女(ももこ).
祖父(X,Y):-男(X),親(X,Z),親(Z,Y).
?-祖父(X,Y).
X = 友蔵, Y = ももこ
みたいなことができるってこと
二個出るけどw プロログはパターンマッチ型データベースに見える
あと同じのが二つ出るのは近親相姦してるからだ prologのノリがどの言語にも持ち込まれてないのも問題だ サーバのバックエンドでwebsocketやるのに一番いいのはGoだよね? >>528
あ、Prologが話題に出たのでFlixを勧めておきます。 https://flix.dev/ >>529
JavaScriptからRustまで何でもサポートしてるから好きな言語を使えばいい
速さや省メモリを求めるならRust "Flix is inspired by OCaml and Haskell with ideas from Rust and Scala."ってどこにもprologさんいないんだがw >>534
"First-class Datalog Constraints"! >>535
お前本当にアセンブラで書いたことないだろw
手でプロセッサやキャッシュを最適にするように書くと、最速ロジックの-O3からさらに数倍速くなるよw
>>536
論理型なら今はPrologでいいと思う アセンブラにするならその辺ある程度は諦めてたな
要件次第だけどw >>528
if文をどの節で処理するかで表現するとか
ループを再帰で書くとか癖が強いからなあ
再帰を理解してくれない人も多いし 日本はPrologまだ使われてる国とかwikipediaか何かに書いてあったよw
世界でどういう状況かは推して知るべしw C11こそ真の次世代言語だ
トーバルズ氏、Linuxカーネルを「C89」から「C11」コードに移行する準備
https://japan.zdnet.com/article/35184296/ >>542
理由が興味深いね
ブロック内スコープ変数宣言をの有用性に気付いたみたい
> Linus Torvalds氏はLinuxカーネルメーリングリスト(LKML)に
> 「この種の非投機的なバグが発生する理由は、C99スタイルの
> 『ループ内での変数宣言』という選択肢をわれわれが今まで持ち合わせてこなかったためにほかならない。
> つまり、list_for_each_entry()といったものすべては基本的に常に、最後のHEADエントリーをループ外にリークさせる。
> というのも、ループ本体内でイテレーター変数を宣言できないためだ」と記している。 >>543
なにがそんなに有効なのかわからんわ
どこでも変数宣言できたら、どこで宣言されてるかわかりづらいだろ
変数宣言は一番最初って決まってたほうがよくね? >>544
イテレーター変数(ループ内だけで使う変数)をわざわざ関数の一番上で宣言するのは
すごく古臭いスタイルって気がする CPUの投機実行関係のバグに関するやつだから結構めんどい話だな 大変興味深いよな
世の中の色々大事なソフトウェアってやっぱCで書かれてんのよね
Linuxの恩恵はC89の恩恵
他のどんな言語でこれがなし得るというのよ
そう考えると世の中ゴミ言語ばっかだな >>550
まるで大事なソフトはLinuxカーネルしかないみたいな言いぶりだな。
こうやって捏造されてくのか。 C言語はベストパフォーマンスを出せるプログラミング言語
ただしLinuxコードでも何度も起きて来たように
C言語は慎重に厳格なコードチェックを常に継続する必要があり
ちょっとスキができると様々な穴が生じてしまう
そこで誕生したのがC言語と同じベストパフォーマンスを出せるRust
Rustは強力な言語機能によりプログラミング効率が上がるだけだなく
メモリ安全性やデータ競合などの問題をコンパイル時にあぶり出し実行時の安全を保証する
つまりC言語の利点を持ったままさらに便利に安全なプログラミングをすることができるのがRustである rustはlibc使ってる
お釈迦様cの手のひらからは逃れられない C言語はGCがないし、整数をポインタに変換できるし
正しくない言語は大事ではないから一個でいい
正しい言語は大事だから色々な方言を作ったり定期的に捨てて作り直したりする ループ本体に変数を宣言できないから
C11に移行するって動機があまりにも前時代的すぎんか? 記事だけだとよく理解できんな。ブロック内の変数宣言はC89でも可能じゃないか? for (int n = 0; ...) みたいな for のスコープの変数宣言のことっぽい? rubyなんかK&Rだぞ?
int foo(bar)
char* bar;
{
return 0;
} その時代のCコンパイラは確かに後から宣言はできなかったよ こういうのだな
$ 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]
$ >>564
それはどうみてもイテレーター関係無いだろ。 ちゃんと記事読んだら違ってたな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
$ 池の水全部抜きますじゃなくて
linuxを全てrustで書きますが始まったら起こしてくれ 多分そうなるな
大量のmod地獄が待ってるからなあ
rustの仕組みを変えるか自動的に全部解決するツールを作るしかない >>568
Rustが次々と採用されていってる案件はいずれも新規と大改修
今動いていて問題もないものを書き直すことはない
新規か何らかの弱点が見えていてシステム改修すべき機会などでRust採用 > Rustが次々と採用されていってる案件
存在しない案件が実績として次々と計上。。。詐欺かな?w linuxのlistってgenericsっぽい作りになってて
任意の構造体に埋め込めるのよね
そのためにマクロでforeachとかあってそのせいっぽいな
仕様のせいじゃなくてそのマクロのせいだろw メインラインの多くはC89でC99もある程度と予想(推測) 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で置き換えました。 それはたまたま実験結果として速くて置き換えた事例がたまたまあっただけだろ
他のwasmを使える言語との比較でもなければ、コードもなくどこまで安全かも分からんだろう上に
実際の置き換えでの効果については記載が何もないw
Rustやばやば言語ですなw 効果も全て>>578の記事に載っている
そしてアマゾンの今回の対象は、テレビやFire TVにスマートフォンなどの再生デバイス上でWebAssemblyを動かしその生成コードはRustで記述しているという話 どこに対する何なのか改善ポイントが何なのかもさっぱりで、効果が何に対応してるのか分からんものを勝手に効果と思い込んでるだけでは?w >>577
なんでコンパイラオプションで指定してないと
思ったの? >>581
それも全て記事に書かれている
日本語の記事なのに読めない知能ならばあきらめなさい >>582
最近カーネルコンパイルしてないからw 自分で使う実験モジュールをたまにビルドする程度w
>>584
書いてないから書いてないって言ってるのにw 知能不足はお前w >>585
カーネルコンパイルを自分ですることと
文法規約守るためにオプションつけること考えるのは
関係ないよね >>585
Rustで書いたWebAssemblyにすることでフレームレートmsから使用メモリ量まで激減したと>>578の記事に載っている >>579
WASM記述はRustを使えないという事情がない限りはRust一択になっている
GC言語はそのランタイムのデカさと発生により普通は採用されておらずC++やRustを書けない特殊な場合のみ
そして過去資産がアドバンテージのC++もここでは既存のソフトのWASMへの移植を除いて新規案件となるためRustがWASM記述トップ言語となっている >>586
オプションがついてるかどうかの事実を知らんと書いただけだがw 他に何と書けばいいんだよwwww >>587
因果関係なんて書いてないじゃんw
>>588
Rust一択になってると思い込んでるだけでは?w
CだってC#だってあるし、多分他にもあるのでは?w >>589
なんでオプションもつけずにやってると
おかしなことを思ったのか疑問になるだろ?
他のレスみても技術も知識も低いというのが答えぽいな >>590
すべてそれも>>578の記事に書いてある
WebAssemblyとRust採用でアマゾンは劇的な効果を上げた >>590
WASM記述言語のシェアトップがRustとなっている現実を受け入れられないのですか? >>589
オプション付けずにやってるかどうかなんて、実際に最新のビルドログを確認して見たわけでもないのにわかんねーだろw
その程度のことをこれだけかけて説明させてるお前の頭が悪いだけw
>>592
因果関係って言葉の意味知ってる?w
>>593
それは否定してないだろw 調査条件は知らんけどなw
文字列渡してDOMに貼っただけ程度ばかりかもしれんしw >>594
昔はBlazor1位だったと記憶してただけだけどw 無知とは恐ろしいねw >>595 で589へのレスは>>591の間違いだったw Rust推しは日付が変わるとID紐付けを嫌ってすーっといなくなるんだなw
どんだけやましいことばかりしてんだよw >>583 をスレ的な言語に合わせてみた(TypeScriptは前回JavaScriptあったので排除)
https://trends.google.co.jp/trends/explore?date=today%205-y&q=%2Fm%2F09gbxjr,%2Fm%2F09gp44h,%2Fm%2F0dsbpg6,%2Fm%2F010sd4y3,%2Fm%2F0_lcrx4
https://i.imgur.com/e7PBEJo.png
Rust何年経っても全然伸びねーよなw
Goはgenerics入るのもあって、上り調子w 日本だけにするとまた違った見え方になるよw
いずれにしてもWeb検索の頻度ベースだから、実際のところ何を目的にした検索になってるのかは知らないけどねw 当然Goはプログラミング言語以外の検索結果を含んでる >>567
linuxの話ならstdはgnu89だしpedanticはつけてないんじゃないの
GNU拡張使いまくってるので >>603
確かにそうだな
使えないとOS的には致命的w >>602
そこは他の言語と同程度の誤差だと思うぞ
結果セットではなくクエリ側だと思うしな
実際に辿ったリンク先の内容の共起性からそうだと判断されてるんだと思う https://trends.google.co.jp/trends/explore?date=all&q=%2Fm%2F09gbxjr
goが登場したのが2009年11月で
2009年10月前のスコアがすでに20あって現在は34
トレンド機能は短いワードだと正確な情報が取れないことは明白 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 別に共起のルールが現在に合ってるだけじゃね?w
たまたま過去でもそういうのを拾ってるだけだろw
しかもそこまで古いと収集データそのものが現在のロジックに適合できていない可能性が高い
つまり何の問題もないってことw googleより自分の方が正しいと思う者だけが書き込んだ結果
をまとめるのがgoogleの仕事 https://about.google/
「Google の使命は、世界中の情報を整理し、世界中の人がアクセスできて使えるようにすることです。」
だそうだし、Googleが正しいとかそういう話じゃないw
集めた元データが古すぎて現行と違うという注意書きあるの無視して「結果がおかしい!」とか言ってもしょうがないだけw
そんな古いデータ見なければいいだけw それだけではない
未来のデータも見る前にフライングすればいい
コンパイル時に分かることを実行時に調べるのはアマチュア 些末過ぎる書き方の問題w
まあC++はかなり頑張るけどw >>607
ノイズ乗ってるって話なら、
rustも同名のゲームがあるから
あまり当てにならないかもね。 またしても go はクソ、何がクソといってまず名前がクソ、っていう俺の常日頃の主張が証明されたな
なんでこんな名前にしたのか、決める前に止めるやつはいなかったのかと問いつめたい ちゃんとプログラミング言語って括りのGoなので、リンク先のコンテンツが分類としてプログラミング関係なんだと思うぞ Surface GoとかDuckDuckGoとかコンピュータ関連用語でGo含む固有名詞多いからプログラミングに絞ってもノイズは乗ってそうな気がする
他言語との比較はできないけどGo単独の傾向を見るならgolangの方が正確かと >>620
プログラミング「言語」なので、共起性で分類するのが基本だからGo言語で固有の言葉の類似度が上がるのが普通
golangにすると、逆に「プログラミング言語」が外れ、恐らく共起性が寄与せず間違ったゴミが入り、正解が漏れる
>>621
C言語とかも「プログラミング言語」として出てくるので多分大丈夫
いずれにしても古いデータは分類用のデータがない可能性があり、上の仮定ができない
知らんけどw おじさんはもういろいろバレてる
偉そうに言っても滑稽だよ はいはい、煽るだけの人は楽だねw 煽ってたら答えがもらえて良かったねw 内容のない煽りだけって逃げなんだよなぁ…お前のことだよw 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)。サンドボックスのバイパスにつながる可能性 adblock plus 入れておくとメモリ使用量がどんどん殖えて恐ろしいことになってたがバグだったのかヤッパリ
一応報告しておいたけど >>628
C++で書かれたコンポーネントみたいだけど でも誰もfirefox使ってないじゃん。rust推しでさえ。 現在のFirefoxはChromeより軽い
タブを数百個開いていてもFirefoxは重くならない Safariも謎にスコア高いな
スコアの意味わからんけど、とりあえずchromeがダントツで点低いことだけはわかった C#もなかなかに検索に厳しいネーミングだ
結局Csharpとか書く破目になる >>638
足を引っ張っていた過去を捨てたFirefoxが一番優秀になっているんだな 別にRust採用前から遅くなかったfirefoxが再評価されてるだけw #はシャープじゃないけどな
シャープは五線譜に書くときに横線がかぶらないように横が斜めで♯
#はナンバーだからCsharpならc♯ 変に捻ったことせずC4+みたいな名前にすりゃあ良かったのに。 シードン、いやマジで語感はそっちのほうがいいじゃん
今からでもいいからそれに変えてくれ
定食屋でコラボするという可能性もでてくるし https://en.wikipedia.org/wiki/C_Sharp_(programming_language)
"C# (/si ʃɑːrp/ see sharp)[b] is a general-purpose,..." まあgoなんて一般的な動詞を使うのが今のところダントツでセンスないのは間違いない しかも元々Go!っていう言語あったのに、あとからGoogleがかぶせてきよったしね
https://github.com/golang/go/issues/9
> I have already used the name for *MY* programming language
> Here's the Lulu link: http://www.lulu.com/content/paperback-book/lets-go/641689
TypeScriptとかPrologみたいにユニークな名前を付けてほしかったなあとは思う タイプミスっぽいやつは日本でいうと誤変換のようなものか
もしかして自虐的な発想の方がセンスがいいのでは rustも時々検索に変なのが引っかかってみたこともない画像出してくる C++始まったな
「C++Builder」誕生から四半世紀、「C++Builder 1」が無料でダウンロード可能に
https://forest.watch.impress.co.jp/docs/news/1394721.html >>656
仮想でWin95動かしてその上で使う
まあ実用的な意味はほぼないだろうね >>658
Visual studio Express Editionみたいに実用的に使えるけど無償のツールなんていくらでもあるだろ >>654
エンバカデロC++Builderの新しいのも無料で出してなかったっけ?
どうせ1なんて商用で使えないだろうしcommunityでいいだろ感 お前らのPentium 133MHz メモリ16MB HDD2GBのマシンに入れたらいいじゃん
テレホタイムになったらネスケでダウソしろよ Pentium 200MHz, 128MB, 6.4GB x 2 のスーパーハイエンドマシンを動態保存してる まじかよw
そんなのあってもその時間は俺のエロ画像取得perlスクリプトが忙しくしてるからテレホタイムにダウンロードは無理だなw ____∧∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
〜' ____(,,゚Д゚)< ボーランド逝ってよし!
UU U U \________ >>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++かも?) そもそもlinusが問題としたのはそこではなく、その問題を「解決するパッチを適用しようとした際に、該当パッチが持つ別の問題」のことw
つまり一通目はただのきっかけで、二通目が問題の本体w
昔から文の代わりにブロックをどこでも作れたかどうかは知らないけどx86 gcc1.27では出来る模様
https://godbolt.org/z/WPz7a67fK rustはゲームタイトルの方が1000万人をゆうにこえてて
そっちがrustが検索で上がってきてる主要因。
プログラミング言語としてのrustはいうほど広がってない、
一時のHaskelやたらもてはやしてたのよりはマシな動きといった程度。 >>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人になってしまうのだけど。
(書けるという意味ではなく、毎日仕事としてゴリゴリ鯖を書いてる人数なら、この程度の気もするが) >>670
そのページのサーバシェアはWebページのソースから使われてるテクノロジーを推定するってやつだからバックエンドとして使われがちなGoやRustの使用率はあまり反映されてないと思うよ
Rustのライブラリ総数が8万弱だから、ライブラリのメンテナが1万くらいはいるかな
ライブラリ使うだけの人が10倍くらいいるなら10万というのは有り得なくもない
100万は確かにちょっと盛り過ぎかもね そのページでPHPが圧倒的なのは、要はみんなWordPressを使ってるってだけのことであって、PHPプログラマが全体の7割以上いるってことではない >>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桁落ち程度までは来てるって事か。 数倍差まで差し迫ってるんだな
>>674
アメリカ
6.16% C/C++
1.69% Rust
ドイツ
3.89% C/C++
1.66% Rust
イギリス
7.79% C/C++
1.83% Rust この比較も興味深いな
アメリカで僅差
イギリスで逆転してる…
>>674
アメリカ
1.78% Go
1.69% Rust
イギリス
1.83% Rust
1.47% Go Rustは順位こそ上がってるもののtrendsとしては下降してるけどね >>674は去年のデータなのか
最新を見つけた
2022年3月
https://pypl.github.io/PYPL.html?country=US
3.34% Swift
2.74% Matlab
2.68% Objective-C
2.39% PHP
2.36% TypeScript
2.27% Rust
1.94% Ruby
1.72% Go
1.28% Kotlin
スレタイ言語とその前後の分 コロナでwasm利用が一時的に増えてチュートリアルなど読む人が増えただけだと思う >>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位)とは規模が合うが。 数を気にするの日本人らしい
でも何で日本語なんてマイナー言語使い続けるんだろ? >>681
キミは日本人以外の何をどれだけ知っていて
どれほどのサンプルから有意差を見出しているの? >>680
だから一時的なもんだろうと言ったんだが・・・Rust信者は日本語も読めないらしい
個人的には
tiobeは興味本位で覗く人の数、先鋭的だけど流行に敏感
PYPLは実際に学ぼうとしてる人の数、割と実態に近いけど、採用実績というよりは希望に近い
と思っている >>686
どちらの言語もグラフがあまりにも乱高下しすぎているため
その調査は信頼できないと思います
まともな調査であればそのように激しい乱高下は起きないはずです 検索数なので素人が多くポインタ周りで検索しがちなCや言語仕様がクソほどでかいC++は多くなりがち。HP作るために仕方なく調べてるケースがあるJSもそういう傾向あるかな >>686
GoもRustも同じく2017〜2018年あたりで信じられない大急落をしている
tiobeの調査自体に問題があると思われる
tiobeのデータは信用できない >>686
PYPLもグラフは出せるよ。
678のページで下に行ったら言語と地域を選べる。
WorldWideなら、
Goは飽和気味、
Rustは乱高下しつつも増加中でそろそろGoを抜く、
C/C++は漸減傾向だったが復活気味。 後発のGoと更に後発のRustがまだ遅れているのは仕方ないですよね どちらかというと、このグラフは後発ほど有利なはずなんだけどね
JavaやC#は鳴り物入りで出現してあっという間に広まった
goの良さは玄人にしか伝わりにくい面があると思うので時間かかるのは仕方ないけど
Rustは現状だとごくごく一部の信者が必死になって喧伝してるだけのマニア向け言語だからどう見るかは微妙 >>692
TypeScript/Kotlin/Dartを重ねると現実が見えるかも
自動的に単調増加する程甘い世界ではない(ゼロサムだから当たり前だが) ごくごく一部のマニア(MS,Google,Mozilla,Amazom,Meta) >>695
GCなし・高機能・低レベル記述可・データ競合やメモリ安全性の保証あり
というプログラミング言語がRustしかないから
IT大手企業が揃って推している特別な存在ですね >>695
MS,Google,Mozilla,Amazonなどは出資してるだけで喧伝などしていない
彼らの土俵に非常に狭い有用な領域があるってだけw
それを見て勘違いしたごくごく一部のマニアが信者化して喧伝してる データ競合が起きにくいからってだけだよ
それを実現するために払った代償が大きすぎて、彼らも他の領域に積極採用しようとはしていない
その代償を払ってもお釣りが来るほど、性能+品質が重視されるニッチな領域を彼らが持ってるだけw >>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はがして何とかなるか、という実験としては良いが、実際その程度の意味しかない) >>699
Rustは並行並列時でもデータ競合が完全にないことを保証できる
初のプログラミング言語 >>700
お前らの「データ競合」が何を意味してるのか分からんが、
試しにJavaScriptでその「データ競合」する簡単なコードを書いてみてくれ。 >>702
分かってて言ってる。
だから「初の」ではないね、みたいな。
まあちょっと意地悪が過ぎたね。やめよう。 >>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の分かりやすい成果だと思う(関数ポインタは実装なので関係ない)
最近の言語は構造とロジックは分離してるのが主流だけど、考え方は今でも有効だと思う
構造とロジックが緊密になりすぎて少し窮屈になるきらいはあるし、そうなるくらいなら分離もありだとは思う なんていうか・・・飼い犬に噛まれる的なことがないのがgo言語w >>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にはちょっと驚くのだけど。 >>707
> それは「自分の足を撃てるか」だな
伝わらなそう。
危害を加えられるということではなく、特別に何か出来るわけでもなく、普通に思ったことが思ったとおりに出来て、想定外のことが起こらない的な意味。
> 俺はC#のその辺は「GUIコンポーネントを触れるのがメインスレッドだけ」という、
普通に呼ばれた先がスレッドセーフじゃないからだと思うけど…
同期を取ることそのものがコストになるし、そのコストを嫌ったのが元々の非同期の発想だと思ってたから、俺は違和感なかった
実際のところはMSの中の人じゃないから知らない
> > デザインパターンはOOPの分かりやすい成果だと思う
> その割には今全く聞かないだろ。
そうでもない、GoFの初期のパターンはもう各パターンが独り歩きして日常的に使われてるからそうおもうだけだと思う
> > 構造とロジックは分離してるのが主流だけど
> というよりはCでは分離出来なかった(分離しにくかった)からその頃はそんなもんだと思ってただけで、
classがないって意味だよ
> なるほどCでもこうやれば分離出来るのか、マクロって本来はこう使うべきだったのか、
Cにはテンプレートないからな… >>708
> 同期を取ることそのものがコストになるし、そのコストを嫌った
そりゃそうだが、現実的にロックが必要なのはGUIコンポーネントに「書く」時だけで、
つまりGUIを実際にユーザーが操作している瞬間であって、速い必要が全くない。
そしてロック周りはメソッド内に隠蔽してユーザーからは見えない状態に出来る。
だからそうすれば良いだけなのに、
結果を画面に表示したいだけの為にInvokeとかドタバタしないといけないのは間抜けすぎ。
とはいえ当時は我慢してたが、JS知ってC#のGUIは完全にゴミだったと理解した。
そりゃJSが快進撃するはずだよ。
デザインパターンについては俺はゴミだと思ってるよ。
あれは言語機能の不足分を示してる、という奴がいるだろ。それに近い。
例えばイテレーターパターン、コンテナ/イテレータ/処理をコンテナ/(イテレータ+処理)と切るわけだが、
関数型(forEach)は(コンテナ+イテレータ)/(処理)、で切るだろ。
イテレータはコンテナと密結合なのだから、どう考えても関数型の方が妥当。
イテレータの管理なんてしたくもないし。
当然関数型も流行るし、Javaも関数ポインタを入れないわけには行かなかった。
だから、言語機能が整備されたから聞かなくなったけど日常的に使われてる、というのならまあそうだが、
おかしなパターン作りに邁進するのではなく、不足してる言語機能をさっさと充足させれば済んだ話。
方向性を完全に間違ってる。
> Cにはテンプレートないからな…
テンプレートこそマクロで書ける、というより、
テンプレート的なマクロを追い出す為のテンプレート導入なんだけどな。 >>709
> とはいえ当時は我慢してたが、JS知ってC#のGUIは完全にゴミだったと理解した。
スレッドセーフにすると同期処理が入って遅くなるだけ、必要な同期を外で取るか中で取るかの設計選択でしかないので、スレッドを作らないときに遅くなる設計選択をしなかったというだけでしょ
逆に言えばもしスレッドを別にするならちゃんと同期してね、という意思表示でもあるだけ
別に俺は何とも思わなかった
当時のJSはクライアント側なので何の関係もないし、そもそもスレッドがない
> デザインパターンについては俺はゴミだと思ってるよ。
言語機能の不足とは違う。OOは言語を限定しないから。
> イテレータはコンテナと密結合
イテレータは抽象化されてるので密結合はしていない
> テンプレート的なマクロを追い出す為のテンプレート導入
俺が導入したわけでもないけど、型がないこと、ただの置換では限界があることの回避だと思ってた デザインパターンが大々的に使われる言語ってのは抽象化能力が低いって事だと思うんだよな。まぁあんまり細かいとこまで抽象化しても使いにくいから細かいパターンは何にでもあると思うけど。
GCがあれば安全ってのもちょっと視野が狭いんじゃなかろか。メモリが確保できない時(エラーを生成する余裕すらない時もある)とか、ここでGCに動かれては困る、とか。 大々的に使われるという認識がもうおかしい
デザインパターンというのは昔からよくある、前提が揃ったとき、こうやっとくと割と上手く行く定石みたいなもの
そもそも要件次第で適用され、実装言語で表現するだけの代物だよ
GCがあれば安全とは、二重開放やリークなどの問題からの開放を意味するだけ
一般的にはリスクなので安全の一要素ではある
GCの実装は通常最低限の動作をするのに必要なメモリを最初に確保する
ここで動かれては困るは制御できるのとできないのがあるし、そんなのは実装次第
調べれば分かる仕様であり、安全とは無関係 概ね同意。
大々的にってのは言葉が悪かったな。パターン以外で表現できず、必然的に乱用された、一時期のJavaみたいなのはおかしいだろってだけなんだ。 必要もねえのに勉強しちゃって
必要もねえのに乱用しちゃうのが問題
必要なひとは必要な分だけ黙って使ってんのよデザパタなんて
イテレータパターンなんて
使うだけの人には不要なのよ
イテレータを提供する側の人
ライブラリを提供する側の人が
実装前にそっと紐解くのがイテレータパターンなんよ
で、使う側の人が「イテレータパターンは不要」とか抜かしてる裏で
すでにライブラリ作者によってパターンが適用されてんのよ ×使うだけの人には不要なのよ
○イテレータ使うだけの人には不要なのよ そういえばRustマンセーの人たちはデザインパターンやDI知らん人が多いよな
業務の人じゃないんじゃないかな rustにもデザインパターンと呼べるようなものはあると思うんだけどね
そう呼ばないだけて マスコミ業務の人はインターネットのことをそういう目で見ている DI使わないでどうやって大規模開発してるのか謎なんだがな
架空の大規模開発してるのだろうか? DI使わず大規模開発は普通に可能でしょ
そんな頭で大規模開発してることが謎だわ >>710
> スレッドを作らないときに遅くなる設計選択をしなかったというだけ
その通りだが、GUIでは事実上「スレッドを作らない」という選択肢がない。
メインスレッドで(確か)10秒以上のジョブを実行すると「GUIが固まるだろボケ!別スレッド起動しろ」と怒られ、
仕方なく別スレッドを起動すると、結果を表示する際に「GUIコンポーネントは別スレッドからは触れねえよボケ!Invokeしろ」と怒られる。
よって、「計算結果をprintfするだけ」のCUIアプリをGUIにするだけの為に、「別スレッド起動してInvokeする」コードが必要となる。
全く馬鹿げてるよ。
どうせ計算結果を待つしかないのだから、待つ間にGUIが固まってもどうって事無い。
それが嫌なら「別スレッド+Invoke」で、面倒で手抜きしたいのなら「GUI固まりますがどうぞ」でよかったのだが、
MSは後者の選択肢を残さなかった。
JSだとこの辺の糞っぷりが全くなく、別方法で綺麗に解決されてた、というわけ。
まあ見解の相違はおそらくそちらはCUIアプリが主だったか、真面目に実装するタイプなのだろう。 > イテレータは抽象化されてるので密結合はしていない
イテレーターパターン推し連中の公式見解だな。
ただ、目的とどこまでやるべきかを考えれば、問題点は簡単に分かる。
俺は、
目的: 同一コードを走行させる為、コンテナ非依存にする為
どこまで: 全部
と考えてる。抽象化が「本質(共通)部分のみを抜き出す」事なら、共通部分が残っているようなら抽象化が不十分だ。
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 の呪文を毎回書かなくて済む分関数型の方がいい。
だからあの関数型アゲは腐りきったデザインパターンへのアンチテーゼの意味もあると思ってて、
実際デザインパターンアゲが消滅次第、関数型アゲも消滅したろ。 で、ついでに言うと、イテレータ自体はコンテナと必ず密結合してる。
コンテナの内部構造を変更されたらイテレータ自体も変更しないといけないだろ。(イテレータを使う側のコードは変更不要)
そして、
イテレーターパターン:オレオレコンテナにはイテレータを用意しろ --- (A2)
ダックタイピング:オレオレコンテナにはforEachメソッドを用意しろ --- (B2)
だが、イテレータの用意は共通インタフェースにする程度の設計は必要なのに対し、
forEachメソッドの用意はただ回せば済むから、A2よりもB2の方が簡単なんだよ。
ここで「簡単」で済む理由は、B2の方が「自然」だからであり、A2で切るのは「不自然」だからだ。
コンテナとイテレータは一体であり、内部処理はそれとは全く関連無いから元々疎結合。
それを(コンテナ)/(イテレータ+内部処理)と無理に切るからおかしくなる。
(コンテナ+イテレータ)/(内部処理)なら元々疎結合のところで疎結合にしてるから余計な手間がかからないという、ごく当たり前の話。
Javaが最初から関数ポインタを扱えれば、イテレーターパターンなんて存在せず、敢えて言うなら
・forEachパターン:コンテナは必ずforEachインタフェースを継承/実装しなければならない
とかになってたと思うぜ。(もはやパターンではなくただのコーディングルールだが)
>>711
> メモリが確保できない時(エラーを生成する余裕すらない時もある)とか
Javaの場合はもしもの時用に1MBのメモリを確保していた。
ただ、メモリで落ちた場合は「あと数KBあったら落ちずに済んだのに…」が大半だろうし、
非常用に1MBはでかすぎるだろ、という事で、最近は500KBに減らされたと聞いた。
>>714
> 必要もねえのに勉強しちゃって
それは「デザインパターンの意義は、命名した事くらいだ」の人達の意見だし、実際これも当たっているが、
もともと「頻出パターンを学んで初心者から中級者へジャンプアップする」為の物であり、学習用だ。
そして「この場合はこう実装しろ」を規定するのはコーディングルールや設計方針であって、
「頻出パターン図鑑」であるデザインパターンではない。 外部イテレータに対し内部イテレータをこんなに有難がる奴初めて見たわ >>726
そうなんだけど、じゃあ何型だ?と言われて、手続き型に入れるわけにもいかんだろ。
Cでは上級テクニックだった関数ポインタを、
スクリプト言語(Python/Ruby/JS)では初心者でも常用してる。この違いは大きい。
そして関数ポインタをカジュアルに使えばコードは単純になることを証明してしまった。
逆に、Java周りの歪みは「関数ポインタを使えない事」による物が大きい。
(だから今後は徐々に改善していくのだろうけど) >>723
別に全く苦ではなかったね
>>724
書き方だけだし、C++やJavaやC#などクラスある言語でも普通に簡単な書き方がある。Cでマクロがあるくらいなんだから当たり前だけどな。
>>725
シグニチャにiteratorしか入っていない以上密結合していようがない こんだけ長文書かれるとどうしても、あちこち突っ込みたくなっちゃうな >>729
Reflectionでもinterfaceでも似たようなことできるし、それが必要と思ったことがない
C#のdelegateみたいな機能は新鮮だったけど GoFのデザパタ本ではイテレータパターンでは
> ◎実装
> Iteratorパターンには、実装に関して多くの方法とその変形がある。(略)
> 1.どのオブジェクトがiterationをするか
> (以下、内部外部イテレータの紹介部分略)
> 外部iteratorは内部iteratorに比べてより柔軟である。
> 2つの集合が等しいことを外部iteratorを使って比べるのは容易だが、
> 内部iteratorでは実用的には不可能である。(以下略)」
つまり、内部イテレータも外部イテレータもパターンとして既出
どっちの実装もともに検討されている スレタイの言語の中でjavaで培われたデザインパターンが効果的な言語ってあんの? 知らず識らずのうちに使ってしまってるのがデザインパターンだよ
名前がなかったからあえて付けて一言で通じるようにしたことがGoFの功績 初心者のうちはデザパタに興味持たなくていいよ
必要性を感じてからはじめて手を出せばいい
興味本位だけで手を出しても何も得られない
勉強にもならない
半可通によるデザパタ乱用か
デザパタ不要論者になって暴れだすか
繰り返すが
デザパタには必要にかられてから手を出せば十分 >>733
> それが必要と思ったことがない
それはJavaの話?なら最悪だと思うのはGUIで、
element.onclick = function(){};
が書けないものだから、
1. elementを継承したオレオレエレメントクラスを作って
2. それにonclickインタフェースを継承して、そこに処理を書く
とかやるんだろ。一応デコレーターパターンになるのか?
どう考えても頭おかしいし、最悪だろこのソリューションは。
当然JavaのGUIなんて早々に滅亡した。
ただまあ、Java作った奴が馬鹿だったわけではない。
(むしろ一番成功した言語なので、一番賢かったとも言うべき存在)
当時は関数ポインタの重要性が今程認識されていなかっただけの話。
ならさっさと入れれば良かったのに、
そこをデコレーターパターンで誤魔化してきた奴は死刑でいいよマジで。
というのもあって、俺はデザインパターンはゴミだと見ている。
そもそもそれが本当に頻出なら、簡単に書ける構文を用意しておくべきだ。
だから整備された言語なら何も意識せず自然に書いてても
結果的にデザインパターンのどれかに分類される事と同じ事をやってるはずで、
今現在はそうだと思ってる。 >デザパタには必要にかられてから手を出せば十分
後から必要にかられることなんてあるのかね >>739
awtの頃はそんな感じでいろいろ大変だったと思うけど、JWTとか出てきてからは内部クラスでやるようになって、そこから先はJava2Dとかいろいろ出て来たけど追ってない。
今はJavaFXみたいだけど、まるで浸透してる気配はないね。
そもそもで言えばJavaでGUIはあんまりやらんけど、理由はクライアントツールならWindowsだから.NETでいいという感覚からだと思う。
個人的にはnativeと繋ぎやすいなど、.NETの方がメリットを享受できたからだと思うよ。
何度も言うけど、JavaScriptと比較するのは根本的に間違っている。 うっかり用語素で間違ったw JWTじゃなくてSwingね >>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だけなら今でも使えるはずだが)
でも糞過ぎて誰も書かなかったので、セキュリティが云々という適当な言い訳で廃止されて現在に至る。
というわけだが、デザインパターンが言語の不備を隠蔽するバッドノウハウ的に使われてるようにしか見えなかったから、
俺はデザインパターンを全く信用していない。
とはいえ、今時の言語とフレームワークを使ってれば、それを○○パターンと呼ぶ事を知らないだけで、
普通に使っているはずであり、これが正常な状態だと思う。 継承は結構GUIと相性良いので、その主張はズレてるとしか感じないな。
関数が第一級オブジェクトであるメリットはそんなGUIがどうのこうのなんて狭い範囲で語れる話じゃないし。 >>743
Webの画面をGUIとは言わない…
Webであれば、基本はHTML+JavaScript(+CSS)であり、これに最近wasmが付く程度
サーバー側の言語はいくつかあるが、最終的にクライアントに送れるのは上記であり、表現は違わない
最近は仮想DOMを使用するタイプのクライアント側でテンプレートを流し込むコンポーネントを記述するのが普通で、デファクトはJavaScriptを使用するreact
Javaで典型的なSpringは業務に使用されることが多いため、そもそもSPAである必要がなく、昔ながらのサーバー側でテンプレートを流し込むページ記述が普通だと思う
双方を比べるのはいささか不自然で、なんで比較したいのかすら分からない
C#だとBlazorがあって、これだとwasmを使うことでクライアント側も.NETで記述できる
あんまり人気ないけどね
何に対してどんな文句を言いたいのかサッパリなので、よく整理してから話すように >>744
エスパーするが、
> 継承は結構GUIと相性良い
これはGUIコンポーネントを『作る』側、つまりフレームワーク作成側の話だろ。
俺が言ってるのは『使う』側、つまり実際にJS同様GUIのコードを書く時についてだ。
> 関数が第一級オブジェクトであるメリット
ちなみにこれは俺は未だに理解出来ないので具体的に教えて欲しい。
実際、関数にメソッドを生やせるだけで、何かが出来るようになるわけでもないので、
全部入りのC++もまだ第一級オブジェクトとしての関数を入れてないし、多分検討もしてない。 >>745
> 何に対してどんな文句を言いたいのかサッパリなので、よく整理してから話すように
いや文句を言うのは既に終わってて、俺のスタンスを繰り返し言ってるだけ。
だからまあ、もう終わりでいいのも確か。
> Webの画面をGUIとは言わない…
それはない。ユーザーがGUIと思えればそれはGUIだよ。
VSCodeをCUIとは言わないだろ。
WebアプリにしてもGUIだし、ガワアプリは中身がWebコンポーネントだからJSだよ。
> 昔ながらのサーバー側でテンプレートを流し込むページ記述が普通だと思う
それは表示するだけのページだね。それはWeb『ページ』と呼ばれる。
GUIだと言われるような物はWeb『アプリ』と呼ばれる。
まあしかし、合意を形成する必要もないし、
言いたい事は既に言ってるし、まあ終わりでいい。
色々ありがとう。
少なくとも当時のC#使いが全く問題を感じてなかったという事だから、
・C#はもともとGUI向けの設計ではなかった
・.NETはそもそもユーザーの想定レベルが高くて無駄に苦労する
のかもな、とは思えてきた。 >>740
自分が当たり前にやってることを他人に説明する必要が出てきた時にパターンの名前が必要になる >>702
データ競合はシングルスレッドでも当然起き得る
>>704
並列処理だけでなく並行処理でもデータ競合は起き得る
>>703
どんなケースでもデータ競合が起きないことを保証する初のプログラミング言語はRustで合っているのではないか >>747
> > 何に対してどんな文句を言いたいのかサッパリなので、よく整理してから話すように
> いや文句を言うのは既に終わってて、俺のスタンスを繰り返し言ってるだけ。
> だからまあ、もう終わりでいいのも確か。
じゃあ終わりで
最後にWebの画面レンダリングをGUIに持ってくるケースはある
JavaScriptのelectronやRustのtauri、古くはIEコンポーネントみたいなので非常に特殊なパターン
vscode他を除けば、ゲームとかワンチャンモバイルも狙うGUIでたまに使用されるとか、アプリでWebの画面を出したいとき稀に使用される
嵩張るために滅多に使用されないか、こっそり使用されることが多い >>749
とりあえず「データ競合」の意味を具体的に明確にしてくれ >>749
正確には「保証する」みたいな強い言葉だとそれだけで独り歩きするのでいかんw
「仮定することができる」くらいだな >>709
イテレータはコンテナと密結合、は間違い
そのようになってしまっている悲しい言語も存在するだけにすぎない
例えばRustなどではイテレータ連鎖に一度もコンテナが登場すらしないこともあるように
イテレータとコンテナは独立の存在
コンテナの中身を順に出すイテレータを作れるとか
イテレータが吐き出したものをコンテナに格納できるといった
端点で関連するケースがありうるだけにすぎない >>718
どんなプログラミング言語にだってあるよ。
デザインパターンってのは似たような問題領域における対処法や設計ノウハウに共通の言葉を定義したコミュニケーションツールだからな。 デザインパターンの時代には抽象化されたループや分岐が作られた
それを具体化するたびにクラスを作りクラスに名前をつける
まるでgotoの行き先にいちいち名前をつけるみたいに
そのあとラムダが普及して名前をつける必要がなくなった
whileやifやelseのブロックに名前がないのと同じ >>753
> イテレータはコンテナと密結合、は間違い
間違ってねえよ。
というか、多分「密結合=悪」と洗脳されてるから否定したいのだろうけど、
俺が言ってるのは、
・コンテナとイテレータの関連は、
イテレータと中身の処理の関連より100万倍くらい強い
という事。だから
・コンテナとイテレータの結合は、イテレータと中身の処理 より 100万倍密結合
であり、これを密結合と言わずに何という?という話。
そりゃイテレータで無理矢理切り離せばコード上は切り離せるけど、それやっても大してメリット無いし、
ほぼ100%の状況で「頭から全部イテレート」で済むんだからforEach(関数ポインタ)の方が筋がいい。
そしてJSのArrayなんてイテレータはないよ。実際要らんし。
forEachが遅かったからイテレータ、ならそれは「言語の不備」だよ。
C++はその辺順番を入れ替えて同速にしてしまったし、知らんがRubyでもlazyモードで同様なんだろ。
勿論イテレータの方がいい場合もあるはずだが、これは昨今のimmutableや再代入を避けるのと同様、
これまでは不要にイテレータを使いすぎてただけ。
本当にイテレータが必要なところだけイテレータにして、その他はforEach(関数ポインタ)の方がいいよ。 何度も言うが、デザインパターンの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は疎
どうしてここまで説明しないと分からんのだ…
あと関数ポインタなどいらん
内部イテレータ方式喜ぶバカなんてお前くらいだ 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);});
}
} イテレーター原理主義なんじゃないの
コレクションの要素を列挙するものしかイテレーターと呼ばないと考えてるとか >>749
シングルスレッドでデータ競合起こるコード例あんの? void f(int*a){
int*b=a;
*a=(*b)++;
}
みたいのはただの未定義動作だから許さんぞ >>749
保証していないよ。unsafeがあるだろ。 >>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」と表示するけどコンテナ等は全く登場しない >>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) https://ideone.com/AKsoei
javaの典型的なイベント処理はこう
多言語のようにonclick = と指定するのではなく
イベント発生元にaddListener()でリスナを追加する
その時匿名クラス式を使うのもまた大昔からのやり方
匿名クラスについては以下を参照のこと
https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html どの言語でも『single writer XOR multiple readers』の原則を守ればデータ競合は起こらない
逆にそれを破ればシングルスレッドでもデータ競合は発生し得る
ほとんどの言語でデータ競合が起きる
>>762
Rustは『single writer XOR multiple readers』を言語仕様で満たしている
そのためRustではメモリ安全性だけでなくデータ競合も起きないことを保証している
もちろんC/C++と同じように生ポインタを使えるunsafeを使った場合はその部分を人間が責任を持つ >>765
匿名クラスは内部クラスの一種だけど、通常はそういう書き方だね
>>741で言ってるのもそれのこと
>>766
まあRustもunsafeまみれだから安全じゃないけどね >>763
配列以外の実体に対しエミュレーションして配列メソッドを使いたい場合、イテレータはインタフェースとしては有効だ。
ただそれは「イテレーターパターン」使用箇所の1%以下だろ。
>>764
それは一般的にはレーシングコンディションと言う。(wiki書いた奴が無知なだけ)
そして、その定義ならErlangは問題ない。理由は、
・変数は再代入禁止なので、定義しか出来ず、書き換えようがないから まあシングルスレッドでも普通にコールバック多いと意図しないデータ競合はいつでも起きるけどな
言葉の定義の問題になるので俺は黙ってたけど・・・ >>768
それはwikipediaにソースが明記されているように
JavaScript(ECMAScript)の公式仕様書の記載です
ErlangはETSが共有データとなるため
留意してコードを書かないとデータ競合が発生します >>765
それもしかしてわざわざ書いてくれた?ならどうも。
名前からしてそれは「アダプターパターン」になるのか?まあこれはさておき、
これがデザインパターンの問題を典型的に示してるとも思う。
デザインパターンは「実際にこう書ける」であり、「こう書きたい/書ければいいのに」ではないので、
実践的ではあるが現状肯定的で、理想的では全くない。
だからどうしてもバッドパターンが混ざり、言語が酷ければ酷い程それが増える。
Javaの場合は関数ポインタを直接取り扱えない事が致命的に欠点で、結果、
関数ポインタ専用コンテナとしてクラスを用いて継承をこねくり回したパターンが多くなってるが、
それらは他言語では不要なものばかりだ。
本当は「あらゆる言語の中で一番美しい書き方」集にすれば良かったのだろう。 上記の通り、結局それは、関数ポインタを直接扱えなかった欠点を回避する為に、
関数ポインタ専用コンテナとして「匿名クラス」を用いているだけ。
素直に関数ポインタを直接扱えるようにすれば不要だった。
勿論ラムダの代替にもなるが、結局ラムダも入れてしまってるのだから、やっぱり「クラス」に見えるのは使いづらいんだよ。
(この辺は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){};
で済まされるが。 あとついでに言うと、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からバブルする) >>770
ESの仕様にあるデータ競合はWeb Worker(つまり別スレッド)とSharedArrayBufferなんかでメモリ共有した場合の話であって、シングルスレッドでデータ競合すると主張しているわけではないと思うが シングルスレッドでもデータ競合は起きる
>>769氏も言っているように >>770
> https://262.ecma-international.org/10.0/#sec-data-races
race は レースであって、競合なら confliction だよ。訳が不適切。
ただ、レーシングコンディションならRustでもいくらでも作れるはずだけど。
shared memory が出来るのだから、
同じ場所を書き換える非同期ジョブを適当に流し込めば自動的にそうなる。
Erlangでは出来ない、ってのは、上記の「同じ場所を書き換える」事が出来ないからだよ。(共有メモリも出来ない)
ETSってのは知らんが。 >>771-773
だから内部クラスで書けるっての >>775
>>769がコールバックの呼び出し順序が非決定的であることを言っているならそれは競合状態(race condition)
データ競合(data race)ではない >>778
俺が言ってるのは単なる不注意だよ
順序は決定的だけど、離れすぎて分からなくなるパターン >>779
決定的なら競合すらしないと思うが…
単に論理バグで値を壊してしまうことはデータ競合とは言わないのでは だから言葉の定義w
関数やメソッド単位で見る人間にとっては、再入とかコールバックが輻輳してやらかす事件はとても似てるw
組込みの割込みとかシグナルとかのIPCも同様なので、まあ混ぜて考えてもいいと思うって人はいるんじゃないかと思ったw >>776
data race(英語)⇔データ競合(日本語)です
ETS (Erlang Term Storage)はErlangが標準で持っているインメモリの領域
ETSはErlangで色々辛いところを解決する魔法の道具であり抜け道でもありGCもなくデータ共有もOK
>>778
もちろん競合状態(race condition)もあるけど
それとは別に同じデータ(対象)に対して2者以上がルールを守っていなければデータ競合が発生
例えば>>766の言う『single writer XOR multiple readers』の原則が崩れていればデータ競合が発生ありうる >>782
シングルスレッドでshared xor mutableで防げるバグがあるのはそう(イテレート中にイテレート元にデータ挿入しちゃうとか)だが
それはデータ競合とは言わないのでは
少なくともRust公式はdata raceの定義をマルチスレッド前提にしているし、一般的にもそうだろう
https://doc.rust-lang.org/nomicon/races.html >>783
それは非同期でマルチグリーンスレッドでも全く同様に起きることであるし
それは非同期コールバックのあるJavaScriptでも同じく起きることであるし
シングルOSスレッドでも発生しちゃうな >>782
raceは競『争』。競『合』の訳はないと思うが、
まあお前らがレーシングコンディションの意味で使ってると分かれば俺はとりあえずはいい。
(とはいえ俺はもう終わりでいいが)
あと、JSの定義は>>774が言ってるとおり、
マルチスレッドでの前提で、シングルスレッドでは発生しない。(定義されてない)
多分wiki書いた奴が全く分かってない。
何か不思議な値になるみたいな書き方だが、そうはならない。
一発書きなら当たり前だがどちらかが書いた値にしかならない。殆どの場合はこれになる。
一発書きしない場合は混ざる事があるが、
多分これを著者が理解出来てないからあやふやな書き方になってる。 データ競合(data race)という言葉の定義自体が言語によって違うんか
それならなんか人によって話が噛み合ってないのも納得
C++11だとマルチスレッドが前提になってた
https://timsong-cpp.github.io/cppwp/n3337/intro.multithread#def:data_race ここまで出た通りES/Rust/C++はマルチスレッド前提で、Javaも確かそうだったし
シングルスレッド派の人はちゃんと定義されてるやつを示してほしい
日本語Wikipediaじゃなくて
>>785
訳が競争というのはまぁそうかもしれないけど、CS系学部の教科書レベルで競合に統一されちゃってるので、いまさらどうしようもないね… というかよく考えたら日本語Wikipediaも間違ってはないんだな
引用した人がJSだからシングルスレッドって思い込んでただけで ほら定義の話になってんだろ
それって正解がないので、どっちかに合わせて結論出したら終わりなんだよ データ競合(data race)だろうと競合状態(race condition)だろうと言語ごとに定義が違うなこりゃ
言葉の定義自体は規格書引っ張り出してきて殴り合うとして、
言語が別だとそもそも話し合うことすら難しいんじゃないの?
どっちかの定義に寄せることすら無理そうだし あと>>783の定義だと、concurrentだからシングルスレッドな並行もダメかもね
非同期シグナルとかもダメだし、シングルスレッドって前提だけではデータ競合起きちゃうね 定義は両者で共有・合意するだけで問題ないよ
規格書を引っ張り出す必要もない
ただ出た結論は定義込みで語られないと意味がないだけw >>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 別に毎回同期すればいいだけのところを無理に端折ろうとすると、複数CPU時代の現代ではインターロックが必要ってだけでしょ
volatileがないのは論外だけど…
競合を回避するには同期(ロック)しようねってだけ JSエアプだったからスルーしてたが >>764 の言う「順序」ってのが定義されていればデータ競合にはならんのだよな?
1スレッド内の操作で順序が定義されていないって状況がなんか想像できなかった
まさか value=value みたいのがデータ競合なんてならんだろうし え?そこは>>788でFAでは?ECMA Scriptだしな >>766
もちろんC/C++と同じように生ポインタを使えるunsafeを使った場合はその部分を人間が責任を持つ
そういうのは「Rustが保証する」とは言わん。 >>797
それはあなたが理解できていない
プログラム全体に渡り言語仕様に基づきコンパイラが安全性を保証できる
その例外部分がunsafe宣言部分でありそこだけを人間が責任を持てばよい
他の言語はプログラム全体に渡り人間が責任を持たなければならない この際「Rustのunsafeは綺麗なunsafe」のダブスタは置いておくとして、
仮にRustではデータ競合をunsafe領域だけに局在化出来るとして、それで何が嬉しいんだ?
具体的にそれをどういうアプリに生かせるんだ?
他言語の場合はスレッドセーフにするのには細心の注意がいる。
だから一般的に最小限の部分しかスレッドセーフにしない。結果、共有も最小限だ。
対してこれがunsafe領域だけにできるとして、これだけなら
・ロック周りを記述している箇所は後から検索出来るように必ず ./// LOCK のコメントを付けとけ
程度の意味しかない。
既に言ったが他言語ではロック周りは難しいので最小限に絞られている。
これがRustで楽に書け、もっとカジュアルに使えるとして、
出来上がるアプリは「スレッド間をもっと密結合させ、共有RAMをもっとカジュアルに使うもの」になる。
共有RAM方式は昨今言われている程遅くも悪くもないが、(x86の場合は)
ハードウェアとしては従来通りの「共有RAMは最小限」の方が断然速く動く。
だから単純には、
C++ではロック周りでバグが出まくって実装するにはとても無理だが、
言語サポートがあるRustなら平気で書けるからこそこの構造に出来、断然性能がいい、
とかいうアプリ(適用領域)がないといけないが、これは何?
Go/Rustはマルチスレッドがこなれてからの言語だからその辺に独自のアイデアを突っ込んできてるのは当然として、
Rustのが「ロックをもっとカジュアルに」なら多分ハズレだ。
簡単に書けるのは正義ではあるが、ロックを最小限に絞るのは『大』正義だからだ。
(そして一般的なフレームワークを使えば、
ロックなんてそれ用のクラスを使うしかないから、検索すればすぐに見つかる。
ロックすら考慮せず野良で共有してるようなコードは見逃すが、
これを防ぐ為だとしたらRustは相当の馬鹿向け言語という事になる。
C/C++だったら「そんな奴は死刑」で誰も反対しない) >>800
スレで一番筋の悪い人が
スレで一番の長文を書いて暴れる
しかしこれは珍しいことではない
自分と他人の力量が見えないことは
こういう風景を生みがちなのである そもそも何と何を比較したい、とか主張や前提が不明瞭だから長くなってんだよ
日記を書くなら他所にしてね >>799
Rustで実際に書けばわかるが
普通のプログラムでunsafeを使うことはないぜ
unsafeは特定のライブラリの中に閉じ込められていて外に影響なし
その部分を除くプログラム全体の安全性をRustコンパイラが保証
他の言語ではプログラム全体の安全性を人間が保証 銀の弾丸は無いってことを理解できない人が暴れてるみたいだな。
たぶん今までの人生全ての出来事が100点じゃないとダメな人なんだろうけど、なんでまだ生きてるんだろう? >>803
ユーザーがunsafeを使う必要がないのはいいが、
それが何を作る時にどう利点になるんだ?
繰り返すが、C++等でロック等を自前で書く事はほぼ無い。
最小にする為にatomicにして、atomicは通常、フレームワークが用意してる物を使うからだ。
だから「ロック等を使う必要がある」事を認識してる奴が書いたコードなら、Rustと同程度に安全だ。
なぜなら、Rustでも「ロック等を使う必要がある」と認識して、特定のライブラリを使わないといけないんだろ。
この側面についてのRustの利点は、
・「ロック等を使う必要がある」とすら認識出来ない馬鹿が書いた時に、コンパイルが通らない --- (A)
というだけのように見える。
・「ロック等を使う必要がある」と認識出来る奴が、ロック等を『うっかり』忘れる --- (B)
のを想定しているなら、はっきり言ってこれはない。
マルチスレッドを直接扱う場合、何らかのロック等が『常に』必要であり、
最初にそこを設計して、かつそれはスレッドについて「入力」「出力」側1つずつとかの最小限に絞るからだ。
つまり、目で見て分かる程度でやってる。見落として苦労する事は無い。
これをRustだとコンパイラがチェックしてくれるから、大量に出来る!見落としもない!のはいいが、
それはどういう時に利点なんだ?という話。
細かいオブジェクトを大量に共有出来たら素晴らしくパフォーマンスが上がる、なんて構造、無いだろ。 >>805
Rustコンパイラが保証するのは
・そういうマルチスレッド時の、狭義のデータ競合、だけでなく
・シングルスレッドでの非同期コールバックなどの、普通のデータ競合、や
・ロジックミスなどにより生じる、広義のデータ競合、に加えて
・様々なメモリ安全性、に至るまで
コンパイル時に検出が可能なことを保証
色んな言語で書いてきたプログラマーならば以上の説明で恩恵を納得できる C++って何か理由があってピンポイントで使うことが多いと思う
だからフレームワークってあんまりないよね
間違ってる上に風呂敷広げすぎ
Rustもそんなこと保証できない もう相手すんなよ
うっかりがありえないとかまともなプログラマならそれこそありえないことを知ってるだろうし :::.... /|\||
//|'\\.... ...:::.. .......
|/ ,'|-、 \\
|/ ,'|-、 \\\
|/ ,'|-、 \\\|.... ...:::.. .......
|/ ,'|-、 \\\|:..。..... ...:::.. .......
|/ ,'|-、 \\\|__|
|/ ,'|-、 \\\|:...|ヽ .... ...:::.. .......
|/ ,'|-、 \\\|::::| |::.....
| ̄ ̄ ̄ ̄ ̄\、'\\|;;:.|_,,|___
| □□ □□ | |\, \|;;::.... |\
| □□ □□ | | | ̄ ̄ ̄ ̄|\;: . | |
| □□ □□ | | |□□□□| |::...| |;;:
| □□ □□ | | |□□□□| |::...| |:;:./
| □□ □□ | | |□□□□| |::...| /
| □□ □□ |.._|__,,|□□□□| |::...|/
,,| ̄ ̄ ̄|| ̄ ̄\≡\,□□□|/ ,/
今北産業 [IMAKITA INDUSTRIAL CO.,LTD]
(1978〜 日本) 彼は確かに色々と間違っているが
彼の言う通りロックが必要なところでうっかり忘れたとすると
Rustコンパイラはそれが引き起こすデータ競合を通さないから
結局ロックが必要な型を使うことになり結果としてそれも保証されたことになる また保証話で嘘ついてRustの評価を地に落としているバカがいるなw >>806で保証合ってると思うぜ
違うと言うなら具体的に反論しないとな Rustを叩く連中は
長々と長文で頓珍漢なやつと
理由も言わずに嘘とか違うとか言うだけのやつがいる 昨日もう散々話したよw 異論があるなら昨日の話に続ければいいw >>814
昨日って>>799?
意味不明で説得力ゼロ データ競合の話に決まってんだろ
頭にボウフラ湧いてない?
昨日のまとめ的見解は大枠>>786のような感じw データ競合の意味する範囲が様々あるのはその通り
一方で>>806はそれを3種類に分けているのもその通り
いずれにしてもそれら全てに対してRustコンパイラはデータ競合が起きていないことを保証するので問題なし データ競合の定義が複数あるのがそのとおりなら、もうそれだけで常に真になるわけではないことになる
それを「保証する」なら「嘘」と言わざるを得ない どの定義のデータ競合も共通している点がある
それは『single writer XOR multi readers』を厳守しているならばデータ競合が起きない点
そしてRustコンパイラはどんなに複雑な状況でも『single writer XOR multi readers』の厳守/破綻を検知できる
つまりRustコンパイラはどのタイプのデータ競合も起きていないことを保証できる unsafeが無くなった完全なrustが出来たら起こして!! privateとかprotectedの保証が時代遅れになった原因もそれかなあ >>821
Rustにアンチな人はunsafeを持ち出した時点で敗北だと気付かなきゃ
Rust以外の言語ではプログラム全体がそのunsafe状態なのだから Rustのunsafeは質が非常に悪いからな
まさに邪悪の一言に尽きるw
ピカピカのRustが一瞬にして継ぎ接ぎだらけのボロ雑巾に生まれ変わるw
かたや他の言語は長い歴史が積み上げた研鑽のたまもので、そこそこ綺麗に保たれているのであったw >>825
unsafeは普通のプログラミング言語と同じという意味ですよ
つまり普通のプログラミング言語はプログラム全てがunsafeなのでデータ競合やメモリ安全などを人間が確実に保証しなければなりません
一方でRustはプログラムのほとんどの部分がunsafeではないのでコンパイラが安全性を保証できます >>823
もうそこしか攻められないってことだろ
そんなところ攻められても痛くも痒くもないけどw そこだけでぶっ壊れるガラス細工なRustなわけだがw >>806
やっぱり俺にはRustは要らないという結論だね。
> 色んな言語で書いてきたプログラマーならば以上の説明で恩恵を納得できる
新興言語にかなり有利に出るPYPLですらC/C++比1/6の現実を見た方がいい。 C/C++とRustならば
両方使いこなせる人が常にRustを選ぶことからも言語の優劣差がはっきりしている >>831
> 両方使いこなせる人が常にRustを選ぶ
Rust界隈でインタビューすればそりゃそうなる。そういうところがエコーチェンバーだと思うんだけどね。
まあasyncはだいぶ筋が良さそうだし、今後どうなるかだね。 両方使いこなせるけど、常にC++を選んじゃってるんだがw
まあ趣味だし他人にC++は勧めないけどねw
だからといってRustも全く勧めない
言語の優劣は圧倒的にC++が優っている >>833
おまえこの前もRustコードを書けずに敗走したアンチじゃん ここでそんなこと言われたことないし、このスレ系列にも俺が書いたコードあるけどw
コードくれくれビビリ単発IDがココにも湧き始めたねw
書けると何度も言ってるし金くれるなら書くって言ってるんだがな その人は>>825を見るとunsafeの意味も
Rustがunsafeを分離することに成功した価値も理解できていないようだから
コードも書くことができないだろうと思う お前みたいな胡散臭いのが余計なことしてるからRustがいつまで経っても広まらないんだよw
理念は悪くないのに、嘘までつくからこうなるw 理解してるとかどうか以前に、精神レベルがどうみても小学生以下じゃん
何を書こうが議論するに値しないよ この真っ赤な人はRust叩きばかりしているダメな人でRustスレを出入り禁止になった人でしょ 俺はRustスレでRust以外の話はしてない(Rustの説明に必要なときだけ他言語を書く場合がある)し、もちろん出禁になってもいないし、Rustのコードも書いたしお前より貢献してる気がするんだけどw
ビビリの単発連投構ってちゃん君w cargo geigerは忘れずにしような☢
頭おかしいと思っちゃうなら患者は恐らく君のほうだと思うよ
俺は専門家じゃないから知らんけどw このガイガー小学生はいつまでスレに張り付いてるんだろう お前同様ずっといるんじゃないかなw ビビリの単発ID連投構ってちゃん君w
プログラミングのお勉強()はしなくていいのかな?w どうしてそういう解釈になったのかは知らんし、君の頭が悪いのまで俺のせいにされても・・・ ガイガー君はプログラム組むこと出来るようになったのかな 勝手に名前付けてんなよw ビビリの単発ID連投構ってちゃん君w プログラミングできないのは君だけだよw >>799
他の言語では細心の注意が払えていなかったことが実行時まで分からない部分が、Rustではコンパイル時に分かることが嬉しいんだろ
だから実際には細心の注意を払わなくても大抵の入力で問題ないケースにも制約が掛かってRustでは難しくなる場合がある
それにその制約を強制されたところであらゆるバグがなくなるわけではない
Rustが定義するバグの範囲に収まるだけ
これを嬉しいと思うかどうかで選べば良いんじゃないの? >>824
そもそもユーザーがunsafeだからね キーワードにunsafeがあるRustはダメ。
C/C++ならunsafeというキーワードは無いからオーケー。 >>851
C/C++はプログラム全体がunsafeだもんね
もはやC/C++を使うメリットがない C/C++もunsafeな部分はコメントでunsafeって書いとけば安心安全だよ C++は最強言語なのでRustを使うメリットなんて皆無なんだが、人類には難しすぎるのが難点w
Rustがゴミなのは、その人類が勘違いをして、unsafeまみれなのに安全とかぬかしてるところw >>853
C/C++はプログラム全てがunsafeだから人間が管理しきれておらず
その結果として様々な問題を引き起こしてきたと各IT大手も明言しているね まるで、有能大企業にたった一人のゴミを入れたら無能大企業になるみたいに Rustはプログラミングしやすいから使ってる
安全性の保証とかはオマケで付いてきてる C++と比較なら、Rustが良いよねとは素直に思う。
スレタイにある言語との比較だと、
メモリ管理を人がしないといけないRustは遠慮したい。 >>858
Rustは自動メモリ解放されるからプログラマーが手間かけなくていいよ >>835
金払うから振込先を教えろ
24時間以内に反応が無ければコードを書けないと見なす ガイガー君はコード書けなくてコピペしか出来ない子だよ >>864
>>861に聞いているw 俺が聞いたんだから、答えるのは861w お前の勝手な思い込みは関係ないw >>861
日付が変わる前に同じIDでコテハンを用意して同一人物が分かるようにしとけよw ガイガー君はいつも金を無心しているから金が無いんだよ
コーディング能力も無いけど 内容のない煽りしか出来ないビビリの単発ID連投構ってちゃん君じゃないから、どちらもあるけどねw >>854
subsetsイテレータのコード書けたの?
断念? >>849
その通りだが、それは「簡単」のメリットの一面であり、
日本人はそっちしか目指さないから駄目なんだ。つまり、
・従来難しかった事が簡単になった(≒バグを検出しやすくなった)
の使い方だが、日本人はこれを
・従来難しかった事が簡単になったから、『馬鹿でも出来る』ようになった --- (A)
と、下方向への拡張にしか使わない。
結果、よりもっと馬鹿=人件費が安い連中に、という事で、
『文系でも出来た!』『中国人』『ベトナム人』とまあ、
・今までと同じ事を、より馬鹿を使う事によって、人件費を抑えようとする
から、エンジニアの給料が上がる事がない。
勘違いしてる社畜プログラマは
「エンジニアをもっと好待遇にしろ(≒給料を上げろ)」と簡単に言うのだが、
下方向への競争をやってる限り、給料が上がる事はない。
いつしかもっと安い連中を探し出してきて、代替されるからだ。
ならば、
・従来難しかった事が簡単になったから、同じ事が早く出来るようになった --- (B)
とするのもの一つの作戦だ。回転数で勝負というわけだ。
これが得意な奴ならこれもありだろう。
ただ、安い連中の中には早い連中も居るから、安泰ではない。
(A)と同様、給料には下方向への圧力がかかり続けてる状態だ。 本来は、
・従来難しかった事が簡単になったから、
従来では現実的に不可能だった事が出来るようになった --- (C)
を目指さないといけない。これが上方向への拡張だ。
「俺は素晴らしい学歴を持ってるのだから、もっと給料を払え」と言うのなら、
その素晴らしい学歴を獲得する過程で得た知識を持っていないと出来ない事、
知識がない人(≒馬鹿)には出来ない事をやって差別化するしかない。
そしてそれでユーザーにメリットが有れば、製品は売れ、利益が出るので、給料も高く留まる。
馬鹿ではそれが作れないなら、安売り合戦になる事もない。
だからそれは何だと聞いてるんだよ。
(A)(B)は順当な進化だが、それを追求するのは文系プログラマでいい。
CSを学んでおり、それで高収入を得たいなら、
CSで学んだ知識がないと無理な領域を攻めるしかない。
勿論CSだからプログラミングは余裕で、
文系プログラマですら給料払ってくれる日本企業なら楽勝でスーダラ節状態、
「サラリーマンは気楽な稼業と来たもんだ」な人生もありだとは思うが、
何も考えずに(A)(B)しかないと思ってたのなら、ちゃんと(C)も意識しておけ、という事。
実際、アメリカ人とかは(C)も目指してて、
よくもまあこんなもん作りあげたな、というのも多いだろ。
一つ一つは小さな(C)の積み上げなんだよ。
で、話を戻すと、
従来:ロック周りは難しいので、出来るだけ書かないようにする
= 出来るだけ大きい単位(ジョブ)でしかマルチスレッドを適用出来ない
Rust:ロック周りもコンパイラサポートありなので、従来よりは気軽に書けます!
→ それでロックが大量に書けてバグもないとして、
ユーザーにとってのメリット(通常は速度)がある領域は何? >>806
思うにそれはGoに必要な機能だ。
今現在もロック周りは難しいとされているので、あまりそこを攻めようという奴はいない。
結果、通常は「ジョブ」という、最大単位でマルチスレッドにして、ロック記述は最小にしてる。
C#の場合は全てフレームワーク内に隠蔽し、ユーザーがロック記述をする必要が無くしてしまった。
メインスレッド+スレッドプールで、共有部分はメインスレッドで処理し、
完全に独立している部分を非同期ジョブとして切り出す。
多分ジョブ内からでもInvokeを使えばメインスレッドにやらせる事は出来るはずだから、
この場合、mutexやatomicを全く使わなくても済む。
(mutexやatomicよりはInvokeの方が簡単だし静的に解析可能、と見たのだろう。
これは実際そうだし、Invoke《意味的には固有スレッドで動かすコルーチン》なら
どこをどう間違えてもデッドロックはしない)
Goの場合はもっと小さい単位(コルーチン程度)でマルチスレッドを使うのが正解だと踏んだのだろう。
それでアクターモデルでやればmutexやatomic系は必要なくなる。
問題はランタイムの設計が不適切で無駄にgoroutineが重い事だが、これは言語自体の問題ではない。
(ただしアクターモデルよりはオブジェクト指向でatomicした方が断然速いので、
Go以外の言語は全部そうしてるわけだが。
この意味ではC#はメインスレッドだけアクター用のインタフェースを持ってる事になるが) とはいえ、マルチスレッドで細かく共有する構造はGoだと圧倒的に記述しやすいのは事実だ。
ただし現実的には容易にデッドロックするから無理だし、
何故か分からんがGoの連中は共有RAMを必要以上に嫌ってて、原則「チャネルで繋げ」となってる気はする。
ここに「ロック周りもコンパイラサポート!バグは静的に検出!!!」出来れば、
新境地が開ける可能性はある。
ついでに言うと、Goの場合は同期チャネルなので、
レーシングコンディションも強引に潰していく事が可能
(EDと来た場合にも、EにD待ちさせてDEと整列させる記述は凄く簡単)なわけだが、
これもデッドロックの巣でしかないので今現在は現実的に無理だ。
ここら辺の扉も開く可能性はある。
ただ一般論としては、
Rust:ロック周りもコンパイラサポートがあるので、気楽に書けます!
C#:ロック周りはフレームワーク内部に隠蔽したので、全く書く必要有りません。
なら、C#の方が正解だとされる。 >>869
そんなコード書けないやついねーよwwww
>>861はもうID変えちゃってないんだなw C#とGoとRustならGoでいいと思うけど…一番ラクじゃん
C#なんてTask.Delay()の代わりにThread.Sleep()使うだけで簡単にデッドロックするよw >>876
俺が言ってるのはasync。
あと、C#の場合はもはやその辺も使う必要がない。同期周りを一切書かずに済む。
そしてtry-catchも強引に持ってきてしまったから、C#が目指しているのは、
・同期のノリで書いて、ほぼ問題なし。
一切マルチスレッド周りの知識も必要なし。単なる高火力コンロとして使用可能。
ただし、中身はマルチスレッドなので、分離はしてないと駄目だし、処理順も規定出来ない。
というところかと。殆どの場合はこれで済むのも事実だし。
C#の場合は(B)の生産性最重視だからこれも一つの解だよ。 すまん、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...");
} 例えば、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のモデルは同期と非同期を混ぜると結構簡単に(分かりにくい)デッドロックを起こす >>881
waitするのが悪いんだろ。
asyncは同期的にずらずら書く用で、手動でマルチスレッドする用ではないので。
C#はそこまで馬鹿な奴を救済する用には出来てない。
正しく書いた時に正しく動く用だ。
(つか、Taskを流用したから混ぜられるのであって、多分それも仕様なんだろう。
新しくAsyncTaskにしてWaitメソッドを無くせば済んだ話だし)
まあとにかく、簡単に書ける、馬鹿でも書ける、ってことを目指してる限り、
給料なんて一生上がるはずもない事は認識しておくべきだよ。 そもそもTaskはasync/await前から同じような動きをする書き方が出来てて、手動でマルチスレッドする用ではないw
給料の問題ではなく、他の言語と比較して、不測の事態を起こしやすいモデルなんだよね
名前に統一感がないまま、いろいろ出来るようになっているからw >>884
コンストラクタがasyncじゃないから使えないんじゃね? あえてカスタマイズしにくいコンストラクタを選んだんだよw >>881
C#はWPFとしてGo,RustではどんなGUIが標準的に用意されてんの?
それでは同様の障害は起こらないの?
あからさまに比較対象がおかしい >>888
比較対象がおかしいんじゃなくて、お前が無知なだけw
.NETはSynchronizedContextというのでスレッドのスケジューリングを調整できる
そして、GUIとコンソールでこのスケジューリングが違うから、GUIを出したんだよw
同じことをコンソールアプリでやってもデッドロックしないw
つまりあえておかしいのが何かを選ぶならお前の可哀想な頭ということになるw >>889
おかしいのはお前の頭だ馬鹿タレ
881は
int main() {
sleep();
return 0;
}
でアプリケーションが終了しない!デッドロックだ!と騒いでいるに等しい。
ぼくのすごいあぷりけーしょんのばぐはぜんぶすたてぃっくにけんしゅつされるべき
このていどすらぼくには「わかりにくいでっどろっく」なのだから!
と思うのなら、GoやRustを使っておけ。
C#は実用言語であって、一通りすら書けない馬鹿を救済しようとはしていない。
一般的に、ロック周りの難しさは再現性が低い事にある。
偶々同時にアクセスした時にのみバグるので、
初心者の「一度動いたから問題なし」ではバグを取りきれない。
そのコードなら必ず再現する=再現率100%のバグを修正出来ないのはそいつの問題だ。
(881のバグは静的には検出出来ないのかもしれんが、動かせばすぐ分かるし、すぐ修正出来る)
一般的に難しいとされるバグは、データ依存性が有り、特定のデータ組でしかバグらないものだ。
そしてロック周りなら、データ依存性+タイミング、となるので、さらに発見も遅れるし、
見た目動くし、実際99%以上の場合で全く問題ないしで、場所の特定が困難になる。
お前以外はこの前提で話していただろうよ。 >>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
フレームワークには要求されたコードを書く必要があって、好き勝手書いていいわけではない。
ある程度の腕前があるつもりならドキュメントを先に読んだ方が正解だぞ。
(そもそもそんなコード書く必要すらないが)
それ、コンソールアプリなら(コンパイラがフォローしてくれた結果)動くだけの気がするが。 GUIアプリだとWPFとかがメッセージループ回してくれる
コンソールアプリだとメッセージループがないからそもそもの土台が違うだけでしょ
GUI周りの制限とかもないだろうし
もしかしたらメッセージループを自前で回せばasyncとかのデッドロックをコンソールアプリからもできるかもしれん >>881
へんな例え出して突っ込まれてるお前好き! awaitが使用できないシチュエーションにしてる上に、引数なしのsleep()なんて存在しない上に仮にそれが永久スリープだとして、そういう現象ではないw
非常に自然な使い方なんだよw
またこの例は簡単&再現性100%を挙げただけで、合せ技で再現性低のすごい分かりにくいバグ(終わらないスレッド)を混入させられるw
そしてその自然な使い方がNGであることがドキュメンテーションされていないとは一言も言ってないw
モデルが悪いと言っているw
だからお前はバカだと言われるんだよw >>892
書いたとおり、SynchronizedContextにより、await後のスレッドが何になるか?って話だ
コンソールとGUIで違う 名前覚え間違ってたw
SynchronizationContext なw 知らねーよw C#を引っ張り出してきたのは俺じゃないw >>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のコードでも動くモデルが差し込んであるのだろう。
ただそれは間違ってるコードが偶々動いてるだけの気がするが。 ここまで書いてやってもまだ理解できてないのか・・・
await後に元のスレッドで再開するのがGUI用のSynchronizationContext w
だから、Task.Waitを同期的にやると同じスレッドなのでデッドロックする
GUIだとUIスレッドでawaitしたら復帰したときに同じUIスレッドで処理したいからそうする
コンソールだとそういう縛りがないから、await後は別のスレッドになる可能性がある(典型的には使用中なら別のスレッド)w
それだけw
こんなこと言われないと分からないのなら、お前はC#を「使えていない」w 馬鹿はなぜ周りから馬鹿扱いされているか気が付かないからバカなんだ
周りが馬鹿なんじゃなくて本質的に理解してないでデッドロックがどうこう書いてくる 周りが馬鹿なんじゃなくて本質的に理解してないでデッドロックがどうこう書いてくる人間が馬鹿 ぼくちゃんたちには難しくて分からなかったかもねw
ぼくちゃんたちの頭が悪いのまで俺のせいにされても困るw C#とWPF使うとデッドロックが起こる!簡単には使えない!
GoとRustでCUIでやればデッドロックが起こらない!簡単だ!
↑馬鹿すぎますよね? バカの自己紹介ほどツマラナイものはないなw
.NETは玉石混交の継ぎ接ぎだらけでモデルが悪いと言ってるだけなんだがw この人がスゲー馬鹿なのは同意してくれないの?
876 名前:デフォルトの名無しさん[sage] 投稿日:2022/03/19(土) 00:33:29.03 ID:DslNhsx1 [1/4]
C#とGoとRustならGoでいいと思うけど…一番ラクじゃん
C#なんてTask.Delay()の代わりにThread.Sleep()使うだけで簡単にデッドロックするよw >>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は使うな」と言ってるから、使わない。
だと思うが。 アホだな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 >>909
そうじゃない。
何度も言ってるが、フレームワークはフレームワーク製作者が要求したとおりのコードじゃないと駄目なんだ。
これはどのフレームワークでもそう。
MSが「async/awaitではTask.Waitは使うな」と言ってるのだから、これに従う限り、
Task.Waitを混ぜた時の動作については知る必要はない、というのが一般論。
フレームワークにデタラメなコード(=製作者が予期してないコード)を食わせたらどうなるか、を把握する為には、
フレームワークの中身まで知る必要がある。
一々こんな事をしてたら生産性なんて上がらないし、正しく使っている限り必要ないから、
一般的にはこれは要求されない。
だからお前の考え方は根本的にずれてるよ。
例えばHTML、これはWeb系に於いての暗黙のフレームワークHTML/CSS/JavaScriptの一角を担ってるわけだが、
実はデタラメなHTMLでもブラウザはそれなりには表示してしまう。
だからといって、「デタラメなHTMLを食わせた時にどう動くかを把握して、デタラメなHTMLを書いてもいい」とはならんし、
「デタラメなHTMLを食わせた時の各ブラウザの挙動を把握してこそWebを『使える』と言える」ともならんだろ。
「正しいHTMLを書け」で終わりだ。
ただまあこれはもう平行線だし、これについての俺の主張は上記だから、これで終わりでいい。
C#のモデルが悪いというのなら、
「MSが正しい使い方だと認めるコードでも容易にデッドロックが発生する事例」を持ってくるべきだ。
間違ったコードでフリーズしたところで、あっそう、でしかない。
一般的にはそんなのを書く奴が悪いとされるし、C#でも実際そうだと思うよ。 お前が頓珍漢な主張を繰り返しているだけだろw
仕様通りの使い方が出来ているかどうかという話をしておらず、その仕様の出来が良いか悪いかの話をしているんだろうにw
理由はそういうスレだからw
俺はそういう話をするために事例を出し、.NETのモデルの悪さを指摘したw
ただ、その原因すらお前が理解していないようだから、一般常識レベルの説明をしただけだw
一応言っておくが、俺は使用するAPIはドキュメントを全て読んでから使用しているw
でもそんな話は今していないんだw お前が言ってることが周回遅れすぎてるだけw
というかC#すら分かっておらず、当該言語もよく知らない上にスレの主旨も理解できてないなら口出してくんなw デッドロックの話ならGoなんてチャネルの扱いを間違えたら簡単にデッドロックするでしょ
C#もGoも両方プロダクションでそれなりに使い込んでるけど、感覚的にはGoの方が遥かにデッドロックを起こしやすいよ >>911
> その仕様の出来が良いか悪いか
フレームワークは『使い方』も含めて仕様なんだよ。
>>912
Goはチャネルの使い方を間違えればすぐデッドロックする。
(だからRust信者かな?とも思うのだけど)
ただしGoの出来が悪いわけではなく、
単に、「何であれ、スレッド間の同期を取ろうとするとデッドロックしやすい」ので、
C#ではasync/awaitでユーザーが同期周りを一切書かなくて済むようにしただけで、
自分で書けばGoと同程度にデッドロックするとも思うよ。 なるほどね
・チャネルを使わない
・ロックを使う場合のロック順序は守る
という制限があっても簡単にデッドロックが起きてしまうのがC#という結論かな >>914
その回答を見てもわかるように
RustではMutexなどのロックはそのブロックを抜けると自動的に解除されます
だからその質問のプログラムがそのロックしたブロックを完了していないというバグだということが今回の例でもすぐわかるわけです channelでデッドロックするのはよほど使い方悪いだけだろw
プロダクトでそれはありえないw
channelを使わずにmutex使うとかバカとしか言いようがないw
mutexなどの同期リソースを手動で使う場合は、どんな言語でも細心の注意を払わないとデッドロックなどのバグが発生するw
goのchannelはgo固有w
IPCの接続をsocketと呼ばずにchannelと呼ぶフレームはあるけどねw まあでも並列動作で一番厄介なのはMutexを使わずにatomic readを期待しちゃった系読み書きのバグかなw デッドロック起きないことを保証できたらまさに次世代言語って感じがするな
そんな言語あるのかは知らんが 非同期プログラミング(async/awaitなど)は正にその辺を狙った技術だよw
非同期処理完了の戻り値としてデータ授受をすることで複数スレッドからのデータアクセスの同期処理をなくしやすくしているw
保証するものじゃないし、する必要もないけどw >>917
> channelを使わずにmutex使うとかバカとしか言いようがないw
それは失言です
データ読み書き競合をchannelで防ぐことは出来ません
mutexなどのロックが必要となります lock要求された順番を検証して、
順序にループがあればlock要求時にthrowする仕組みは作れそう
lock/unlockのたびに全threadのlock状況を検証する必要があるからパフォーマンスがお察しになるが >>915
どの言語でも、間違った使い方をすればデッドロックはする。
(Task.Waitなどを使うという、明らかに間違った事をせず、)
async/awaitだけで(ジョブ間に依存性がないように)書けばデッドロックしない。
これはC#でもJSでも他言語でも同じのはずだけど。
ID:1+CNf8az だけが
まちがったつかいかたもできるし、それがぼくにとってはわかりにくいからもんだいだ!!!
と言ってるだけ。 >>921
何を言ってるの????
共有データを作らないためのchannelではないの?
channelだけではどうしても無理な場合だけmutex使って共有データにアクセスするだけだろw
まずは例を出せw >>923
お前がお味噌なだけw
俺も含め誰もそんな話はしてないw お前が無知だっただけで僻むなw >>922
function method1() { lock(objA) { lock(objB) {
処理;
}}}
function method2() { lock(objB) { lock(objA) {
処理;
}}}
みたいなmethod1とmethod2が別のスレッドで同時に動いたときにデッドロックする >>926
バカなのか?
そのコードは皆が共通して言ってることすら守れていない
>>915
> ・ロックを使う場合のロック順序は守る
>>922
> lock要求された順番を検証 >>927
バカはお前w デッドロックを検出することは可能だが、順序がループするわけではないw 別にGCじゃなくても検出はできるよw ただのバグだから余計なコストがかかる処理を入れてないだけでw 毎度毎度、c#もあんまり詳しくないよねこの人。
Rustは俺はわからんのだけど、c#とgoの話だとこの人が言ってんのは重箱の隅をつついて「これが大問題であるっ!!」って騒いでるような感じ。
まあGoでコンパイラ書いたらGCから逃れられないみたいなアホも居たわけだからアレなんだけど。 >>933
GC言語はどうしてもそれ故の種々の制限があるからしょうがない
もちろんGC言語はその代わりに有利な面もある
そこへGC言語でないRustが初めてGC言語と対等に比較可能な存在として登場した
しかもGCのない有利さを保ったままで この人rustスレではc++に比べてrustはクソと
同じように知ったかぶりでトンチンカンな叩き
してるからまあこういうことやるのが目的なんだろ > そこへGC言語でないRustが初めてGC言語と対等に比較可能な存在として登場した
SwiftにもGCは無いよね
ARC(Automatic Reference Counting)でやりくりするんよね
Swift使っこと無いし完全に俺はニワカだけど >>934
Goでコンパイラ書いたらバイナリにもGCが入るっていう誤解の正当化? >>936
C++とRustでも所有権を共有する時だけはARCと同じ方法を使っている
しかしC++とRustはそういう特殊なケースでのみ使用だからGC言語とは言われない
一方でSwiftは常にインスタンスに対してARCでメモリ管理をするため非常に重く効率が悪い
そしてARCが常に行われるということは参照カウント方式のGCそのものである
そのためSwiftは非GC言語とは言い難い >>937
そのGo製コンパイラ自体はGCランタイムを含むしGCを起こすよ
他にもGoで記述して例えばWebAssemblyをブラウザ上で動かそうとすると
当然GCを含むGoの巨大なランタイムがWASM上でそのまま必要となるため
Goを使うと巨大で重くて遅い > そのため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を全部に使うわけじゃあないからまた雰囲気も違うのは確か C++のshared_ptrやRustのRcは必要不可欠な最小限でしか用いないから必須なコストを払っているだけと言えるが
SwiftのARCは全てのインスタンスに適用されるから無駄なコストを浪費しているとしか言いようがない >>933
実際大問題だっつーのw
C#の非同期系の諸問題は大抵これが原因w
ごく稀にスレッド間の同期(排他制御)が不足してる競合が原因のがあるって感じ
お前こそC#使った開発とか本当にしたことあるのか?w >>946
仕事で作った数人x半年レベルのWindowsアプリ(製品)の話だよw
全然違う分野のだけど、C#は1.xと2.0と4.6?で作ったかなw
なので俺の問題ではないw 全員C#の練度はお前よりは上だったけどw >>939
そんな話はしてないが。
>>942
GUIじゃない部分で不用意にTaskを処理しようとすると死にがちよね。
コピペで毎回FireAndForget持って来て慎重に使ってるわw
ID:1+CNf8azの事ではないよ、ごめん。 >>947-948
ならそれはお前らの技量が足りなかっただけだ。
そもそもデッドロックするかどうかは言語関係ないだろ。
新旧の仕様を混ぜて使えるようになってるのが落とし穴だ、というのなら、
それはそうかもしれんが、C#としてはそこをすぐに塞ぐのは無理だ。
それでRust使えば全く問題ない!と思うのならガンガン使ってみればいいだけ。
そんな単純な話ではないと思うけどね。 >>949
俺は助っ人で行っただけだからなw
現象はデッドロックだけではないし、まあお前には想像もできないし、遭遇しても解決できないから安心しろw
そして何度でも言うが、彼らはお前よりはC#についての知見が遥かに多かったよw
デッドロックの話にピンと来ないC#erは初めて見たし、await後のスレッドの話、GUIにおけるUIスレッドの役割に対する見解の話、全ての話において、お前は最低限C#技術者に必要な知見を有していないw 小学生ですがみなさんの情報たいへんおもしろいです
でもどうして大人のひとってけんかばかりしてるのですか? こんなところに来る小学生はあんまり小学生とか言わないで使いそうだけどなw
喧嘩なんてしなくて、じゃれ合ってるだけだからだよw >>947
>C#は1.xと2.0と4.6?で作ったかなw
古すぎだろ
最新はバージョン10だぞww もちろん.NET Frameworkのバージョンだよw C#のバージョンなんて誰も覚えてないだろw >>950
それはやり方を間違ってるからおかしな事になってるだけ。
例えて言うなら、舗装道路が用意されてるのにイキって荒地を走行してパンクしてるようなもの。
天の邪鬼も自由だが、それでフレームワークや言語のせいにするのは違う。 結局程度の低いプログラマーがC#が悪い!って言ってるだけだろ?
話を見てるだけでも.netのフレームワークも別に悪くない
C++で文字コードの扱いが悪いと言うならわかるけど… お前まだいたの?w ここでの話は
・.NETのモデルは出来が悪い
・お前C#erに必要な最低限の知見がない
これだけだし結論出てんだよw >>957
C#erって言葉を使ってるだけで相手を見下してるよね
Rustで同じ状況じゃ競合が起きないとかいうならわかるけどそういう話でもないし
あなたが勝手に出来が悪いと言ってるようにしか見えないんだから
出された例も馬鹿らしくて.NETのモデルも別に悪くないと思う
誰もあなたに同意できない
それだけの技量があなたにはない
他人を見下したり自分が悪いと思える謙虚さがないと低級プログラマにしかなれない
いい加減に静かにしてもらえないかな
それかどこか別に行ってやるか デッドロックに対応できないのは言語やフレームワークのせいじゃないだろ
実際にモデルが悪いのはそっちの設計の方だろ? まだ言ってるしwwwww
普通にTaskをwaitするのがawaitなのにTask.Waitって名前でデッドロックする仕様はモデルが悪いとしか言いようがないだろwwww 謙虚さとかプログラマには要らないからw
色眼鏡かけてなければ問題ないよw >>961
謙虚さがないからおまえみたいに色眼鏡かけるようになるんだよ。少しは学べよ。 ろくに調べもしないで不具合だしてるだけじゃん
名前で判断するなよ 色眼鏡かけてるのはお前だけだよw
公平に見るために謙虚さはむしろ要らないw
謙虚にすると周囲に合わせることになり、自分の意見が100%反映されなくなるw
迎合してエコーチェンバーの一部になると、色眼鏡をかけることになり、公平な判断は出来なくなるw
不具合出したわけではなく、.NETのモデルが悪いだけw 日本語不自由なんだねw Tas.Waitでデッドロックする条件分かってんだからライブラリ側で例外投げてくれよとは思うが
1ライブラリのクソ要素を根拠に言語自体をクソと言い張る思考には感心するよ C#をクソと言ったことはないぞw 日本語不自由さには事欠かないねw
マルチスレッド同期機構と非同期処理を言語で比較する話で、やれデッドロックがどうのと言っており、かつC#が良いという結論を出していたので、>>876で.NET Frameworkのモデルの悪さを指摘し、goでいいのでは?と言っただけだろうにw
話を続けた結果、彼は案の定デッドロックの話を把握しておらず、Task機構についても誤解しており、await後のスレッドについても知見がなかったので、彼の知見は一般のC#erに劣るという結論を出しただけw いい加減に辞めたら?
それを持ってライブラリのモデルが悪いと言うのは変じゃないか
あなたの主張が誰一人説得できないのはあなたの問題であってスレの住人の問題じゃない 次スレでも不毛な話が続く予感
と言うか最初からこのスレは不毛地帯だった こんなに分かりやすいモデルの悪さを納得できないとか、お前がプログラマ向いてないだけwwww この人色々なスレでスレごとに違うもの叩いてるから
おかしな人なんだろ >>966
まあ君は「ぼくはわるくない!まわりがわるいんだ!」のタイプで、一生間違いを認めないんだろうけどさ。
C#はasync/awaitの導入で、『正しく使えば』、同期周りをユーザーが全く書く必要がなくなった。
結果、『意図的に間違えるような事をしなければ』、デッドロックはしなくなった。
そして見た目はほぼ同期であり、素晴らしく分かりやすかったので、他も追従した。
(だから他言語でもasync/awaitを『正しく』使ってる限りデッドロックはしないはず)
『正しく使えば』『意図的に間違えるような事をしなければ』なんて一々言わずともまともな人には大前提だし、
そもそもフレームワークは規定通り使わないとまともに動かない。
君がイカレてるから君の周りも同様の人しか居らず、自分達が掘った墓穴に落ちて大騒ぎしてただけだと思うぞ。
(「正しく使おう」とか、君は考えた事ないだろ)
とはいえ、平行線だし、合意を取る必要はないので、まあこれで終わりだね。 ちなRustの所有権とか見直してみたが、
以前読んだ時よりは大分文面が修正されてるのか、マシな印象だが、
いずれにしてもゴミなのは事実だね。RustはC++の出来損ないになってる。
一番の問題は、所有権でライフタイム管理を「入れ子」ではなく「投げ捨て」型にした事であり、
これで余分に手間が増えてしまってる。
「入れ子」の方が自然なので殆どの言語で採用されており、
問題は「入れ子」にならない場合にどうするかだが、
C:全部プログラマが管理しろ
C++:スマポ入荷しました
Rust:スマポと所有権(投げ捨て型)
なら、全く進歩してない。
必要なのはスマポに変わる何かであり、Rustは何ら役に立つ新規提案がない。
基本的にC++の構成をなぞっただけであり、おかしな補助輪を付けてしまってるので、
C++で苦労してない人にとってはC++の方がマシだろう。
それで改善点がメモリリークしなくなった程度では、流行りようがないよ。
(そもそもC++も『正しく使えば』メモリリークはしない。
君の視点だと文法的に問題がない=コンパイルが通る=正しく使う、なのだろうし、
実際こう出来ればいいのも確かだが、現状のプログラミング言語の大半はこうなってない。
これは一概に悪いというわけでもなく、プログラミングスタイルに自由度を与える為には必要でもある。
文法エラー=新しいスタイルを試しようがない=進歩しない言語、という事になるので) 記述や理解が楽になる言語、ってわけじゃなくて、そもそも安全で高性能な言語であることが前提の言語だし、別にRustはメモリリークは解決してない
手間が少なく、安全である必要もないなら、Rustを使う必要性は薄れる >手間が少なく、
手間を少なくしたくて、
の書き間違い >>973
Rustはメモリリークは保証してないのに
そこを叩いてるのは何を調べたの? >>974,976
「GC無しで!!!」と謳ってたから「メモリリーク無し」は当然だと思ってたのだが違うのか?
(なお見てるのは主に公式勝手訳日本語版。そこすら全部読んでもないので)
> 手間を少なくしたくて、安全である必要もないなら
手間は少なくなってない気もするが。
安全って型安全の事?なら俺は型無しでもまあいいや程度なので、
確かに俺には意味がない言語なんだろう。
(型があっても困らないが、
C++みたいに関数ポインタを常用しようとするとテンプレートを書きまくらなくてはいけなくなるのは困る。
この点、関数型やスクリプト言語がどれもこれも型無しなのは非常に納得)
見た目Rustは、C++をある特定の使い方(と言っても多分本流本筋だが)に特化しただけのように見える。
だからそのプログラミングスタイルだった人には素晴らしく嵌るのだろうけど。 >>973
あまりにもデタラメすぎてむしろ苦笑
理解できなかったこと自体は仕方がないが
それにも関わらず他の言語をデタラメに叩くのはまともな人がすることではない
あまりにも間違いが多すぎて指摘しきれないが
例えば所有権はC++のスマートポインタ(unique_ptr/shared_ptr)で導入された概念
それなのになぜかC++にはスマポと書きながら所有権がなくRustのみに所有権と書いている
まずこの時点でC++の所有権とスマートポインタからして理解が出来ていない
さらにその後のRustに関することは妄想だらけになってしまっている >>977
変にrust叩きするのは恥かくだけなので
そのあたりでやめといたほうが >>973
貴方がC#に関して戦っている相手ID:BAdp3agq (>>966など)も同じくRustのアンチでRust関係スレで暴れているが
貴方は同じRustのアンチでもダメな彼より劣る
貴方は他の言語の知識も薄くRustについては何も理解しないまま嘘を書いている >>978
書き方が悪かったかもしれんが、
ブロックスコープで済み、それが最適な場所にすら所有権を強制して、
結果的に無駄に借用とかする羽目になってるのは事実だろ。
問題は、プログラミングでは大半の場合で「入れ子」が最適な事。
「投げ捨て」が向いてるのは、上から下に流れて終わり、のようなプログラムで、
サーバーは確かにそうだが。 あの子みたいにまともに議論する気がないのはお話にもならないけど、
知識が足りないのはまあしょうがないやろ
全部わかってるひとなんてこんなスレには1人もいないだろうし
>>977
伝わらなかったみたいだけど、そうそう、Rustは手間を少なくする言語でもないよ
データ競合なくして型も省略しまくりたい、みたいなのだったらHaskellみたいに型推論がやたら強い言語とかもあるし >>981
他の言語を批判したいなら、せめてもう少しは勉強したほうがいいよ
その意味不明な文章は理解不足が引き起こしている
もしどうしてもRustについて理解できないのならば、先にC++のunique_ptrを学んで所有権とは何かを理解すべき
あと他の人たちも指摘しているが「入れ子」や「投げ捨て」が意味不明 >>982
なら何を目指してんのよ?
他に謳ってたのは「ゼロコスト抽象化」だが。
公式勝手訳日本語版まえがき、には
> 既に低レベルコードに取り組んでいるプログラマは、Rustを使用してさらなる高みを目指せます。
> 例えば、 Rustで並列性を導入することは、比較的低リスクです: コンパイラが伝統的なミスを捕捉してくれるのです。
一文目は素晴らしい。
が、二文目は、無いよりまし程度だし、そもそも無駄に手間が増えてる部分もあるから意味なくね? >>982
Rustを使うことで様々な手間が省けるのは事実
もちろん元の言語が何であるかによって、どんな手間が省けるようになるのか変わる
だから手間が省ける議論に関しては、比較対象を毎回固定しないと一般的な議論は無意味 >>985
色んな言語やればわかるが
その並列性に関してはRustがベストで間違いない
データ競合が起きないことをRustは保証する
言いがかりをつけているだけの君の負けだ 知識不足指摘されて意味のわからん逆ギレ起こすのは
同程度だったな Rustの利点はプログラミングがしやすいことに尽きるかな
とにかく書きやすくて全体の効率がいい
自分にとっては安全とか保証とかはオマケで付いてくる位置付け >>987
それについてはさんざん言ってきたが、同様に前書きには
> 伝統的にこの分野は難解で、年月をかけて
> やっかいな落とし穴を回避する術を --- (A)
> 習得した選ばれし者にだけ可能と見なされています。
> そのように鍛錬を積んだ者でさえ注意が必要で、 --- (B)
これも事実だが、逆に(A)が存在するのも事実なんだよ。
ただ、(B)も事実だから、やってくれる事に越した事はないが、
それでも「全部完璧にやってくれる」のでなければ丸投げは出来ない。
具体的に言えば、GCならメモリ管理一切しなくて済むけど、そういうわけでもないし、
並列時のロックや競合も完璧にはやってくれない(だろう)から、手間自体は大して減らないよ。
例えば(A)だけどさ、
> データ競合が起きないことをRustは保証する
実際Rustがどこまで検出出来るのか知らんが、データ競合を回避したいのなら、
そもそもディスパッチ前に全部解決してしまう
(共有部分に書き込み出来るのはメインスレッドだけにする、
ディスパッチ以降は不変、無理ならディープコピーを渡す)のがセオリーで、
この形式でメインスレッドからサブスレッドをこき使うのがC#のasync/awaitの形であり、
こう「正しく使えば」全く問題ないわけ。(上位構造で問題を解決する)
このセオリーを知らない=『術を習得もしてないし選ばれてもない者』にはRustは役に立つかもしれんけど、それは、
> Rustを使用してさらなる高みを目指せます。
なら、嘘だね、という話だよ。術を修得してれば同じ事は既に出来てる。
だから何度も言ってるように、
Rustが得意(らしい)、細かく共有しないと無理か、爆速になるアプリは何?
(セオリー通りに構成した時に性能が出ないアプリは何?)
と聞いてきてたわけ。
馬鹿向けの杖ならいらねえ、な奴はいくらでもいるでしょ。
(俺が賢いというのではなく、ノウハウは既に溜まってるという意味で) >>985
Rustは性能、メモリ安全性、安全な並行性を目指して設計されているシステムプログラミング言語です
結果としてベアメタル環境でも利用可能です
>>986
そうっすね、同意するし、こだわりたい話でもないのでどうでもいいけど一応今回の手間に関しては >973 の文脈だよ >>990
C#の人かね
それならば習得すればRustの方が圧倒的に楽
後発言語なだけあって既存言語の問題点を解決しつつ良いところを洗練して採り入れてることが習得するとよくわかる >>991
> 結果としてベアメタル環境でも利用可能です
ちなみに、以下の
> Rustの非同期プログラミングで出来るようになること
> 組み込み
> https://tech-blog.optim.co.jp/entry/2019/11/08/163000
この「組み込み」は面白いと思ったよ。(妄想らしいが)
見た目ポーリングにしか見えない点が問題だが。(慣れかもしれんが) データ競合なんて言葉を使うから議論がかみ合わないのであって
例えばgolangでforループで逐次処理してた部分をgoroutine使って並列動作するよう修正したときに
うっかりループカウンタをgoroutine内でそのまま使ってしまって意図通り動かなくなったりすることがある
普通はテストなりで検出できるけど、条件が込み入ってくると検出するのが難しいバグの原因になるかもしれない
rustの場合こういったうっかりをコンパイル時にできるだけ検出できるように言語仕様が考えられている
rustを使えばあらゆるミスを検出できるわけではないけど、うっかりの入り込む余地を減らせるだけでも嬉しい人はいるだろう
逆にそんなうっかりはしないから好きに書かせてくれよという人もいるかもしれない
それぞれの考えに合った言語を選べば良い、と言ってしまうこのスレのテーマの否定になってしまうか >>991
その>>973を見てみたが意味不明すぎる
>C:全部プログラマが管理しろ
>C++:スマポ入荷しました
>Rust:スマポと所有権(投げ捨て型)
C++が所有権を導入したことがunique_ptrとshared_ptrのスマポであるのに
なぜかスマポと所有権が別扱いになっている
さらに所有権が初めてRustで登場するのもおかしい
『投げ捨て型』に至っては何のことやら意味不明
C++もRustも理解していない人が妄想で批判しているようだが >>972
.NETのモデルの悪さを指摘されてそれを認められないのはお前だろwwwww
俺はそれ以外の話をしてないんだよw 向いてないよマジでw Rustのメモリ安全については、いかなる条件でも「保証する」と言われない限りは突っ込んだ人の負けだぞw
循環参照については、
https://doc.rust-lang.org/book/ch15-06-reference-cycles.html
を読んでそれに従って苦情を言えw そうでないと反論にならないw このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 113日 11時間 15分 5秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。