Rust part17

■ このスレッドは過去ログ倉庫に格納されています
2022/10/06(木) 22:43:13.96ID:Re0G7B20
公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust

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

日本語の情報
https://rust-jp.rs/

※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 part16
2022/10/21(金) 21:26:14.55ID:gnp0h5uN
Rust入門という感じではないな
Rustを使ったWeb入門という感じ
186デフォルトの名無しさん
垢版 |
2022/10/21(金) 22:25:35.46ID:YCtBy6Lb
>>185
Web+DB Press読者は簡単なWebアプリ開発はいろんな言語で経験済みで理解しやすいだろうからチュートリアルの対象に選んだだけでは?
2022/10/22(土) 13:19:56.51ID:OES5lhv+
>>186
普段読まないけどRustなので買ってみた
なかなかわかりやすかった
基本文法の解説が明らかに足りないけど
サンプルを理解するだけならこの程度で良いのか
面倒な部分が表に出ないようにうまくサンプルを調整してるし
2022/10/22(土) 21:03:49.60ID:Vp6sRBIs
借用がどうGCに関係するのかよくわからない
うまく説明しているサイトはないですか?
2022/10/22(土) 21:38:11.55ID:OES5lhv+
まずスタックとヒープを理解せよ
これは口を酸っぱくして言ってる
でないとRustは理解できない
190デフォルトの名無しさん
垢版 |
2022/10/22(土) 21:39:04.07ID:PO/EA+oY
とりあえずThe Bookの4章
https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html

Rustをそれなりに習得しようと思うなら
The Bookとオライリー本を読むのが一番近道
2022/10/22(土) 23:56:07.88ID:OES5lhv+
両方とも初心者には辛いよなあ
わかりやすい入門書が待たれる
2022/10/23(日) 00:22:18.48ID:LnniM1YV
借用するときにデータをスタックに積む
スコープを抜けるときに一気にpopするので
GCがいらない、つまり、早い
heapだとGCのときにデータの移動が必要になる
ので遅い
この理解であってる?
193デフォルトの名無しさん
垢版 |
2022/10/23(日) 00:29:31.67ID:jNoMv4k0
ポインタとか参照とか他の言語で扱ったことない?
2022/10/23(日) 00:44:57.32ID:h/oZflgJ
heapが遅いの要因は、メモリの割り当て解放処理があるから処理量が多いとか、
割り当てた領域がバラバラになることでキャッシュ効率がさがることとかかと
195デフォルトの名無しさん
垢版 |
2022/10/23(日) 13:47:22.46ID:/F23RQvw
ページング処理みたいなのが、ヒープだと2重に行われるんじゃないの?
2022/10/23(日) 14:14:22.62ID:ioVOctq2
>>192
Rustでのその辺のメモリの動きはオライリー本に詳しく書いてあった気がするから読むべし
197デフォルトの名無しさん
垢版 |
2022/10/23(日) 15:30:09.10ID:t4UBj2/5
>>192
>>195
お前ら、具体的にどうされてるからスタックだと速いかわかって無いだろ、、、
2022/10/23(日) 18:33:19.09ID:QEVtmAwk
>>192
そんなに物事が単純なら良かったのに...
”スコープを抜けるときにGCがいらない、つまり、早い”、これは間違いでもある。インライン展開されるような高階関数なら良いが
ループ中でアロケーションしてしまうような記述をすると、その度に確保・解放されるので非効率になりかねないし、借用による
メモリーの管理ではないが、参照カウントを使用するSwiftでは、ループでボトルネックになることはある。
このためRustでは高階関数で書く事が一般的に(分かり易く)良い事とされる。あとスタックでどの言語も大体はスコープ外で
消えるのでヒープとスタックの区別は付けましょう

独立したGCスレッドが動く言語だと、スコープ外れでGCするとは限らないので、速い場合がある。一方で、高負荷な環境では
GCスレッドがありで、回収などインターラプトが入るのでRustが有利になる(=※こちらのほうがRustが重要視される理由)
いわゆるSTOP THE WORLD(DIO様風)だ。ただ、これが無ければ良いということではなく、循環参照などを作らなければ
問題ないという話で循環参照を作ってしまうのであれば、独立したGCスレッドは便利でもある

”GCのときにデータの移動が必要”になるかどうかは、GCのアルゴリズム次第であり、厳密には”データの移動が必要”になるのは
メモリーのフラグメント解消つまりコンパクション処理によるところが大きい。これは、近代的なOSでは似たような事を行っていて
これ自体が速度に大幅に影響を及ぼすとは言い難い
2022/10/23(日) 19:03:12.25ID:NZM9O6ur
>>198
> ループ中でアロケーションしてしまうような記述をすると
アホなコードで議論する必要あるの?
2022/10/23(日) 20:51:00.62ID:h/oZflgJ
一体何と何を比較しているのだ
2022/10/23(日) 22:09:39.72ID:HOBBKeJ+
なんかすごい早口で支離滅裂なこと言ってるけど
頭を整理した方が良いよ
2022/10/24(月) 16:50:56.92ID:SgELnO58
スコープを抜けるときにGCがいらない、つまり、早い

これが間違っている理由を教えてください
2022/10/24(月) 18:09:05.87ID:VKX4Fsrh
ヒープメモリの管理はそれなりに重い処理だというのが論旨のように見える。

GC を使った場合のように不要なオブジェクトの判別をしていくコストは Rust では生じないが
それを除けば空いてる箇所と使用中の箇所を上手いこと管理する実行時コストは
GC (に付随するメモリ割り当て) でやってるのとたぶんそんなに差はないんじゃね。
204デフォルトの名無しさん
垢版 |
2022/10/24(月) 18:49:41.29ID:8+UVFZyO
>>202
>スコープを抜けるときにGCがいらない、つまり、早い

確保したメモリはいつ解放するんだよバカ。
2022/10/24(月) 19:05:34.14ID:Off49nvS
文法で制約したら、書き手もコンパイラも
変数の寿命を厳密に特定することができて便利だろって事で、
どこにどう確保すると速いとか、そういう話とは別では
2022/10/24(月) 19:14:17.25ID:FdEAHzhz
GCがないので速い←わかる
スコープを抜けたらpopするだけなので速い←わかる
スコープを抜けるときにGCがいらない←スコープとGCは何の関係もないよね
2022/10/24(月) 20:07:47.96ID:rCA25jH/
まあGCは常に動く可能性があるからな
逆に全く動かない可能性もある
そこはGCのアルゴリズムによりけり
2022/10/24(月) 21:01:10.53ID:SgELnO58
スタックを使っているから
pop すればそのままメモリが解放されるという意味では?
209デフォルトの名無しさん
垢版 |
2022/10/24(月) 21:39:23.30ID:UxIqfb1a
何と何を比べて何が速いと思ってるのか整理しなよ
話はそれからだ
210デフォルトの名無しさん
垢版 |
2022/10/24(月) 22:49:30.31ID:c7GaYtEs
>>208
動的データ全部スタックに積むのか。すげーな。
2022/10/24(月) 22:54:45.01ID:9jOSWWIs
そんなことよりコンパイルの遅さマジでテコ入れろYO、非力なCeleronでactix-webのコンパイルしたら10分とかふざけてんのか?
2022/10/24(月) 23:05:21.00ID:XsMeW9pb
コンセプトがコンパイル遅くしても賢くするだから無理
2022/10/24(月) 23:18:23.86ID:b0depGja
依存ライブラリまで全部自前ビルドさせられてるわけだからな
コンパイル済みcrateの配布とかやってくれればなんとかなりそうではあるが
2022/10/24(月) 23:42:51.24ID:cJUnO/Lg
コンパイル高速化はユーザー側でもいろいろ工夫の余地はあるが
コア数多いマシンを使うのがいちばん効果がある
2022/10/25(火) 07:14:07.04ID:0Y9XP165
分散コンパイルか、差分コンパイルか、常にバックエンドでコンパイルか
2022/10/25(火) 08:16:49.84ID:A5TY3R0Y
>>211
流石にもっと良いマシン買えでFA
217デフォルトの名無しさん
垢版 |
2022/10/25(火) 08:49:49.17ID:1jHrAe9o
でもRustって錆だよね
2022/10/25(火) 11:17:17.09ID:5EjxpvPU
ライブラリ類も複雑化・大型化の一途をたどっているご時世だし
Androidをビルド出来ないようなマシンは開発用としては時代遅れじゃね
219デフォルトの名無しさん
垢版 |
2022/10/25(火) 16:49:21.94ID:pUVcngq8
環境負荷を下げるためにもTier1プラットフォームはビルド済みか半分ビルド済みを配布できるようにすべき
2022/10/25(火) 18:21:31.05ID:RZIJ148t
structのフィールドにasyncのクロージャ持たせるの面倒だな
2022/10/26(水) 00:21:17.27ID:+/Fbza6R
>>220
Pin<Box<dyn Future<Output = T>>> ではだめ?
2022/10/26(水) 01:59:13.05ID:TlW6c1+d
>>221
Box<dyn Fn() -> Pin<Box<dyn Future<Output = T>>>>
こんな感じ
2022/10/26(水) 03:12:53.76ID:J4zGWIbj
>>210
全部とは言っていないローカル変数だけだ
224デフォルトの名無しさん
垢版 |
2022/10/26(水) 07:48:04.37ID:i0Q+rT9S
>>223
GoだってJavaだってローカル変数はスタックを利用する。
2022/10/26(水) 08:03:17.30ID:xzd5i3vP
>>224
Go は知らんが Java は値型しかスタックに確保しないよ
配列使うだけでヒープ使う
226デフォルトの名無しさん
垢版 |
2022/10/26(水) 10:03:48.91ID:8iR+QuRY
んなこと言ったらRustだってBox使うだけでヒープ使われるだろ
2022/10/26(水) 10:28:26.80ID:poB2zSjv
ピープアレルギーでも湧いたのか?
2022/10/26(水) 10:55:30.37ID:xzd5i3vP
>>226
そりゃあえてBox使えばヒープ使うわな
極論バカ乙w
2022/10/26(水) 12:39:08.43ID:61QnplYU
ヒープで思いついたけどtest::benchってなんで使用したメモリ量出てこないの?Rustだってアロケーター自作できるなら出せなくないと思うんだが
2022/10/26(水) 13:39:05.90ID:29TlHyS0
c言語なんかも int a[n] とかはスタックから取ってきてる。昔はmallocしてたが。
とはいえlinuxのスタック領域はヒープとそんな変わらん。
2022/10/26(水) 13:49:21.71ID:OrdcPqRc
環境によるが、Rust のスレッドごとのスタックサイズのデフォルトが2MBとかで
バカでかいローカル変数や引数を使おうとすると、
簡単に実行時エラー/スタックオーバーフローを実現できるという
ちなみに、String はヒープを使う
232デフォルトの名無しさん
垢版 |
2022/10/26(水) 14:58:21.99ID:XcmPInF1
>>230
ん?
何が変わらんの?
2022/10/26(水) 16:10:38.33ID:+/Fbza6R
>>229
issueはあるが放置されてる
https://github.com/rust-lang/rust/issues/22666
こういうのは欲しい人が積極的に動かないとなかなか進まないよね
2022/10/26(水) 18:56:12.77ID:m/VlzFSs
C 以外の言語は、すべて浅いコピー・shallow copy でしょ。
実体はコピーされずに、参照だけがコピーされる

たぶん、ローカル変数も参照だけがスタックにあって、
実体はヒープにあるのでしょ
2022/10/26(水) 19:32:11.84ID:/Jbhrlo+
そもそもスクリプト言語はマシンスタック使ってないから
C/C++/Rust/Goみたいなコンパイル言語とスクリプト言語(PythonとかRuby)とではメモリモデルが全く違う

JVMのJITはVMスタックをマシンスタックに引き継ぐって処理をやってるけど
2022/10/26(水) 19:35:12.65ID:+/Fbza6R
>>234
Cにdeep copyの概念ある?
2022/10/26(水) 19:39:57.27ID:UI6BPQPg
>>236
たぶん >>234 は Java や C# などでいう参照型のことを言ってると思う。
2022/10/26(水) 19:41:30.91ID:WAf5RIwU
Box<T>って出現頻度の割に表記が長いよな
boxキーワードに変える案はどうなったんだ?
2022/10/26(水) 20:19:12.15ID:SEIcgM+j
>>230
まーた思いつきで適当なこと言ってるの?
2022/10/26(水) 21:39:27.98ID:xibmu52f
シャローコピーもディープコピーもプログラマに意識させるような言語の方がいいと思うけどなあ
2022/10/27(木) 17:59:59.22ID:36nf4K/2
C言語は低レベルすぎるからshallow copyやdeep copyを意識する必要がそもそもないしな
ポインタをそのまま複製するのがshallow copyでポインタをデリファレンスしてからその値を複製するのがdeep copyってだけやし
2022/10/27(木) 18:19:49.08ID:mzG41rMz
cだってポインタがネストされてたら順番に見てかないといけないのは他の言語と同じでしょ。
ネストを考慮しなくて良いならjavaだってcloneで一発コピーできる
2022/10/27(木) 22:00:27.64ID:rMi5UTbc
>>241
> C言語は低レベルすぎるからshallow copyやdeep copyを意識する必要がそもそもないしな
むしろ意識しまくりだろ
shallow copyとかdeep Copyとかのおしゃれな名前では呼んでないけど
244デフォルトの名無しさん
垢版 |
2022/10/27(木) 22:11:49.94ID:olmwGZ8d
複製おじさんディープコピー知らなかったもんねw
2022/10/27(木) 22:27:03.43ID:DBkkmtck
あえていうならCにおいては構造体のメンバをそのまま代入するのがshallow copy
構造体のメンバのポインタの領域を新しく領域を確保してコピー元の構造体を再帰的にmemcpyするのがdeep cooy
2022/10/27(木) 23:13:57.69ID:qcIge2ki
Cではというが大多数の言語がそうじゃね
2022/10/28(金) 00:02:58.28ID:Rl5QKwW8
deep copy は、ネストするから難しい

Ruby などは参照のリンクを断つために、
一旦、JSON などの文字列にしてから、オブジェクトを再構築したりする

Marshal もあるけど、色々な条件がつく。
IO, Proc, 特異メソッドが使えないとか
2022/10/28(金) 01:13:37.77ID:jXOvR4PJ
なんか話の脈絡も流れもなく各人が単語に反応して書きたいこと垂れ流すだけのスレと化してんな
2022/10/28(金) 03:43:44.96ID:01u53tKZ
高階関数はGCの性能に影響を及ぼすの?
2022/10/28(金) 09:27:53.24ID:jXOvR4PJ
Webpackの後継となる新バンドルツール「Turbopack」が登場。Rust製のネイティブアプリケーションでWebpackの700倍高速に。Next.js Conf 2022 - Publickey
https://www.publickey1.jp/blog/22/webpackturbopackrustwebpack700nextjs_conf_2022.html
2022/10/28(金) 16:15:00.57ID:AMrJHSke
JavaScriptっていつまでバンドルとかやるん?
252デフォルトの名無しさん
垢版 |
2022/10/28(金) 16:24:46.58ID:muqJ433+
いっそコンパイルしたら
2022/10/28(金) 16:28:04.57ID:AMrJHSke
wasmでそれやろうとしてるけど
wasmランタイムよりJavaScriptランタイムの方がまだ速いというトホホな状態
2022/10/28(金) 19:59:50.54ID:eNUtjibx
じゃあasmjsでよくね
255デフォルトの名無しさん
垢版 |
2022/10/30(日) 11:39:14.94ID:zV+ownbZ
何いってんだ
JavaScriptはRustの大口顧客だぞ
バカにするなんてとんでもない
JavaScriptの市場が大きいほどRustが儲かる仕組みなんだ
2022/10/30(日) 13:52:59.67ID:Ffhte1rz
moziraとgoogle, Microsoftと主要ブラウザメーカーが推進してるからな
2022/10/30(日) 19:41:21.29ID:TG2fSMWC
なんでvecの&mutに*が不必要なのか、いまいち理解してなかったけど

fn calc(n: &mut Vec<usize>) {
 (*n).push(1);
}

こういうことかー。そういうことだったのかー
258デフォルトの名無しさん
垢版 |
2022/10/30(日) 23:24:15.56ID:tkb7REiJ
struct User {
name : String,
age : u32,
}

fn main() {
let mut user = User {
name : "sato".to_string(),
age : 30,
};
user.age = 40;
user.name = "aaaa".to_string();
println!("{}{}", user.name, user.age);
}

"sato".to_string()で生成したStringは
user.name = "aaaa".to_string()後はどうなるの?
mainの}抜ける=プログラム終了時ようやく解放?
2022/10/30(日) 23:41:49.13ID:fG4j0a7a
Dropを自分で実装した型で試せばわかる
2022/10/31(月) 19:06:46.94ID:DHbQvQ7c
相変わらずLinusに怒られまくってるね
2022/11/01(火) 06:39:05.97ID:y5vMQo4Y
rust導入してもディレクトリ構造が汚くなるだけなのにどうして導入したんだろうね
正直撤回して欲しいわ
2022/11/01(火) 07:47:38.45ID:6ZBnCRFC
ディレクトリ構造なんかより優先すべきことがあるからだろ
rust使う意味を何も分かってないな
2022/11/01(火) 14:04:14.12ID:w6yg6Ajb
もうlinusがカーネル用にsafeな言語作った方がいいんじゃないの
既成言語じゃ既存の処理系と整合性をとらないといけないから
いろいろな不整合が生じる
2022/11/01(火) 14:12:23.10ID:XoXOtAeK
エコシステムの充実はユーザ規模によるところがあるから
たとえ言語の設計としてベストマッチでも特化しすぎると
(使い手が増えなくて) 雑多なツールやライブラリが出揃い難いということもありうる。

Linux くらいの規模なら専用言語を作っても割に合ったりするかな?
2022/11/01(火) 14:25:52.66ID:smDWdngC
linusがなんか言ったの?
ググってもlinux 6.1にrustが取り込まれた話しか見つけられなかった
2022/11/01(火) 14:50:17.04ID:FsVxrWah
>>263
なにそのgitな流れは。
凄まじく少ないコードで実現してしまいそうで恐ろしい。
ピーキーなのになって、普通の人は使えないのを期待しちゃう。
2022/11/01(火) 14:58:39.21ID:O+5UiM+O
>>263
linusはgcc拡張のCが最高だと思ってる人だよ
268デフォルトの名無しさん
垢版 |
2022/11/01(火) 18:29:34.49ID:cxS6KzKc
>>260
どれ?
2022/11/02(水) 15:56:44.98ID:ohjjd8k9
linuxもデフォルトcというよりもかなりカーネル用の拡張してるからrustもそうすればええわってのが
linusの主張でしょ。
2022/11/02(水) 16:18:07.00ID:qqWWqhkC
一応clangでもlinuxカーネルコンパイルできるようになっているということは、
LLVMに必要な機能はそろっているということだろうから、
rustcからそれらの機能を呼び出せるようにできれば良いのかね
271デフォルトの名無しさん
垢版 |
2022/11/02(水) 16:35:45.00ID:F11hp17c
リーナスゴシップとかどうでもいいスレチネタを続けるなよ
2022/11/03(木) 02:16:08.55ID:atTBpfYp
しょーもないシンタックスの話より有意義だけどな。
273デフォルトの名無しさん
垢版 |
2022/11/03(木) 05:38:58.72ID:CtTK5dM6
1要素タプルの書き方Pythonと同じなんだね
パターンマッチで参照外しと絡むとややこしいなぁ
// 要素1のタプルはカンマ必要
let (mut a, ) = (1, );
a = 100;
println!("{}", a); //=> 100

// 要素1のタプルはカンマ必要
let &(mut a, ) = &(1, );
a = 100;
println!("{}", a); //=> 100

// (式)と区別つかないからとか
let &(mut a) = &(1);
a = 100;
println!("{}", a); //=> 100

// error[E0308]: mismatched types
let &mut a = &1; // ←ココ
a = 100;
println!("{}", a);

// こっちはok
let &(mut a) = &1;
a = 100;
println!("{}", a); //=> 100

mutがどっちに付くのが優先なのか(イミュータブルなaの参照なのかaのイミュータブル参照なのか)覚えてないと適切に()付けられないね、覚えりゃいいんだけども
Rustの話に限らずもっと根本的な解決方法ってないのかな?
()をいろんな意味に酷使し過ぎでは?関数の引数部分、式の評価順変更、タプル、等々
型は後置修飾なのに&やmutはなんで前から懸かるの?
これ全部RPNにすれば解釈の曖昧さがなくなって優先順位の()が要らなくなり、関数呼び出しもf1(1, f2(2, 3), f3(4))は1 2 3 f2 4 f3 f1となって、タプル以外の()撲滅できないか?
274デフォルトの名無しさん
垢版 |
2022/11/03(木) 19:40:23.88ID:4W4icteo
>>273
()を色々使いすぎというのは同意だけどRPNだと今よりもっと使われないよ。
連鎖性言語とか好きだけど。
2022/11/03(木) 21:14:31.73ID:Z+updFpk
()については他の言語と同じだしそこで変に独自性を出してもなぁという感じ
2022/11/03(木) 21:15:01.48ID:t6ap+kyc
for &i in vec![0_usize; 5].iter() {
 //iのままなんちゃら
}

for i in vec![0_usize; 5].iter() {
 //*iでなんちゃら
}

参照外しはどっちをつかってる人のほうが一般的なん?
2022/11/03(木) 21:21:15.76ID:0fRPRys5
Copy実装してる型なら別にどっちでも……
2022/11/03(木) 21:35:17.79ID:b1nVlp4p
union で定義した型があり、タグビットに相当するビットで variant を区別できる場合に
enum と同じ表現でパターンマッチするというようなことは出来ませんかね?
マニュアルを見た感じでは出来なさそうなので駄目で元々な相談なんですが……。

それが欲しくなった事情としては抽象的なバイトコードマシンが定義されていて
そのバイトコードをそのまま enum にマッピングできれば楽なのになと思った次第です。
279デフォルトの名無しさん
垢版 |
2022/11/04(金) 04:42:50.90ID:QJXSkaei
.expect("なんとかかんとかfailed.");
expectの引数はこんな文章になりがち
.expect("なんとかexpected, but かんとか found");
ならまだいいけど
コード読むときexpectというメソッド名からその引数には"期待しているものの説明"を"期待"してしまう
慣れるんだろうか…
2022/11/04(金) 08:57:52.35ID:KcmeiRV8
>>279
英単語を声に出して読んでみ
2022/11/04(金) 09:12:11.15ID:NSu48ax/
>>279
公式のドキュメントにも
.expect("failed to parse number")
という例があるしあまり気にしない方がよさそう
https://doc.rust-lang.org/std/result/enum.Result.html#method.inspect
2022/11/04(金) 09:15:25.47ID:yWEsFaag
>>281
これ英語の分からん奴が書いたんだろう
2022/11/04(金) 09:25:36.66ID:u3TD418O
>>279
まあ慣れるしかないわな
俺もこの名前はおかしいと思うし世の中でもおかしいと思う人はいるようだ
https://stackoverflow.com/questions/66362625/why-is-rusts-expect-called-expect
284デフォルトの名無しさん
垢版 |
2022/11/04(金) 09:47:45.14ID:QJXSkaei
>>283
よかった、俺だけではなかったか
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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