Rust part26

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2024/09/20(金) 22:18:38.38ID:c48cFuZJ
公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust

公式ドキュメント
https://www.rust-lang.org/learn

Web上の実行環境
https://play.rust-lang.org

※Rustを学びたい人はまず最初に公式のThe Bookを読むこと
https://doc.rust-lang.org/book/

※Rustを学ぶ際に犯しがちな12の過ち
https://dystroy.org/blog/how-not-to-learn-rust

※Rustのasyncについて知りたければ「async-book」は必読
https://rust-lang.github.io/async-book/

※次スレは原則>>980が立てること

前スレ
Rust part25
https://mevius.5ch.net/test/read.cgi/tech/1722354386/

ワッチョイスレ
プログラミング言語 Rust 4【ワッチョイ】
https://mevius.5ch.net/test/read.cgi/tech/1514107621/
2024/10/02(水) 21:02:06.37ID:qmniBqed
>>84
だいぶん前から出来るよ。
const キーワードを使う。
https://doc.rust-lang.org/reference/items/generics.html
ただ、現在の C++ よりは制限がきつい。
86デフォルトの名無しさん
垢版 |
2024/10/02(水) 21:08:54.46ID:AFS53MaU
>>81
横からだけど、そういうベンチマーク結果ってなくない?
同じアルゴリズム、同じPC上での結果なんて、ブログ記事で見るかどうかレベル。

大抵順位が出てるのは他人がバラバラのアルゴリズムで(同じ目標の)コード書いて、同一鯖上でベンチマークした結果ばっかりな気がする。
2024/10/02(水) 21:34:49.26ID:qmniBqed
それぞれの言語で自然な書き方で比較するのもそれはそれでフェアな条件の付け方じゃない?
実際問題としてそれぞれの言語で完全に同一のアルゴリズムで同一の構造になるようなことはないんだから言語の通常の習慣を曲げてまで条件を揃えるのが本当にフェアなルールだとは思わないな。
「普通にやったらこうなる」という比較のほうが日常的なユースケースでは意味のある比較に思える。

処理系を作る側が改善箇所を探す用途のベンチマークだったらまた事情は違うかもしれないけど。
88デフォルトの名無しさん
垢版 |
2024/10/02(水) 21:35:48.88ID:192UGWkp
>>85
サンクス
自分はThe Rust Program Language の日本語訳を参照してたけど、こちらには同様の説明が見当たらなかった (単に見落としかも?) ので、適切なリファレンスへのリンクは助かります
2024/10/02(水) 22:06:25.68ID:ufu02mt0
>>88
公式読めよ
2024/10/02(水) 22:11:54.22ID:qmniBqed
>>88
そのへんはたぶん英語版でも書いてないと思う。
The Rust Program Language は入門とか紹介という立場なので言語機能を網羅的に説明しているわけではないよ。
2024/10/02(水) 22:13:09.56ID:F+8Yq1v3
>>78
昔とは異なり
必要な境界値検査はプログラミング言語が責任を持って行わなければならない
この必須の機能を持たないC/C++は危険な言語として米ホワイトハウスも安全な言語への置き換えを推奨すると表明している
92デフォルトの名無しさん
垢版 |
2024/10/02(水) 23:30:25.01ID:U5iz23L2
単純なforで初期値と終了値が確定してるなら
境界超えは有り得ないんだから
そんなのまで境界チェック入れるのはナンセンス
2024/10/02(水) 23:32:21.66ID:5rx4Z4Pt
>>92
そこに着目して各個別の境界チェックを無くしてCと同じ速さが出るようにしたのがRustだね
2024/10/02(水) 23:52:48.74ID:iTWoI127
>>93
そうじゃない例が多くてなあ
同じLLVMのZigがRustより早かったしな
2024/10/02(水) 23:59:36.32ID:iTWoI127
あった、前スレ930

Zig 0.107
g++ 0.115
Rust 0.129 (bit-vect)
clang++ 0.131
Go 0.202 (godropbox/container/bitvector)
Rust 0.284 (Vec<bool>)
Go 0.326 ([]bool)
2024/10/03(木) 00:25:43.29ID:ooCKJPq8
>>94
Zigは境界チェックをしていないダメな言語側なので論外
2024/10/03(木) 00:29:43.46ID:Zb2tT7+Y
オプションで境界チェック消すのはRustと一緒じゃん
2024/10/03(木) 00:36:59.84ID:Zb2tT7+Y
>>95
よく見たら、これはインデックスでのランダムアクセスが必要なアルゴリズムだから
Rust側はオプションで境界チェック消さないとclangにも追い付かない

ダメな言語側避けると、RustとGoが同レベルなんじゃないかな
99デフォルトの名無しさん
垢版 |
2024/10/03(木) 01:45:50.92ID:dz5L3Xqm
>>87
>「普通にやったらこうなる」という比較のほうが
>日常的なユースケースでは意味のある比較に思える。
SNSでRustとC++でベンチマークを書いている人、
C++では、「普通のやり方」が書けてないケースが
ほとんど。
そもそも、C++がCよりも数%を超えるような
大幅に遅い結果が出ている時点で書き方がおかしい。
2024/10/03(木) 01:56:21.29ID:03B8BtDx
>>99
妄想じゃないなら参考までに2,3見繕ってくれよ
2024/10/03(木) 01:58:36.94ID:dz5L3Xqm
Rust信者は自分が間違っていることに気付かない。
2024/10/03(木) 01:59:28.46ID:ooCKJPq8
>>97
Zigは-O ReleaseSafeかDebugの時を除いて境界チェックをしないため危険
Rustは常に境界チェックをするため常に安全
もちろん安全に境界チェックを取り除ける場合は消える
2024/10/03(木) 02:04:50.11ID:03B8BtDx
>>102
>>95のRust&clang++場合は、本当は安全だけど境界チェックを取り除けなかったんだろうな
2024/10/03(木) 02:06:36.38ID:03B8BtDx
C++でもborrow checkerがcompiler explorerで動いてるし色々動き出すな

Safe C++ Proposal P3390R0
2024/10/03(木) 02:09:42.83ID:ooCKJPq8
>>103
妄想でないならソースコードとその時の生成コード例を出してみて
2024/10/03(木) 02:15:34.65ID:/vd3aRJZ
?
前スレで出てたgithubとタイム見ただけだから自分で確かめてよネ > 105
2024/10/03(木) 02:15:50.14ID:dz5L3Xqm
先生に対して、仕事を要求する馬鹿な生徒。
2024/10/03(木) 02:16:52.99ID:dz5L3Xqm
>>107の指摘は、>>103 に対することだが。
2024/10/03(木) 02:20:51.39ID:/vd3aRJZ
Rust関係なさ過ぎて熱が冷めたからSafe C++ Proposal P3390R0に移るかな
2024/10/03(木) 02:20:55.67ID:dz5L3Xqm
Rust信者は自分が優秀だと思い込んでいる人が多いらしい。
しかし、実態はそうでもない。
2024/10/03(木) 02:24:53.89ID:/vd3aRJZ
それは良くないw
数時間前のHaskellスレを見てしみじみ思ったw
2024/10/03(木) 02:29:35.48ID:dz5L3Xqm
>>108
>>103」ではなく「>>100」や「>>105
だった。スマン。
手間がかかることを人に要求し、それが提示されない
事を持って、相手がうそつきだと認定する手法を
使っている。
詭弁の一種だ。
2024/10/03(木) 02:31:10.25ID:/vd3aRJZ
safecpp.org/P3390R0.html
2024/10/03(木) 02:32:32.82ID:dz5L3Xqm
Rust信者は、どんどんどんどん、間違ったベンチマークや
間違った情報を発信してくる。
それに対していちいち正すことはできない。
次から次へと間違ったうそ情報を垂れ流し続ける相手に
対して、どうして優秀な人材が貴重な時間を割いて正さなきゃ
ならないのか。
それは世界的損失だ。
2024/10/03(木) 02:39:54.40ID:/vd3aRJZ
C++/CLI/CXのかほりがする

>>112
まともな議論はもう無理ぽ
2024/10/03(木) 02:43:43.51ID:/vd3aRJZ
>>114
一人の作者が複数言語書くと熱意に偏りが出るね

その意味ではちょっと前だけどJavaで始まった1brcが他言語にも波及してそれぞれの達人が競い合ってた
Rustはルール違反取られたけどねw
2024/10/03(木) 02:54:00.24ID:ooCKJPq8
言語によって標準ライブラリの範囲が異なり意味がないのにこのルールだからね

[Rules and limits]
No external library dependencies may be used. That means no lodash, no numpy, no Boost, no nothing. You're limited to the standard library of your language.
2024/10/03(木) 02:58:26.34ID:ooCKJPq8
Rustでは普通によく使われるこのあたりのライブラリすら使ってはいけないことになる
https://github.com/tumdum/1brc/blob/main/Cargo.toml
2024/10/03(木) 02:58:57.45ID:dz5L3Xqm
最悪のケースだと、こういうところで、最初間違った
ことを散々書いていて、痺れを切らした優秀な人
に時間をかけて情報を提示させ、しれっと
それを論文にまとめて自分の手柄にしてしまうような
不届き者が出てくる。
2024/10/03(木) 06:10:20.97ID:2hL7NSan
各IT大手だけでなくホワイトハウスや国防総省までC/C++を捨ててRustへ移行と言っている
少なくともRustと同レベルの安全性を備えない限りこの流れは止まらないだろう
121デフォルトの名無しさん
垢版 |
2024/10/03(木) 07:37:36.99ID:xd7ZayaC
>>118
一つ上のレスのルールを見る限り当たり前じゃね?
「皆が当たり前に使うライブラリ」ならC++のBoostやPythonのnumpyだってそうだろ
しかも >>118 はバージョン1未満のものもあって、それは同じコードが将来動かなくなる可能性があるわけだし
2024/10/03(木) 07:48:32.16ID:2hL7NSan
Rustでコードが将来動かなくなる可能性はない
ましてやバージョン1未満かどうかなんて関係ない
2024/10/03(木) 10:29:08.64ID:J18SNG72
バージョンや環境を塩漬けにしてただ動けばいいだけという話じゃないだろ
コードの変更を伴わずに継続的に本番運用できる期間の長さが重要

rust自身やstdのAPIの後方互換性の保証だったり
脆弱性対応の修正数の少なさだったりはいいけど
3rd partyライブラリはそうもいかない

1.0未満はもちろん1.0以降でも
永久に過去バージョンの対応ができるわけでもない
124デフォルトの名無しさん
垢版 |
2024/10/03(木) 10:48:04.49ID:Z/ktGrzU
>>99
Cは速いけどC++はどちらかと言うと遅い言語の部類に入る
125デフォルトの名無しさん
垢版 |
2024/10/03(木) 10:55:54.38ID:Z/ktGrzU
>>110
本当に優秀ならRust使う必要無いもんな
126デフォルトの名無しさん
垢版 |
2024/10/03(木) 11:00:18.13ID:Z/ktGrzU
>>119
chatGPTのことですねω判りますωωω=2πf
127デフォルトの名無しさん
垢版 |
2024/10/03(木) 11:06:17.98ID:Z/ktGrzU
>>122
Cargoで管理してればある程度はそうだけど
それも暗黙のルールに期待した場合の話に限るから
絶対描き換えなしで動き続けるかというとそうでもない
最低でもCargo.tomlの描き替えが必要だったりする
この辺はRustの責任ではないがCargoにもRustのメモリ安全ωの姿勢を見習って欲しい
2024/10/03(木) 12:14:17.60ID:ooCKJPq8
バージョンを指定した
上でCargo.tomlを書き換えなければ
自分で書いたソースコードは外部ライブラリに影響されずに永久に動くところがRustの利点なんだよ
129sage
垢版 |
2024/10/03(木) 12:33:12.38ID:Z/ktGrzU
>バージョンを指定した上でCargo.tomlを書き換えなければ
>自分で書いたソースコードは外部ライブラリに影響されずに永久に動く

version = "0.1.0"
じゃなくて
version = "=0.1.0"
と描いた場合に限る
130デフォルトの名無しさん
垢版 |
2024/10/03(木) 12:34:26.98ID:Z/ktGrzU
version = "0.1.0"
だと
外部ライブラリに影響される

外部ライブラリに影響されないのは
暗黙のルールに期待した場合の話に限る
131デフォルトの名無しさん
垢版 |
2024/10/03(木) 12:36:20.68ID:Z/ktGrzU
もちろん
version = "=0.1.0"
と描くのは現実的ではないが
>バージョンを指定した上でCargo.tomlを書き換えなければ
を満たすための矛盾

従って"暗黙のルールに期待した"Cargoは糞
2024/10/03(木) 13:08:08.08ID:fMIIfXl3
繰り返し構文の直前だけで行うように最適化されたにしろ
Rustだと配列の範囲をはみ出してないかの検査が
リリース版アプリでも入り続けるのだろうが、
それで不合格になるとアプリはダウンするから、
自動運転では人が死ぬので意味無い。
2024/10/03(木) 14:18:38.46ID:J18SNG72
>>131
>>128の文章が足りてないだけで
そこはCargo.lockの担当範囲やろ
2024/10/03(木) 18:08:46.17ID:vqUXT4xx
おまいら愚痴ってないでcode書け
書いて書いて書き捲れ
135デフォルトの名無しさん
垢版 |
2024/10/03(木) 21:40:37.20ID:xd7ZayaC
>>124
C++で遅いというなら「どちらかというと速い言語」って何が残るんだ
2024/10/04(金) 17:31:48.28ID:8BYffXd4
ざっくり速い遅いとか言ってるやつは雑魚でしょ
相手しなくていい
2024/10/04(金) 22:11:50.25ID:DHhd1aGk
十倍とか百倍とかいうレベルで露骨に差があるものならざっくりした比較でいいよ。
細かい数値が必要になるのは差が微妙だからで、その微妙な差を素人が適切に評価できるんかって話だわ。
データを出したってどうせそのデータを適切に読み取るのは無理だ。

そりゃ Rust が実行時にも境界チェックをする場合がある (実行コストが上がる) のは本当だけど、
Rust のほうが C++ より最適化しやすい (エイリアス解析がやりやすいので) というのはあるし、
その一方ではまだ C++ の処理系のほうが歴史の積み重ねが多くて強いというのもある。

ざっくりは無意味だが細かい数値も要因が絡み合いすぎてどうせ意味わからんから無意味。
2024/10/04(金) 22:21:16.42ID:JAupTFkx
>>136が言ってるのはそういう「ざっくり」ではないと思われ
2024/10/04(金) 22:40:51.60ID:jgzzZHCa
ざっくりどころか明白にC++はCより遅いしRustはさらにもっと遅い
140デフォルトの名無しさん
垢版 |
2024/10/04(金) 22:59:19.40ID:VBc4dd6u
C以外を全て「遅い部類」というならもうそれ部類って言葉が合わないんじゃないかな
2024/10/04(金) 23:37:34.19ID:cfR7b6v5
ほとんどのケースでRustはCと同程度の速さを出せる
安全性はもとよりモダンな抽象による開発効率と保守性の高さによりRustへの移行が進められている
142デフォルトの名無しさん
垢版 |
2024/10/05(土) 10:53:01.80ID:RULYnmJH
BoxやVecって、データを一旦スタックに書いてからヒープに渡されるよね
Bnx::new(でかい構造体)
のようなことをやる際に、直接ヒープに構築したいんだけど、unsafeを使えばできる?
2024/10/05(土) 11:04:55.83ID:tM0+DMRb
>>142
box演算子を使う
2024/10/05(土) 13:18:05.42ID:YtzMlx/f
>BoxやVecって、データを一旦スタックに書いてからヒープに渡されるよね
うそーん?
そのくらいは最適化されるやろ?
2024/10/05(土) 14:23:20.89ID:ntqlGNr5
>>141
そんなこと言う人は多いけど、その人たちはアルゴリズムを理解してない。
2024/10/05(土) 15:12:54.52ID:u1hwkRNd
Rustは境界検査ある分Cよりは遅くなるよね
境界検査オフにしたらベンチマークのスコア上がったみたいな記事がZennにあった気がする
2024/10/05(土) 15:18:00.36ID:Whmox1cd
そんなことしたらコーダーが勝手に最適化()するから駄目だろ。
2024/10/05(土) 16:20:58.85ID:SPb9kptA
>>146
Rustに境界検査オフにするオプションはないからそれは別の言動の話でしょう
Rustでは常に行われますが論理的に安全だと判定できる場合に最適化されて消えます

一方で境界検査がない言語では必要な境界検査をプログラマーが手動でする必要があります
それを忘れると深刻なセキュリティホールになる可能性があります
レアな特殊な状況が揃って初めて発生することもあるためサニタイザーでは見つけることが困難です
149デフォルトの名無しさん
垢版 |
2024/10/05(土) 17:01:50.15ID:RULYnmJH
>>143
詳しく
"box operator" のような単語でググってみたけど、それらしいものを見つけられてない
2024/10/05(土) 17:08:36.51ID:7dJZ4c51
>>148
get_uncheckedとかあるやろ
2024/10/05(土) 17:33:09.63ID:MY6FIQ9N
>>149
少なくとも stable には無い。
現時点では box が予約語扱いになってるが、将来に使用するための予約であって現時点では使ってないと名言されてる。
https://doc.rust-lang.org/reference/keywords.html

以前に検討したけど取り下げた記録はある。
https://rust-lang.github.io/rfcs/0809-box-and-in-for-stdlib.html
今はどうなってるんやろね?
2024/10/05(土) 17:40:46.65ID:MY6FIQ9N
× 名言
〇 明言
2024/10/05(土) 17:53:26.30ID:YGXhd2d0
>>146
分かりやすさから境界検査だけの遅さは分かっている
人が多いが、実は境界検査は些細な違いに過ぎない。
それ以上の事は言わない。各自で考えろ。
分かる人だけが分かっていればいい。
2024/10/05(土) 22:25:00.84ID:nBMiTSwQ
https://github.com/rust-lang/rust/pull/97293
https://github.com/rust-lang/rust/pull/108471
現状なんかな?
2024/10/05(土) 23:58:02.93ID:aBfTO+dT
たしかbox記法をやめて
#[rustc_box]へ変えたはず
2024/10/06(日) 02:23:22.08ID:Fc/J32B0
>>142
今は
let mut b = Box::<BigStruct>::new_uninit();
とする
2024/10/06(日) 02:59:36.25ID:Uy2TM6oP
ボツになった box キーワードを使ったやりかただと C++ でいう new みたいなのを想定していたんだと思う。
同じコンストラクタでスタック上にもヒープにもオブジェクトを構築できるようにってことね。
今の Rust の stable 内でやろうとすると未初期化のヒープ領域を確保してからそれに書き込むという段階を踏む必要があって同じ生成関数をキーワードひとつで切り替えてつかうということは出来ない。
そういうちょっとした不恰好さを呑む必要はある。
2024/10/06(日) 10:41:43.35ID:pGBP5yto
>>156
コンパイラや標準ライブラリの開発者は#[rustc_box] + Box::new()を使うのに一般開発者はBox::new_uninit() + unsafeブロックで手動初期化しなきゃいけないというのはなんとも微妙だね
2024/10/06(日) 11:07:22.09ID:jCq2z3ec
>>153
わかってないやつが言っても説得力ないよ

境界検査を外す話はこれかな
https://proc-cpuinfo.fixstars.com/2019/09/rust-wins-cpp/
2024/10/06(日) 13:00:12.28ID:RTiROZJD
>>159
実行毎に数十msはブレる処理でC++より数ms速くなりましたとか微妙すぎるな
2024/10/06(日) 14:13:57.31ID:WBd7Gzjc
>>160
同感、20~40msはぶれる

>>159
Rustシングルスレッド版のcommit:23807a67df266ac8c6ba065801616a4012555344に戻して
単一実装毎に10回計測した最速値

SequentialNative, PreProcess, 3.328, Solve, 767.845, PostProcess, 0.521 <- C++/g++
SequentialNative, PreProcess, 3.679, Solve, 785.951, PostProcess, 0.502 <- C++/clang++
Rust, PreProcess, 3.407, Solve, 796.38, PostProcess, 0.599 <- Rust
2024/10/06(日) 14:32:01.49ID:SXFzPwbD
一番下の方にリンクしてあるQiitaの追試記事も読むといい
2024/10/06(日) 14:47:13.76ID:x2YI0jj4
>>159
「検査例外は些細な違いに過ぎない」
と言ったのは、Rustには、もっと非効率な部分があるからだぞ。
逆に捉えた人がいるかもしれないが。
2024/10/06(日) 14:48:25.28ID:x2YI0jj4
>>163
誤:検査例外
正:境界検査
2024/10/06(日) 22:43:06.06ID:yDkn3TVj
Rustコンパイラが通常の機能として論理的に安全と解析できた時は境界検査を省略しているのに加えて
プログラマーがさらにヒントを与えることで境界検査を安全に無くしたり減少させたりする方法もありかなりをカバーできる
それでもカバーできない範囲は人間が安全性を保証する形でunsafeを用いて関数やモジュール内に閉じ込める最後の手段がある
プログラムのそれ以外の部分は依然としてRustが安全性を保証するためRustを用いたほうが断然に有利
2024/10/06(日) 22:58:46.94ID:xpAyDRS+
相変わらず非論理的やな
2024/10/07(月) 01:41:44.93ID:q99irmJP
基本をどっち側に倒してるかって話だわな。
チェックするのを基本にする (けど必要ならチェックを除くことも出来る) のか
チェックしないのを基本にする (けど必要ならチェックすることも出来る) のかって話で、
やりやきゃどっちも出来るんだから場合によって自分で判断しろよ。
2024/10/07(月) 02:43:52.62ID:X74uBgxx
これはさすがに釣りだよね
2024/10/07(月) 04:55:29.89ID:JLiQrglj
もしかしてRustってコンパイルめちゃくちゃ遅い?
2024/10/07(月) 10:41:01.74ID:AsZpJSRX
一回コンパイル済みなら、2回目はそれなりの時間

初回のsdk-ec2は遅すぎて何度中断しようかと思ったわ
171デフォルトの名無しさん
垢版 |
2024/10/07(月) 15:40:05.30ID:m+p7ApSZ
cargo update するとすぐ破綻する
2024/10/07(月) 16:27:42.48ID:meOfPwUY
sccacheで二度目以降はもう少し改善した
コンパイル速度はC++同様遅い部類だと思う
2024/10/07(月) 17:01:46.54ID:89HfDe1C
>>163
それの具体例を示せてない時点でね…
2024/10/07(月) 23:19:03.68ID:TZwLk8HD
安全に境界検査不要をassert!でRustコンパイラに伝える方法が意外に効くね
2024/10/07(月) 23:26:15.84ID:dfTx2VFf
>>173
馬鹿には示す必要ない。
2024/10/08(火) 08:44:17.05ID:eFef5p6V
>>174
詳しく
2024/10/08(火) 09:34:58.32ID:+McDiVVz
自分で定義してないtrait(T)を自分で定義してないstruct(S)に定義したい
impl T for S {
}
2024/10/08(火) 10:04:39.98ID:A/U5l8w3
>>177
できないのでどちらかをwrapして下さい
2024/10/08(火) 10:36:24.86ID:8N0aYuJN
>>177
orphan rule と呼ばれる制限。
どうしてこの制限が必要なのか、対処法のイディオムなどはググればいっぱい説明されてるよ。
180デフォルトの名無しさん
垢版 |
2024/10/08(火) 21:24:47.85ID:pQ+vP70p
>>175
知らないだけw
2024/10/08(火) 21:26:47.09ID:CJF5aBIv
>>180
やっぱり本当に馬鹿なんだな。
それに説明しても理解できない。
2024/10/08(火) 23:19:20.44ID:0gkuNx2u
>>176
https://nnethercote.github.io/perf-book/bounds-checks.html
2024/10/09(水) 08:10:07.07ID:6t9Q00Al
>>182
thx
184デフォルトの名無しさん
垢版 |
2024/10/09(水) 14:24:59.18ID:SE80KZZv
慈円乙
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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