Rust part12

■ このスレッドは過去ログ倉庫に格納されています
2021/08/24(火) 22:55:27.78ID:972JwtmU
公式
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のasyncについて知りたければ「async-book」は必読
https://rust-lang.github.io/async-book/

※C++との比較は専用スレへ
C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/

前スレ
Rust part11
https://mevius.5ch.net/test/read.cgi/tech/1623857052/
725デフォルトの名無しさん
垢版 |
2021/10/15(金) 20:15:19.52ID:I/84Z1Ml
>>723
だからアスペか?
論理的に安全な操作のみ、かつ、内部に閉じ込められていて外部に影響を及ぼさないってことをどうやって保証してるのか聞いてんだけど?
国会の答弁みたいな返答やめろよ
というか外部にメモリ及ぼさないはメモリ安全性が保たれるの必要条件じゃないんだけど
726デフォルトの名無しさん
垢版 |
2021/10/15(金) 20:15:56.65ID:I/84Z1Ml
外部にメモリ及ぼさないじゃなくて外部に影響及ぼさないだった
2021/10/15(金) 20:21:27.95ID:PoOS8yLC
>>724
C++はコンパイルが通ってもメモリ安全性は保証されません
Rustはコンパイラが通ればメモリ安全性が保証されます
全く異なります

>>725
論理的にそれらを満たす操作かどうかです
Rustコンパイラが通ればメモリ安全性を保証するかどうかも論理的に基づいて保証されます
728デフォルトの名無しさん
垢版 |
2021/10/15(金) 20:33:33.14ID:WHarWmnu
>>727
メモリ安全性を保証することを諦めればコンパイル通るのは当然だよね?
こんな基本的なこともわからないんですか?
2021/10/15(金) 20:36:47.57ID:jQ7TSjOD
Cしか知らない人ってプログラミング言語の仕様とコンピュータのアーキテクチャが区別できないってマ?
型理論も知らないってマ?
2021/10/15(金) 20:40:52.58ID:PoOS8yLC
>>728
その通りでC++はコンパイルが通ってもメモリ安全性が保証されない言語
一方でRustはコンパイルが通ればメモリ安全性が保証される言語
731デフォルトの名無しさん
垢版 |
2021/10/15(金) 20:50:24.31ID:LC/Ahxji
>>730
>unsafeを誤解しているようだけど
>CやC++と同じ状況すなわちその部分の>メモリ安全性は自己管理となるだけ
って自分で言ってるよね?自分の過去の発言と言ってること矛盾してない?
rustのunsafeはメモリ安全性を保証することを諦めてるって言いたかったようだけど今は言ってること無茶苦茶じゃない?
2021/10/15(金) 20:51:16.86ID:U2SV1SiG
>>722
これが一般的なC++erの認識だとしたら恐ろしいな
2021/10/15(金) 20:58:34.88ID:NxDOUPls
unsafeなコードが周りを滅茶滅茶にしない保証は無いよ
2021/10/15(金) 21:01:02.97ID:NxDOUPls
unsafeを使った場合の安全性の保証を機械的にやりたければ↓みたいなので契約プログラミングする手はあるね
https://crates.io/crates/contracts
2021/10/15(金) 21:10:23.11ID:PoOS8yLC
>>731
もちろんRustの標準ライブラリの実装内部には多数の細かい小さなunsafeがあってその部分はコンパイラによるメモリ安全性保証の範囲外
それそれの内部ローカルのunsafe使用が論理的にメモリ安全であるか否かの保証はコンパイラではなく人間が行ないunsafeはそのためにある
その上でRustコンパイラはプログラム全体のメモリ安全性を保証する
736デフォルトの名無しさん
垢版 |
2021/10/15(金) 21:17:10.00ID:Ue2FksZS
>>735
人間がどうやって行うの?
2021/10/15(金) 21:31:51.20ID:XGfxQXO+
話は簡単だ
C/C++はプログラム全てがRustのunsafe状態
つまりC/C++はプログラム全てを人間がメモリ安全であると保証しなければならないが人間なので複雑化するとミスも生じる
GAFAM各社はメモリ安全に関するバグが全く減らずセキュリティ脆弱性の多くがこの問題に起因することに気付いた
そこでコンパイラがメモリ安全であると保証するRustを採用して少しずつC/C++から移行させていってる段階
738デフォルトの名無しさん
垢版 |
2021/10/15(金) 21:34:04.93ID:OlLYCHFC
unsafe blockはマーが全力で頑張ります!ゾーンだからな
アルゴリズムにおいてあるアルゴリズムが正当であると判定するアルゴリズムは存在しないんだからラストコンパライでも完全なセーフティは保証は出来ないけどな
ただ完全ではないものの他の注意すべき所をランコンに任せてunsafe部にヒューマンリソース限定出来るのはc++を遥かに優れた点よね(´・ω・`)
2021/10/15(金) 21:39:33.56ID:NxDOUPls
布教しようとしなくたっていいんだよ
めんどくせえから
740デフォルトの名無しさん
垢版 |
2021/10/15(金) 21:42:55.26ID:eqKsqNtm
>>737
GAFAがその体たらくとは信じがたいけど、resource管理は所有権ベースでほぼ解決するし、逆に所有権以外で解決することは出来ないと思う。
741デフォルトの名無しさん
垢版 |
2021/10/15(金) 21:45:54.09ID:kEafjbCd
>>738
チューリングマシンの停止性問題のこと言ってるんだろうけど違うよ
あるアルゴリズムじゃなくて任意のね
「あるプログラムが正当であると判定するプログラムは存在しない」じゃなくて「任意のプログラムを正当であると判定するプログラムは存在しない」が正しい
これが5chクオリティか
2021/10/15(金) 21:58:02.76ID:rb+Oscx7
Rustコンパイラによるメモリ安全性の保証は信頼してても、unsafe使ってる標準ライブラリを信頼しない話おもしろいね。
実際に問題なく動いてるんだから仕様を信頼すればいいのに。
2021/10/15(金) 22:06:00.13ID:PoOS8yLC
>>742
人間が局所的に注力すれば済むのがRust
人間がプログラム全般に注力しなければならず破綻したのがCとC++
744デフォルトの名無しさん
垢版 |
2021/10/15(金) 22:07:41.72ID:OlLYCHFC
>>741
うーんまぁ日本語で論理学考える事なんてあんましないから間違えてるのかもしれんが
あるアルゴリズム、ある整数等々で俺はある集合(=アルゴリズム全体で構成される集合)の元の任意性を表してんたんだけどな(´・ω・`)
2021/10/15(金) 22:11:36.31ID:wjdlJ99Z
>>743
勝手に破綻したことにするのやめな?
そういうとこやぞお前マジ
746デフォルトの名無しさん
垢版 |
2021/10/15(金) 22:18:09.07ID:JTaIEN+o
>>744
その言い訳は厳しいよ
まあワイもまともに勉強するまでもそこあたりあやふやだったしそんな気にすんなや
2021/10/15(金) 22:39:44.83ID:XGfxQXO+
>>740
C/C++に限界を感じたGAFAMたち大手IT企業がRustに結集
特定の言語が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/
748デフォルトの名無しさん
垢版 |
2021/10/16(土) 00:08:25.70ID:dPfgeqZY
>>717
それどこの0か100しか無い世界?
2021/10/16(土) 00:34:25.94ID:bSvFIUA3
C++はこれで鼻から悪魔出るから

vector<int> hoge {0};
int& fuga = hoge[0];
for (size_t i = 0; i < 5; ++i) {
hoge.push_back(i);
}
cout << fuga;
}

nsafeがどうたらぬ気にしてRustはこういうのが防げるってだけでもそれなりの価値はある

ちなみにunsafeブロックは本当に慎重に作らないと、unsafeの外部をちょっといじっただけで鼻から悪魔が出たりする
https://doc.rust-jp.rs/rust-nomicon-ja/working-with-unsafe.html
unsafeブロック外のidx < arr.len()をidx <= arr.len()にしただけで死ぬ
2021/10/16(土) 03:36:57.11ID:I/G6evYm
unsafeなコードが1行でもあったらRustで書く意味ないと主張する人が定期的に現れるのはなぜなのか
2021/10/16(土) 03:54:24.52ID:0owCAudu
>>750
C++が劣ることを認めたくない人が「unsafeがあるならC++と同じだからRustの存在意義はない。」という間違った主張をしてるみたい
2021/10/16(土) 04:04:47.91ID:4kIP2zxZ
C++との対決は別の専用スレがあるのでそっち使ってくださいね
2021/10/16(土) 04:11:16.75ID:0owCAudu
>>752
同感
C++な人はここでやらずに
向こうの専用スレでやってほしい

C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/
754いつもの光景
垢版 |
2021/10/16(土) 07:19:55.59ID:VQLpYdr0
Vec型の質問に高卒が答える
 ↓
当然の如く高卒がバカにされる
 ↓
高卒発狂
 ↓
パソコンがどうの、C++がどうの、いつもの大先生問答に発展
755デフォルトの名無しさん
垢版 |
2021/10/16(土) 09:07:15.06ID:GnSu5gfs
>>749
ちなみになんでこれで悪魔がでるんですか?
無学ですみません
756デフォルトの名無しさん
垢版 |
2021/10/16(土) 09:21:09.42ID:wH7tzS3T
>>755
fugaがhogeのメモリ参照を取った後にhoge.push_back()でデータを追加している。
データ追加ではhogeの内部で確保していたメモリ領域が足りなくなると
新しいアドレスに確保しなおす(元の領域は開放する)ので、
fugaが指しているアドレスはアクセスしてはいけない領域になってる。(ダングリングポインタ)
その状態でcoutでfugaを使ってるから。
757デフォルトの名無しさん
垢版 |
2021/10/16(土) 09:48:04.61ID:GnSu5gfs
>>756
なるほど
ダングリングポインタになっているんですね
教えてくださってありがとうございます
2021/10/16(土) 10:29:54.02ID:N8k1BZc2
unsafeなtraitとそうでない通常のtraitってどう違うんでしょうか
implにunsafeって書かないといけない点以外で
2021/10/16(土) 12:13:05.40ID:MVC0A82Z
バカは実際にバグが起きるかどうかを考えてなくて
バグを誰かのせいにできるかどうかしか考えてないんだろ。
だからこんなしょーもないものが持て囃されるってわけだ。
2021/10/16(土) 13:08:52.57ID:xy6guhnI
東アジア圏は原因の究明と再発防止より責任の追及と処罰を優先する文化だからな
気をつければ問題ないみたいな精神論が平気で唱えられるのも同様
システム工学先進国のアメリカあたりと比べたらかなり後れている
761デフォルトの名無しさん
垢版 |
2021/10/16(土) 20:42:26.55ID:jYqji68p
それは東アジア人の性質ってか東朝鮮の性質だろ(´・ω・`)
2021/10/17(日) 12:48:28.83ID:5UKSiAtl
CargoでC/C++のコードをビルドするときにヘッダファイル等の依存関係って何処まで面倒を見てくれるんだろ?
自分で全部記述しないとダメなのか、自動的に追跡してくれるのか・・・
ググってもCのコードも一緒にビルドできます以上の情報が見つからん
2021/10/18(月) 10:43:24.73ID:oPyph5kC
面倒見るわけねーじゃん。
ヘッダーファイル依存をまともに解決しようと思うと、ビルド速度に影響がモロに出る。
解決するには暗黙のキャッシュ使うことになって問題が起きやすくなる。
2021/10/18(月) 11:14:38.10ID:jL9+j5XP
>>762
一番基本的なやり方だとcc crate使うことになると思うけど
このやり方だとヘッダやライブラリは自分で指定する必要ある
使ったことないけどpkg_config crateとか使えば多少は楽になるのかもしれない

C/C++コードが別プロジェクトからの流用ならそのプロジェクトのビルドツールに乗っかるのが楽かも
例えば cmake や autocfg/autotools といった crate はあるみたい
2021/10/18(月) 12:25:26.72ID:cow76Y8p
>>749
vectorじゃなくて、listを使うと大丈夫。
C言語は、もともと、linked list が代名詞の様な言語。
それを引き継いだC++もstd::listこそが主役。
ところが、stroustrupがvectorを推奨するから混乱してる。
2021/10/18(月) 12:39:56.60ID:jL9+j5XP
>>765
それは初耳。誰が linked list が C の代名詞と言っているの?
経験上は配列使うことの方が多いように思うんだが
2021/10/18(月) 15:20:57.34ID:gU1bKDav
>>765
std::listはn番目アクセス遅いよ
だからstd::vectorを利用するケースが圧倒的に多い
2021/10/18(月) 15:29:58.26ID:+iNX7XVA
listそんな使うことないやろ。挿入と削除が早いだけやんけ。何が言いたかったんだか。
2021/10/18(月) 21:23:43.42ID:292fwFlx
確かにlistはあまり使った記憶がないなー
キャッシュのミスヒットを考えると、
vectorでリロケートした方が速い場合もあるし
2021/10/18(月) 23:37:04.31ID:Qq+Ry0m8
listは敵キャラの弾幕なんかの座標管理なんかに使える
2021/10/19(火) 12:19:23.96ID:5XPa2/LH
ほぼcだよねこれ。
https://github.com/Rust-for-Linux/linux
2021/10/19(火) 12:22:25.90ID:GgDBkr4o
(Cで書かれてるLinuxカーネルのフォークなんだから当たり前やろ)
2021/10/19(火) 15:27:28.34ID:0LtRxxZs
そもそも全部書き直すならLinuxを冠する意味が・・・
2021/10/19(火) 16:06:41.74ID:9axoCOPN
何で?
(全部書き直すなど誰も言ってないけど理由を聞いてみたい)
2021/10/19(火) 16:12:52.85ID:473S9WY0
うん、それ、RustでLinuxを作り直してるんじゃなくて、元々のLinuxをベースにして、新しい機能をRustで開発しようとしているプロジェクトでしょ
776デフォルトの名無しさん
垢版 |
2021/10/19(火) 18:28:24.83ID:lJqU9SJa
嘘つき
777デフォルトの名無しさん
垢版 |
2021/10/19(火) 18:57:21.27ID:C9DkQou5
日本語不自由どころか
頭が不自由だと拝察します
2021/10/19(火) 18:58:18.97ID:bh+xrreW
panicは無事無くなったんかな。
2021/10/19(火) 19:07:22.39ID:0VPrblkh
彡 ⌒ ミ
(´・ω・`) 頭が不自由という言葉が引っかかったので飛んできました
780デフォルトの名無しさん
垢版 |
2021/10/19(火) 19:29:57.38ID:k3wLx80J
彡 ⌒ ミ
(´・ω・`) 飛ぶとかカッパの風上にも置けんな、泳げや
2021/10/19(火) 20:33:01.03ID:q+n6NKoj
>>778
アロケーターのpanicのことなら7月に出たパッチでなくなったみたい
https://lore.kernel.org/lkml/20210704202756.29107-1-ojeda@kernel.org/
2021/10/19(火) 20:49:57.64ID:XSR/7M6W
C++erはほんとゴシップ談義が好きやな
Rustスレにまでそのカルチャー持ち込まんで欲しいわ
783デフォルトの名無しさん
垢版 |
2021/10/19(火) 21:31:52.96ID:3gMaYVXy
ペチパーと大差ないからな
2021/10/20(水) 10:48:38.28ID:kKtRU0ug
ターゲットも開発者も丸かぶりだからしゃあない
785デフォルトの名無しさん
垢版 |
2021/10/20(水) 13:23:40.75ID:nZj/SCQk
で、非同期ライブラリはどれが標準になるのよ?
786デフォルトの名無しさん
垢版 |
2021/10/20(水) 13:24:10.28ID:nZj/SCQk
で、非同期ライブラリはどれが標準になるのよ?
787デフォルトの名無しさん
垢版 |
2021/10/20(水) 13:29:36.31ID:4F9a+p6K
tokio
788デフォルトの名無しさん
垢版 |
2021/10/20(水) 16:05:21.56ID:Ojn1Tksn
std
789デフォルトの名無しさん
垢版 |
2021/10/20(水) 18:46:14.43ID:2vbfBLJv
どっちでもいいけど、インターフェースは統一して欲しいな。
今のところtokioか優勢みたいね。
2021/10/20(水) 21:12:16.85ID:rAmGIrdk
std::sync::mpsc ってなんで send がノンブロッキングなんだろうなぁ。
2021/10/20(水) 23:01:04.88ID:Px+syONf
ブロッキングなSenderがほしいならchannel_sync使うんだべさ
792デフォルトの名無しさん
垢版 |
2021/10/20(水) 23:32:51.88ID:4F9a+p6K
ブロッキングとかノンブロッキングとか何度か解説読んだ気がするけど意味がわからないわ
793デフォルトの名無しさん
垢版 |
2021/10/21(木) 00:05:01.15ID:5bux1k1I
迷惑な香具師だな
2021/10/21(木) 02:48:53.14ID:rcBT1TlJ
おまいら mut のことを何て呼んでる?
俺は心の中でムットと呼んでいる
2021/10/21(木) 02:53:24.97ID:4380fmPV
ミュータブルの略なので……
2021/10/21(木) 03:47:37.11ID:mWga6xPa
インテジャーはイント
キャラクターはチャー
なんだから、ムットでも何でも好きに呼べばよろし

ちなみに俺は心の中でムトゥと踊る^H^H呼んでる
2021/10/21(木) 08:50:47.46ID:rE4toNa0
マッだろjk
2021/10/21(木) 08:54:53.70ID:NOaHdDiV
マットな
2021/10/21(木) 11:02:50.76ID:s+STdMnX
cv::Mat は?
800デフォルトの名無しさん
垢版 |
2021/10/21(木) 13:03:22.69ID:rHBxJh+b
>>799
メアット
2021/10/21(木) 13:17:43.38ID:rE4toNa0
メッ
2021/10/21(木) 15:58:29.41ID:X5IbXF0A
そんなくだらない疑問より誰か>>758に答えてくれませんでしょうか
2021/10/21(木) 16:23:52.35ID:iSzsEmw9
>>802
implにunsafeって書かないといけないのと同じことだけど
implを書くやつが要求されてるsafetyルールを担保しないといけない

そのためのマーカー
804デフォルトの名無しさん
垢版 |
2021/10/21(木) 16:35:52.56ID:wNducfW7
うんこすれっど
2021/10/21(木) 19:56:22.82ID:wPmlSLSw
>>791
sync_channelってのがあるのか。ありがと。
ちゃんとランデブーもできるって書いてあるな。
2021/10/23(土) 00:54:23.67ID:pgS4Ah89
Rust 1.56.0 リリース!
https://tech-blog.optim.co.jp/entry/2021/10/22/080000
2021/10/23(土) 01:45:44.26ID:BVy1/we8
let x = f64::cos(3.14);
みたいなのをf64::を省略して書きたいのですがどうすればよいですか?
use f64::cos; みたいなことはダメなようです
2021/10/23(土) 12:44:59.32ID:rv17aNSC
1回はf64と言わないと伝わらないので
let p = 3.14_f64;
let x = p.cos();
2021/10/23(土) 14:40:08.49ID:BVy1/we8
すみません、p.cos()の記法がなんかイヤでcos(p)みたいな記法をしたいってことでした
810デフォルトの名無しさん
垢版 |
2021/10/23(土) 18:48:04.65ID:/3ucisXu
use f64
でだめなら無理じゃね
2021/10/23(土) 18:52:41.89ID:qtW8jcI5
modなら確かにuseで省略できるけど
Box::newのBox::を省略したいみたいな話だしなあ
2021/10/23(土) 18:55:33.73ID:qhVW7VS5
fn cos(x: f64) -> f64 {
f64::cos(x)
}

cos(3.14)

素直にp.cos()のほうがいいとは思う
2021/10/23(土) 18:55:43.78ID:rVbtEKl1
let cos = f64::cos;
ならいける

https://play.rust-lang.org/?version=stable&;mode=debug&edition=2021&gist=3c7b96b61723e46d132c9e0f2d46911b
814デフォルトの名無しさん
垢版 |
2021/10/23(土) 19:43:20.47ID:2qA+vCFq
fn main() {
println!("{}", cos(&32));
println!("{}", cos(&4.5))
}

trait GetDouble {
fn get_double(&self) -> f64;
}

fn cos(num: &dyn GetDouble) -> f64 {
f64::cos(num.get_double())
}

impl GetDouble for f64 {
fn get_double(&self) -> f64 {
*self
}
}

impl GetDouble for i32 {
fn get_double(&self) -> f64 {
f64::from(*self)
}
}
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2021&gist=cb0e5606622069ca33b0ef0971fa94b4
これでいこう
2021/10/23(土) 20:42:27.27ID:qhVW7VS5
ジェネリックにしたいならIntoでいいんじゃないかな

fn cos(x: impl Into<f64>) -> f64 {
f64::cos(x.into())
}
2021/10/23(土) 20:49:05.66ID:+aPgOjd/
ジェネリックにしたいなら戻り値も引数に合わせたいのでは
num_traits::Float::cos など使うべき
https://docs.rs/num-traits/0.2.14/num_traits/float/trait.Float.html#tymethod.cos
2021/10/24(日) 14:23:12.50ID:eQqSgpa/
文法でrustとc++/cが似ているって言うやつは何をもって似ていると言っているだろう
ムーブセマンティクスがデフォだし、classはない、for文はイテレータだし、変数と関数の宣言の違いがはっきりしているし
何よりも型は前置じゃないし
2021/10/24(日) 14:52:08.66ID:spG6Bthy
C++とスクリプト言語ぐらいしか知らないんじゃないの?
2021/10/24(日) 14:55:21.00ID:lUSERxty
>>817
誰がもなにもオフィシャルなドキュメントでC++に似せたと言っている
型引数が<>だったりブロックが{}だったりそういうレベルで似てると言っている
2021/10/24(日) 14:56:01.04ID:lUSERxty
C/C++というよりC familyに似せたと言っていたからちょっとニュアンスは違ってくるか
2021/10/24(日) 15:13:22.96ID:eQqSgpa/
>>819
ソースをくれ
公式で構文を似せたとか言っていないと思うが

C++: references, RAII, smart pointers, move semantics, monomorphization, memory model

https://doc.rust-lang.org/reference/influences.html
2021/10/24(日) 15:37:41.12ID:IF6Ria+p
型名がintならc++ぽいというのはなんか違うんだよね
->とか<<<とか気持ち悪いことをし始めたらc++感が出てくる
2021/10/24(日) 15:38:30.82ID:lUSERxty
>>821
http://web.archive.org/web/20150401014855/http://doc.rust-lang.org/nightly/intro.html
> you may find the syntax easier if you've used a "curly brace" programming language before, like C or JavaScript

確かに似せたとまでは言ってなかった

generics の angle bracket についてはコアメンバーが言及してるしC++の影響受けてると言って良いと思う
https://old.reddit.com/r/rust/comments/6l9mpe/minor_rant_i_wish_rust_had_gone_with_square/
2021/10/24(日) 15:44:23.48ID:zP2CpnNP
C++ iostream の << 演算子をパクらなかったのは、やっぱりあれが失敗作だからだよね
2021/10/24(日) 15:46:45.70ID:IF6Ria+p
>>823
thx、ソースまで探してくれてありがとう
個人的にはC++を感じるというエモーション(?)がどこなのかを聞きたかった
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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