Rust part25

■ このスレッドは過去ログ倉庫に格納されています
2024/07/31(水) 00:46:26.17ID:DBMWY2QT
公式
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 part24
https://mevius.5ch.net/test/read.cgi/tech/1716759686/

ワッチョイスレ
プログラミング言語 Rust 4【ワッチョイ】
https://mevius.5ch.net/test/read.cgi/tech/1514107621/
2024/08/24(土) 18:52:59.44ID:73Xik/Zr
>>412
当然できるけど
危険な行為なので熟練者とキチガイしか使わないよ
2024/08/24(土) 18:53:02.17ID:tVyuBhwz
>>415
一応Referenceのunsafe blockの部分は読んだけど、nomiconも全部読まなきゃだめ?
具体的にどこが間違っている/作法に反しているのか指摘してくれるとありがたいんですが……
2024/08/24(土) 18:55:23.20ID:wRPlPCuY
>>417
参考のため、どう書けばいいのか教えていただければ幸いです。
2024/08/24(土) 18:55:51.72ID:NdtpJtS7
>>416
反対意見なんてないよ
人間はバカだからC/C++ではなくRustを使わざるを得ない状況になってるんだし
なるべくならRustなんて使いたくもない
2024/08/24(土) 18:57:28.86ID:73Xik/Zr
>>416
インフラやFFI部分のライブラリを作る上級者は例外として
unsafeを使うのはキチガイばかりだね
2024/08/24(土) 19:07:44.35ID:tVyuBhwz
>>412
変換するだけならunsafeも特に要らなくて、ただのasキャストでいいみたいね
fn convert_uint_to_ptr(u: usize) -> *mut u8 {
u as *mut u8
}

これをやるだけの関数なら、まだstableじゃないけど標準ライブラリにもあるようで
安全にするためにstrict provenance rulesなる仕様を検討中な様子
https://doc.rust-lang.org/std/primitive.pointer.html#method.from_bits-1
https://doc.rust-lang.org/std/ptr/fn.with_exposed_provenance_mut.html
2024/08/24(土) 19:24:20.93ID:7iJIMzJC
ポインタは観測するまで安全
424デフォルトの名無しさん
垢版 |
2024/08/24(土) 20:06:41.28ID:Rv8eKBYx
逆参照しなきゃ安全
だけど大体はアドレスがわかってるならそれを指すポインタや参照もわかってるはずなのでアドレスをポインタにする機会はそんなにない
425デフォルトの名無しさん
垢版 |
2024/08/24(土) 20:08:48.83ID:puH13oDz
>>392
そらそうやけど、それでうまく行くならC++でええやんいう話になるわな
2024/08/24(土) 20:22:17.51ID:ZYhP4fGD
Rustに不慣れで技術力の低い人がunsafeを使う傾向が高い
ほとんどのケースは既存の安全なパーツを組み合わせるだけで安全に実装できる
2024/08/24(土) 21:14:33.88ID:tVyuBhwz
>>426
単発君
自分でunsafeを書く必要性がない書く気がないならそれでいいと思うし、その立場は理解したから、どうか他人の足を引っ張らないでくれ
unsafeの書き方を学ぼうという同志がいないのならそのうち去るから、すまないがそれまで待ってくれないか
2024/08/24(土) 21:26:04.07ID:4K3Bdck4
unsafe で UB になる場合を知りたい場合にはどこに仕様が書いてあるのかがそもそもわからん。
2024/08/24(土) 21:26:45.92ID:Fuip7Jnb
UnsafeCellを使ってる頭のおかしな人のコードはborrow checkerに引っかかってコンパイルを通せないところから始まってるよね
unsafeの使い方を学ぶのではなくsafe Rustの使い方を学ぶべきかと
2024/08/24(土) 22:11:07.05ID:tVyuBhwz
>>428
現状のベストエフォートのまとめはこれですかねえ
LLVMのマニュアルなんて参照しちゃってるから、LLVM IRまでのloweringの詳細を完璧に把握でもしていない限りこれを一次資料として参考にするってのは無理そうですが……
https://doc.rust-lang.org/reference/behavior-considered-undefined.html

あとは呼んでいるunsafe fn/実装しているunsafe traitのドキュメント(当たり前)と、the Referenceをundefinedで検索した結果とかでいいんでしょうか
2024/08/24(土) 22:14:58.07ID:cfGbu5GL
既存の安全なパーツを使いこなせる熟練者であることがunsafeを書くための最低限の資格だ
これができないとunsafeを使うべきか否かという入口すら判断できない
2024/08/24(土) 22:53:26.45ID:4K3Bdck4
Rust のメモリまわりの動作モデルは結局は C/C++ に合わせることにしたみたいな話をどこかで見たようなおぼろげな記憶がちょっとある。
LLVM がなんだかんだで C/C++ を想定した形になってしまっているのとその辺の低レイヤの部分がちゃんとモデル化されている言語が C/C++ くらいしかないから Rust のためにあらためて検討するくらいならもう合わせちゃって良くない? みたいなニュアンスだったと思うんだけどどこで見たのかも思い出せないから違ってたらごめんね。
2024/08/24(土) 23:22:54.73ID:2MnTl83M
>>422
有難うございます。
ところで、Rustでは、unsafe 以外では、専ら参照型が使われると思っていたのですが、
unsafe を使わない部分でも、ポインタ型 * が使えるようですね。
Rustにおけるポインタ型を参照型のアドレスに採用する方法も教えていただければ幸いです。
C++ であれば、
T x; //xは、T型の変数。
T *p = &x; //pは、T型へのポインタ型。アドレスは変数xのアドレス。
T &r = *p; //rは、T型の参照型。
で、参照型rのアドレスがpの指すアドレスに一致しますね。
2024/08/24(土) 23:31:10.68ID:BmB2eUS9
>>433
生ポの参照外しはできない
生ポを参照にすることもできない
それらはunsafe
2024/08/24(土) 23:50:29.93ID:2MnTl83M
>>434
では、C++であるならば、以下の様に書けそうなコードをRustで書くとすると
どうなるでしょうか。
BYTE &ConvertPtrToRef( BYTE *p ) {
 unsafe {
  return *p;
 }
}
2024/08/25(日) 00:56:39.20ID:al6llTVI
unsafe { p.as_ref().expect("p is not null") }
unsafe { p.as_mut().expect("p is not null") }
unsafe { &*p }
unsafe { &mut *p }
2024/08/25(日) 01:28:05.04ID:dkRsAaY3
そもそもRustの参照とC++の参照が1対1に対応しないので、そこを無視してもどうなんだという問題
438あぼーん
垢版 |
NGNG
あぼーん
2024/08/25(日) 06:34:29.42ID:5GOytbIs
>>438
まじか
2024/08/25(日) 15:06:59.24ID:ftonnHt3
>>433
std::slice::from_raw_parts
std::slice::from_raw_parts_mut
2024/08/25(日) 16:07:14.33ID:+NmqKH/G
unsafe大好き
2024/08/26(月) 07:21:14.48ID:HvObP+1c
unsafe rustよりzig
2024/08/26(月) 07:32:17.72ID:EZDOC4zz
zigは未完成
444デフォルトの名無しさん
垢版 |
2024/08/26(月) 11:03:43.55ID:3+7ACU+U
zigよりNim
2024/08/26(月) 12:45:51.89ID:6drfVC9J
Rustでunsafeを迂闊に使っていると信用失墜リスクがある
例えば安全に書けるシーンでunsafeを使っていればRustに疎くレベルが低いと客観的に判定されてしまう
そして書いたコードは信頼されなくなるため要注意だ
2024/08/26(月) 13:27:24.67ID:/RxTrZ/p
んでNimよりCってわけ
447デフォルトの名無しさん
垢版 |
2024/08/26(月) 23:59:19.70ID:TniAJlSa
unsafeなしに拘るならそもそもunsafeという仕様のない言語を使えば良いのでは
2024/08/27(火) 00:09:57.79ID:ft2/OuFA
unsafeはFFI部分と基盤ライブラリで必須
そのためにある
2024/08/27(火) 01:18:15.13ID:meLOHly2
あんまり必死になると>>307が図星なのがバレるぞ
450あぼーん
垢版 |
NGNG
あぼーん
2024/08/27(火) 05:12:31.56ID:SWsi92BQ
>>450
既に貰ってる
452デフォルトの名無しさん
垢版 |
2024/08/27(火) 14:18:24.38ID:oHcafaf7
unsafeって危険だから描くんじゃなくて
unsafeを描くことで危険を回避出来るんだ
だからunsafeが使われてるからって危険なコードじゃないんだ
unsafeを観たら危険だと脊髄反射する方が馬鹿の誤解
453デフォルトの名無しさん
垢版 |
2024/08/27(火) 14:18:59.31ID:oHcafaf7
だから >>445 はピンぼけ的外れ
2024/08/27(火) 14:29:34.76ID:rXlpHGM8
RustかC++のどちらかなのかはRustで落ち着いたけど
unsafe RustかCかは結局どっちがいいんだい?
2024/08/27(火) 14:38:55.67ID:f/nerXJl
>>454
え?いつの間に落ち着いたの?
2024/08/27(火) 14:47:28.58ID:fKaZ1hCT
>>454
Zigだよ
ZigこそがベターCで、C++風味が入っていない
2024/08/27(火) 15:35:17.48ID:VmCaZkt1
>>452
おまえは何を言ってるんだw
458デフォルトの名無しさん
垢版 |
2024/08/27(火) 15:36:49.68ID:i930s1KJ
>>456
1.0になってから来てくれ
2024/08/27(火) 16:13:13.47ID:kbqekxQE
>>454
最大サイズのマインスイーパーを30分かけてじっくり解きたい → C
マインスイーパーは最小でいいから余った時間でソリティアやりたい → (unsafe) Rust
作業に戻る → C++
2024/08/28(水) 04:07:55.29ID:2ujtxZGB
最大サイズのマインスイーパーだと
プログラムに解かせるのに30分くらいかかるのか
それはメモリを積むと速くなったり
コア数を積むと速くなったり
未知のアルゴリズムで速くなったりする?
2024/08/28(水) 09:07:31.11ID:o9WnFihZ
まあそうなるよなw
頭悪いたとえ話だから仕方がない
2024/08/28(水) 09:16:54.18ID:YkYaTCgW
でもプログラムに解かせるのに30分もかからないだろくらいの感覚は常識として持っておいて欲しいところ
2024/08/28(水) 10:32:38.93ID:Uwy2gXCW
マインスイーパーはNP完全であると証明されていてかなり難問
さらにそもそも常に論理的に解けるわけではないためリゾルバーは勝率100%ではなく問題難易度別に平均勝率が示される
具体的には論理的推論で開けられる場所がなくなった時に人間は運ゲーとなるが機雷のある場所の確率計算により勝率を高められる
その手法ならびに巨大サイズによっては計算時間30分はありうるのではないか
464デフォルトの名無しさん
垢版 |
2024/08/28(水) 11:57:33.04ID:t9eW5UMl
>>460
そんな訳無い
10秒もかからん
2024/08/28(水) 12:03:45.27ID:HLZOwn4a
例えば話悪すぎるのは理解するけど、プログラムにマインスイーパー解かせる話だっけ
2024/08/28(水) 12:21:33.97ID:Bl8r2+HB
>>464
なぜ0.1秒ではなく1秒ではなく100秒ではなく10秒なのか?
2024/08/28(水) 12:23:32.67ID:Bl8r2+HB
>>465
プログラム板のプログラミング言語スレでそれ以外にどんな可能性があるか?
2024/08/28(水) 13:59:37.19ID:APdn6MV3
誤魔化せれば何でもいいから意味の無いレスを拾ってごちゃごちゃ書き込んでるんだろう
2024/08/28(水) 16:33:13.07ID:iRpE4/QL
いつのまにかAndroid公式ドキュメントにRustの章ができてた
2024/08/28(水) 17:22:14.56ID:kssH4dJX
AndroidはJNIをJavaとバイナリとの間に噛ませないといけないからほんとに面倒くさい
2024/08/28(水) 19:34:23.32ID:njVvvVc1
>>459
君頭悪いのに無理に例えなんか使わないほうがいいよ
2024/08/28(水) 21:16:27.54ID:qM6sg2ID
まさかマインスイーパーの例え自体が地雷になるとはw
Rustスレなのにunsafeだな
2024/08/28(水) 22:54:19.83ID:kssH4dJX
さあみなさま、脱unsafeを心がけていきましょう!
2024/08/28(水) 23:16:33.26ID:kssH4dJX
>>456
Zig、エリアアローケーターがとても魅力的なんだけど、非同期まわりの仕様が白紙に戻っちゃったのがなあ
もちろんZigの求められている役割的に非同期はそこまで重要ではないのだけれどちょっと悲しさを感じる
なんでもZigに限らずLLVMとasync/awaitの相性がとてつもなく悪いらしい
https://www.reddit.com/r/Zig/comments/1d66gtp/state_of_async_in_zig/
長文すまん
2024/08/28(水) 23:17:49.58ID:lG2WtYJn
Swiftのasync/await良く出来てるけど?
2024/08/28(水) 23:25:03.26ID:kssH4dJX
>>475
加えてGolangやKotlinのasync/awaitもよく出来てる
成功例はあるんだしきっとなんとかしてくれるよね
2024/08/28(水) 23:30:17.85ID:fP4MaCDa
golangはasync/awaitじゃなくてCSPな?
2024/08/28(水) 23:32:07.56ID:kssH4dJX
>>477
すまん指摘助かる
2024/08/28(水) 23:41:09.49ID:qM6sg2ID
>>474
気になったけどエリアアロケータはarena allocatorの空目?
arenaはアリーナ(闘技場)
2024/08/28(水) 23:41:42.12ID:lG2WtYJn
GoもKotlinもLLVMバックエンドじゃないだろ
2024/08/28(水) 23:46:05.67ID:LoAS9bQy
>>474
読んでみたが登場人物たちが無知すぎるな
特にZigでのasync/awaitの経緯を解説しているmlugg0はRustについて不慣れで全くわからないと答えてる

>>Zigに限らずLLVMとasync/awaitの相性がとてつもなく悪いらしい

それは間違いでLLVM coroutineを使おうとすると重くなる
Rustはそれを使わずにスタックレスなステートマシンとして実現しているため軽く良く出来ている
2024/08/29(木) 01:22:47.24ID:YXIyrRhD
>>481
Rustは最強ってことでいいけどここにいてもお前がザコなのは変わらないからもう引っ込んでなよ
483デフォルトの名無しさん
垢版 |
2024/08/29(木) 06:12:15.98ID:1jszJs3n
>>480
バカなAIが跋扈してる
2024/08/29(木) 06:26:17.95ID:CICE1rWP
Zigは技術的な敗北でasync/awaitを削除しただけでなく思想的にも嫌悪や不要論が跋扈していて終わってるな
2024/08/29(木) 07:28:11.89ID:rHptJtk5
>>474
スレッドプール作れるし問題なし
2024/08/29(木) 07:34:05.99ID:jXxTByd8
async awaitが何なのか理解していない人たちがZigに集まっている
2024/08/29(木) 07:53:29.77ID:0glh1AR4
Zigは未使用変数がエラーになるのがな…
せめてデバッグビルド中はワーニングになってほしいが
作者の思想的に無理そうなんだよな
2024/08/29(木) 08:06:23.91ID:7zduIY7i
>>487
Cとかでよくある消すと何故か動かなくなる未使用変数を撲滅する対策とか?
もしそうならまっとうに境界チェックしてほしいが。
2024/08/29(木) 08:08:24.23ID:K+MkDn8y
zigはビルドツールのccとしてcmakeより使いやすくて好き
2024/08/29(木) 08:10:24.41ID:0glh1AR4
>>488
いや、Rustと同じく変数名に_つければ通るからあんま関係ないかな
これのせいで実装中やデバッグ中に関数呼び出し一つコメントアウトするたびに
あちこちに_をつけてまわらないといけないからかなりつらい
2024/08/29(木) 08:32:58.82ID:plL6TRoE
Zigは未完成のまま終わりそうだな
2024/08/29(木) 08:51:25.64ID:W3gDNWMh
>>489
pkg-config 呼び出す機能がないんじゃない?
493デフォルトの名無しさん
垢版 |
2024/08/29(木) 09:33:53.27ID:1jszJs3n
>>490
これだけ変数の使用不使用にうざい仕様の割に
同一scope内での二重定義(上書き)はあっさりと許す糞仕様ω
2024/08/29(木) 12:29:33.60ID:CydvL0rR
シャドウイングがない言語は不便すぎるから有るのは正しい
2024/08/29(木) 12:50:47.36ID:OEtxKPAo
>>486
async awaitをやさしく解説してください
2024/08/29(木) 13:07:04.37ID:YXIyrRhD
せんでええよ
2024/08/29(木) 13:32:35.20ID:MmpSTGjT
https://rust-lang.github.io/unsafe-code-guidelines/introduction.html
こんなのあるんだ、まだ中身スッカスカだけど
2024/08/29(木) 14:09:44.24ID:G41Drf1I
async (∩゚д゚)アーアー
await 聴こえなーいΩ\ζ°)チーン
2024/08/29(木) 14:12:39.25ID:W3gDNWMh
asyncの一番難しいとこは発音だな
間違えてる日本人が多い
2024/08/29(木) 14:49:29.45ID:a4VXQbqA
>>497
それは「まだ」じゃなく
すでに捨てられた後のもの
2024/08/29(木) 19:49:23.69ID:dbGPGAjw
Rustの非同期が非常に軽く上手くいってる理由は簡素であることかな
futureの構築とfutureの実行が明確に分離されている
構築で返されるのは単なる構造体の値でありヒープ利用を前提としない
実行はポーリングしないと何も進まない簡素さ
asyncタスクはステートマシンによるコルーチンとして実装されている
つまり個別のスタックを必要とせずに動くためメモリリソースの点でも有利となってるね
502デフォルトの名無しさん
垢版 |
2024/08/29(木) 23:02:59.56ID:E4rublhw
>>479
エリアとかって恥ずかしい奴と思ってた。
503デフォルトの名無しさん
垢版 |
2024/08/29(木) 23:05:24.99ID:E4rublhw
>>489
cmakeのバージョン変化に嫌気して素のgnu makeに戻ったわ。
2024/08/29(木) 23:20:35.98ID:jTB6+YRF
>>502
area allocatorで検索したらarena allocatorしか出てこなかった
どっちが正解か分からんけど勘違いしたままだとプレゼンで恥かきそう
2024/08/30(金) 01:16:51.32ID:1dn+3XQv
https://en.wikipedia.org/wiki/Region-based_memory_management
region, zone, arena, areaと呼ばれると書いてあるし言うほど間違いじゃないんじゃね

むしろ”闘技場”に驚いたわ
2024/08/30(金) 01:40:41.30ID:1MZVdBLH
両方あるんか
arenaは知ってたけどareaでも意味通じるから迷ってた
2024/08/30(金) 02:21:05.28ID:71k4+v+4
areaだと一般用語の~エリアと曖昧になりやすいせいかarenaと呼ばれることが多いかな
特にRustではその手の各種クレートはxxx-arenaと名付けられているね
そのため「そこはアリーナ系を使おう」だけで話が通じると思う
508デフォルトの名無しさん
垢版 |
2024/08/30(金) 13:24:19.84ID:742oYIEC
Rustで勘違い3選
https://qiita.com/namn1125/items/2a59f486cce30fd2b889
2024/08/30(金) 14:03:33.10ID:00JO0I50
高階トレイト教会
2024/08/30(金) 18:16:40.82ID:FuTFI1jb
https://japan.zdnet.com/article/35223295/2/
> LinuxへのRust言語の導入の話になると、Torvalds氏は採用のペースが上がらないことに失望感を示した。
> 「更新が思ったほど速く進んでいないが、問題の一端は、昔からのカーネル開発者が『C』に慣れていて、Rustを知らないことにある。彼らは、ある面で大きく異なる新しい言語を学ばなければならないことを、あまり歓迎していない。そのため、Rustに関しては多少の反発がある」
2024/08/30(金) 18:18:32.29ID:vU8F7vBm
まあ既存のエンジニアにRust学ばせるんじゃなくRustやりたいってヤツが実績積んで参加すべきだわな
512デフォルトの名無しさん
垢版 |
2024/08/30(金) 18:22:28.02ID:JuI4pVFu
昔ながらのカーネル開発者は賢いからCで良いんだよな

新参のCまともに書けないバカがカーネルにいっちょ噛みするためにRust推してみたけど、本人はRustわかる程度の知能はあるがカーネル理解できる程の知能はないからカーネル周り書けず、他人にRust勉強しろと喚くことしか出来ない
513デフォルトの名無しさん
垢版 |
2024/08/30(金) 18:27:03.74ID:r5yUcnGF
C++の苦痛を経験しないと有難みがわからないのがRustだからな。linuxカーネルがC++を採用していたらすんなり移行してたかも
2024/08/30(金) 18:42:19.31ID:vU8F7vBm
C++なんてバグの温床だから採用しないのは正解
515デフォルトの名無しさん
垢版 |
2024/08/30(金) 19:05:19.61ID:QrO3wi5D
>昔ながらのカーネル開発者は賢いからCで良い

+1
516デフォルトの名無しさん
垢版 |
2024/08/30(金) 19:08:04.69ID:QrO3wi5D
>linuxカーネルがC++を採用していたらすんなり移行

これは絶対無い
むしろC**使われてるとRust化から遠ざかる
断言出来る
RustとC++の相性は最悪
■ このスレッドは過去ログ倉庫に格納されています