公式
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/
探検
Rust part25
レス数が900を超えています。1000を超えると表示できなくなるよ。
2024/07/31(水) 00:46:26.17ID:DBMWY2QT
816デフォルトの名無しさん
2024/09/10(火) 22:08:07.24ID:O/aiMcKg Rcのソースコード解説あったわ。
qiita.com/qnighy/items/5b2fbf27e3ee36e57b8d
誰かソースコード読んだ?
qiita.com/qnighy/items/5b2fbf27e3ee36e57b8d
誰かソースコード読んだ?
817デフォルトの名無しさん
2024/09/10(火) 22:23:36.52ID:/Q+PZbLD >>815
そんな言葉遊びをして混乱させるのはよくない
Rustで参照といったらTに対する&T
一方でRcはヒープ解放責任の所有者を複数可にする
参照が複数あることと所有者が複数あることは全く別なのでこの違いをはっきりさせて理解するのが正しい
そんな言葉遊びをして混乱させるのはよくない
Rustで参照といったらTに対する&T
一方でRcはヒープ解放責任の所有者を複数可にする
参照が複数あることと所有者が複数あることは全く別なのでこの違いをはっきりさせて理解するのが正しい
818デフォルトの名無しさん
2024/09/10(火) 23:01:44.78ID:yy/y1+XI >>817
The BookやRcの公式ドキュメントにも書いてること
例えばThe Bookには「The Rc<T> type keeps track of the number of references to a value」と書いてある
つまり「Rustで参照といったらTに対する&T」とは限らない
文脈次第
>参照が複数あることと所有者が複数あることは全く別なのでこの違いをはっきりさせて理解するのが正しい
その区別ができてないレスとかあった?
The BookやRcの公式ドキュメントにも書いてること
例えばThe Bookには「The Rc<T> type keeps track of the number of references to a value」と書いてある
つまり「Rustで参照といったらTに対する&T」とは限らない
文脈次第
>参照が複数あることと所有者が複数あることは全く別なのでこの違いをはっきりさせて理解するのが正しい
その区別ができてないレスとかあった?
819デフォルトの名無しさん
2024/09/10(火) 23:09:22.99ID:30cMByxj Rc/Arcはヒープの解放責任者が複数になるときに対応するものだが
>>805が「ArcやRcってスタックのデータを指せるっけ?」と言い出したのでちょっと怪しい
>>805が「ArcやRcってスタックのデータを指せるっけ?」と言い出したのでちょっと怪しい
820デフォルトの名無しさん
2024/09/10(火) 23:12:42.09ID:+l9ylb2n それで言うなら>>804のほうが明らかに言葉足りてないがなあ
まあよく分からんなら反応すんなってこった
まあよく分からんなら反応すんなってこった
821デフォルトの名無しさん
2024/09/10(火) 23:22:45.87ID:+H56cclg RcはC++にないけどArcがC++のshared_ptrだよ
だから複数所有者については新規性がなくて
Rustが強いのはスタック上かヒープ上かに関係なく両者への参照を混ぜても安全に扱えるようになったことだよ
これでスタック上の活用の幅が広がりさらに速くなった
だから複数所有者については新規性がなくて
Rustが強いのはスタック上かヒープ上かに関係なく両者への参照を混ぜても安全に扱えるようになったことだよ
これでスタック上の活用の幅が広がりさらに速くなった
823デフォルトの名無しさん
2024/09/10(火) 23:38:50.48ID:mzgoZglT 複オジの読解力不足&的外れはいつものことだろ
騙されるやつにも問題あるんだからもうほっとけよ
騙されるやつにも問題あるんだからもうほっとけよ
824デフォルトの名無しさん
2024/09/10(火) 23:41:27.35ID:blt3RnjU C++ではヒープの解放責任が安全性の対象だった
Rustはそれに加えて複数の安全性を導入している
ヒープかスタック上かに関わらずそれらへの参照の有効安全性がその一つ
Rustはそれに加えて複数の安全性を導入している
ヒープかスタック上かに関わらずそれらへの参照の有効安全性がその一つ
825デフォルトの名無しさん
2024/09/10(火) 23:48:29.99ID:mryuhu82 真正アスペかな
826デフォルトの名無しさん
2024/09/10(火) 23:49:26.48ID:+l9ylb2n 造語してる暇があったらちゃんとイチからC++学ぼうや、じゃないと他人に伝わる言葉で比較することもできんやろ
いや、別にできなくてもいいのか、なんとなくそれっぽい感じのこと書けるならそれで
いや、別にできなくてもいいのか、なんとなくそれっぽい感じのこと書けるならそれで
827デフォルトの名無しさん
2024/09/10(火) 23:56:12.12ID:x0lHLaQU C/C++がダメなところでもっと重要な点はsingle writer xor multi readersのデータ競合安全性がないところだろ
例えばこれ
std::vector<int> v{0, 1, 2, 3, 4, 5, 6, 7};
int *p5 = &v[5];
assert(v[5] == 5); // OK
*p5 = 123;
assert(v[5] == 123); // OK
v.push_back(8);
*p5 = 456; // p5がまだ使えるので使おうとすると
assert(v[5] == 456); // NG このアサートは通らない
例えばこれ
std::vector<int> v{0, 1, 2, 3, 4, 5, 6, 7};
int *p5 = &v[5];
assert(v[5] == 5); // OK
*p5 = 123;
assert(v[5] == 123); // OK
v.push_back(8);
*p5 = 456; // p5がまだ使えるので使おうとすると
assert(v[5] == 456); // NG このアサートは通らない
828デフォルトの名無しさん
2024/09/11(水) 00:27:46.41ID:6onadJun 1つのTの値に対するRc<T>はcloneすることで複数存在できるけど
特定のRc<T>を介したその値の参照(&T)はそのRc<T>の生存期間しか使えない
この&Tもいくらでもコピーできるけど同じRc<T>の生存期間に縛られる
T(ヒープ)
↑
Rc<T>(主にスタック上だけどヒープも可)
↑
&T(同上)
みたいに二段階で参照してて
TはRc<T>が全部消えるまで残り続けるけど
&Tは仲介してる特定のRc<T>が存在する間しか使えない
C++のshared_ptrに近いけど使われ方(コピーor複製の戦略)は微妙に変わるかもしれない
特定のRc<T>を介したその値の参照(&T)はそのRc<T>の生存期間しか使えない
この&Tもいくらでもコピーできるけど同じRc<T>の生存期間に縛られる
T(ヒープ)
↑
Rc<T>(主にスタック上だけどヒープも可)
↑
&T(同上)
みたいに二段階で参照してて
TはRc<T>が全部消えるまで残り続けるけど
&Tは仲介してる特定のRc<T>が存在する間しか使えない
C++のshared_ptrに近いけど使われ方(コピーor複製の戦略)は微妙に変わるかもしれない
829デフォルトの名無しさん
2024/09/11(水) 00:51:54.05ID:kXFdScH1 >>828
正確にはRc<T>のDerefにより生じる&TがTを直接指すので参照を使うコストや利便性は普通の&Tと同じコストゼロ
そのDerefの時にRc<T>を借用しているため&Tはそれより長生きできず安全性が保たれる
C++で例えるとshared_ptr.get()で直接ポインタを取り出したのと同じなのでカウンタ増減もなくコストはかからない
C++でこれはリスクの高い要注意の行為だがRustでは上述のように安全性とコストゼロを両立させている
正確にはRc<T>のDerefにより生じる&TがTを直接指すので参照を使うコストや利便性は普通の&Tと同じコストゼロ
そのDerefの時にRc<T>を借用しているため&Tはそれより長生きできず安全性が保たれる
C++で例えるとshared_ptr.get()で直接ポインタを取り出したのと同じなのでカウンタ増減もなくコストはかからない
C++でこれはリスクの高い要注意の行為だがRustでは上述のように安全性とコストゼロを両立させている
830デフォルトの名無しさん
2024/09/11(水) 01:53:23.49ID:GmVwOhhB 声かけで特殊”複”詐欺を未然に防止
5ch有志らに感謝状
5ch有志らに感謝状
831デフォルトの名無しさん
2024/09/11(水) 07:05:44.53ID:KRDYrSYu >>827
vectorにpush_backして再配置でアドレス変わったんだから当たり前でしょ。それが嫌ならstd::listでも使えば
vectorにpush_backして再配置でアドレス変わったんだから当たり前でしょ。それが嫌ならstd::listでも使えば
832デフォルトの名無しさん
2024/09/11(水) 07:19:25.98ID:J41SJMWS833デフォルトの名無しさん
2024/09/11(水) 08:14:31.51ID:UEfsyQtn834デフォルトの名無しさん
2024/09/11(水) 08:40:17.21ID:CkAz+p2f しかもasan出て久しいのに、この人ら>>827,832 時間止まってる?
835デフォルトの名無しさん
2024/09/11(水) 08:58:17.83ID:LHxkhbUK >>827は簡単な例だからデータ競合を起こしてp5がダングリングポインタとなってることに気づくけど
もっと複雑な状況だと気づかずに実行してしまいデバッグでハマるパターンでもある
それをコンパイル時点で指摘してくれるRustは開発効率いいね
もっと複雑な状況だと気づかずに実行してしまいデバッグでハマるパターンでもある
それをコンパイル時点で指摘してくれるRustは開発効率いいね
836デフォルトの名無しさん
2024/09/11(水) 09:10:35.02ID:9o4a+ZUZ837デフォルトの名無しさん
2024/09/11(水) 09:13:53.53ID:H21AqaxG C++はそういう欠陥言語だから仕方ないかと
838デフォルトの名無しさん
2024/09/11(水) 09:28:04.51ID:xj8ieTHK Rustは安全でC++は危険というきれいな比較図式が成り立たなくなるので、C++さんサイドは静的解析だの動的解析だの姑息な手段を使わないでください
同じ理由でunsafe Rustも自分で書くのは禁止です
同じ理由でunsafe Rustも自分で書くのは禁止です
839デフォルトの名無しさん
2024/09/11(水) 09:43:51.82ID:jb2pT+rq 「RustでGPLロンダリング」するのも禁止です
「RustでGPLロンダリング」と検索するのも禁止です
「RustでGPLロンダリング」と検索するのも禁止です
840デフォルトの名無しさん
2024/09/11(水) 09:56:40.10ID:Dm5BWpYV >>827
C++コンパイラはpushの後になぜp5を無効にできないの?
C++コンパイラはpushの後になぜp5を無効にできないの?
841デフォルトの名無しさん
2024/09/11(水) 10:26:06.00ID:tyNMYAOt 予めreserveしてpush_back後も安全にアクセス出来る
842デフォルトの名無しさん
2024/09/11(水) 10:27:11.35ID:tyNMYAOt >「RustでGPLロンダリング」するのも禁止です
こっちは茶化すなよw
こっちは茶化すなよw
843デフォルトの名無しさん
2024/09/11(水) 10:30:47.07ID:6tLD5FSA それpushしまくってる途中でreserve超えてvectorが再配置されてダングリングになるバッドパターン
844デフォルトの名無しさん
2024/09/11(水) 11:08:50.53ID:CnBklswL 「境界検査は不要」とか「ループの終端検査に集約されるため消える」とか嘘バラまいてる奴が一番unsafeだよねー>>843
845デフォルトの名無しさん
2024/09/11(水) 11:25:15.06ID:4/LY1usJ 落とし穴だらけのC++
846デフォルトの名無しさん
2024/09/11(水) 12:02:27.80ID:xj8ieTHK 死ぬまでセフセフやってんのん
847デフォルトの名無しさん
2024/09/11(水) 12:23:08.35ID:WF50eMkP848デフォルトの名無しさん
2024/09/11(水) 13:13:12.77ID:qEXxoO97 >>847
どこが間違ってる?
どこが間違ってる?
849デフォルトの名無しさん
2024/09/11(水) 13:51:56.28ID:I6qUdCVn 人として間違ってる
850デフォルトの名無しさん
2024/09/11(水) 18:25:07.18ID:GmBdNzAl 次スレよろ
851デフォルトの名無しさん
2024/09/12(木) 12:20:06.38ID:X+4suM5m Rust の borrow を日本語で参照と
逝ってる人が多いのは木の精か
逝ってる人が多いのは木の精か
852デフォルトの名無しさん
2024/09/12(木) 12:20:42.74ID:MwC/gmDL 木の精だな
853デフォルトの名無しさん
2024/09/12(木) 13:28:12.61ID:mb4E75pv Primitive Type reference &T and &mut T
https://doc.rust-lang.org/std/primitive.reference.html
A reference represents a borrow of some owned value.
You can get one by using the & or &mut operators on a value, or by using a ref or ref mut pattern.
References have a lifetime attached to them, which represents the scope for which the borrow is valid.
https://doc.rust-lang.org/std/primitive.reference.html
A reference represents a borrow of some owned value.
You can get one by using the & or &mut operators on a value, or by using a ref or ref mut pattern.
References have a lifetime attached to them, which represents the scope for which the borrow is valid.
854デフォルトの名無しさん
2024/09/12(木) 15:10:13.30ID:Q/uAzgkq borrow は貸借
855デフォルトの名無しさん
2024/09/12(木) 16:35:38.17ID:gdBeeopR いちいち漢語使うなよ
貸す、借りるでいいだろ
貸す、借りるでいいだろ
856デフォルトの名無しさん
2024/09/12(木) 16:59:56.29ID:L1ol5ihM borrow は桁借り
858デフォルトの名無しさん
2024/09/12(木) 21:33:10.32ID:lBmgHN22 Rustを学習していてよくわからなくて、大きく2点について教えて欲しいんだけどさ
1 参照型で含まれるポインタ相当部分を可変、参照先のデータを不変にすることってできるの?
2 構造体Aのフィールドに構造体Bがあるようなとき、(I)A可変・B不変だった場合、(II)A不変・B可変だった場合、それぞれどの範囲で可変・不変になるの?
1 参照型で含まれるポインタ相当部分を可変、参照先のデータを不変にすることってできるの?
2 構造体Aのフィールドに構造体Bがあるようなとき、(I)A可変・B不変だった場合、(II)A不変・B可変だった場合、それぞれどの範囲で可変・不変になるの?
859デフォルトの名無しさん
2024/09/12(木) 22:20:10.46ID:KMcXcVU0 >>858
1. できる
let vec = vec![];
let mut xs= &vec;
xs.push(100); // Error
let vec2 = vec![1, 2, 3];
xs = &vec2; // OK
1. できる
let vec = vec![];
let mut xs= &vec;
xs.push(100); // Error
let vec2 = vec![1, 2, 3];
xs = &vec2; // OK
860デフォルトの名無しさん
2024/09/12(木) 22:39:45.93ID:KMcXcVU0 >>858
2. 変数のmutabilityはownership treeの最上位にある変数(owner)のmutabilityに従う
なのでAが可変ならBも可変、Aが不変ならBも不変
ただし、RefCell等のinterior mutabilityの仕組みを使えばAが不変でもBを変更することは可能
&Tと&mut Tという参照の型のmutabilityと
let mut xのような変数のmutabilityと関連はあるけど別のものなので分けて考えたほうがいい
2. 変数のmutabilityはownership treeの最上位にある変数(owner)のmutabilityに従う
なのでAが可変ならBも可変、Aが不変ならBも不変
ただし、RefCell等のinterior mutabilityの仕組みを使えばAが不変でもBを変更することは可能
&Tと&mut Tという参照の型のmutabilityと
let mut xのような変数のmutabilityと関連はあるけど別のものなので分けて考えたほうがいい
861デフォルトの名無しさん
2024/09/12(木) 22:48:18.57ID:5mY9NUJh >>858
2:
構造体Aが構造体Bの参照を持つという話なら、Aのmutabilityは「参照先を変更できるか」に関係し、Bのmutabilityは「参照先の値を変更できるか」に関係する
struct B {data: i32}
struct A {bref_1: &B, bref_2: &mut B}
let b1 = B::new();
let mut b2 = B::new();
let b3 = B::new();
// a1 は不変なので参照先を b3 に変えることはできない、
// b2は可変参照なので a1.bref_2.data = 1 のような操作はできる
let a1 = A::new(&b1, &mut b2);
// a2 は可変なので参照先を b3 に変更できる
// フィールドb1は不変参照なので a2.bref_1.data = 1 のような操作は不可
let mut a2 = A::new(&b1, &mut b2);
a2.bref_1 = &b3;
構造体Bを参照ではなく値型のフィールドとして持つという意味なら、Rustは (C++のconstのように) フィールドごとにmutabilityを指定する方法はないので、Aのmutabilityに従う
回避する方法として RecCell や Cell, Mutex といった型がある (これは C++のmutableみたいなものだけど、より厳格にチェックされる)
2:
構造体Aが構造体Bの参照を持つという話なら、Aのmutabilityは「参照先を変更できるか」に関係し、Bのmutabilityは「参照先の値を変更できるか」に関係する
struct B {data: i32}
struct A {bref_1: &B, bref_2: &mut B}
let b1 = B::new();
let mut b2 = B::new();
let b3 = B::new();
// a1 は不変なので参照先を b3 に変えることはできない、
// b2は可変参照なので a1.bref_2.data = 1 のような操作はできる
let a1 = A::new(&b1, &mut b2);
// a2 は可変なので参照先を b3 に変更できる
// フィールドb1は不変参照なので a2.bref_1.data = 1 のような操作は不可
let mut a2 = A::new(&b1, &mut b2);
a2.bref_1 = &b3;
構造体Bを参照ではなく値型のフィールドとして持つという意味なら、Rustは (C++のconstのように) フィールドごとにmutabilityを指定する方法はないので、Aのmutabilityに従う
回避する方法として RecCell や Cell, Mutex といった型がある (これは C++のmutableみたいなものだけど、より厳格にチェックされる)
862デフォルトの名無しさん
2024/09/12(木) 22:55:09.24ID:5mY9NUJh 個人的な意見だけど参照先を変える場面ってあまり無い気がする
「aをmutなしに宣言しているのにaが参照するbの内容を変更できる」ことに少し違和感があるかもしれないけど、それはフィールドの型を &mut で指定しているからそういうもの
「aをmutなしに宣言しているのにaが参照するbの内容を変更できる」ことに少し違和感があるかもしれないけど、それはフィールドの型を &mut で指定しているからそういうもの
863デフォルトの名無しさん
2024/09/12(木) 23:04:50.13ID:5mY9NUJh > struct A {bref_1: &B, bref_2: &mut B}
書き忘れたけど上記はライフタイム注釈を付けないとコンパイルに失敗する
書き忘れたけど上記はライフタイム注釈を付けないとコンパイルに失敗する
864デフォルトの名無しさん
2024/09/12(木) 23:35:16.53ID:Qm4qobFY >>858
Rustの不変・可変はデータ競合を避けて安全性を保証するためにあるため
以下の単純なルール
・値は別の変数等へムーブ(・コピー)することでいつでも不変↔可変にできる
・参照は可変参照→不変参照は可能だが不変参照→可変参照にはできない
・不変参照しかなくてもMutexなど内部可変性を提供するものは排他制御しながら内部を可変に扱える
struct Foo(i32);
let f1 = Foo(100); // 不変
let mut f2 = f1; // ムーブして可変
f2.0 = 111; // 書き換えOK
let r1 = &f2; // 不変 & 不変参照
let mut r2 = r1; // 可変 & 不変参照
r2 = &mut f2; // 可変 & 可変参照→不変参照になる
// r2.0 = 234; // 不変参照なので書き換えられずエラー
let r3 = &mut f2; // 不変 & 可変参照
r3.0 = 234; // 可変参照なのでOK
let mut r5 = r3; // 可変 & 可変参照
Rustの不変・可変はデータ競合を避けて安全性を保証するためにあるため
以下の単純なルール
・値は別の変数等へムーブ(・コピー)することでいつでも不変↔可変にできる
・参照は可変参照→不変参照は可能だが不変参照→可変参照にはできない
・不変参照しかなくてもMutexなど内部可変性を提供するものは排他制御しながら内部を可変に扱える
struct Foo(i32);
let f1 = Foo(100); // 不変
let mut f2 = f1; // ムーブして可変
f2.0 = 111; // 書き換えOK
let r1 = &f2; // 不変 & 不変参照
let mut r2 = r1; // 可変 & 不変参照
r2 = &mut f2; // 可変 & 可変参照→不変参照になる
// r2.0 = 234; // 不変参照なので書き換えられずエラー
let r3 = &mut f2; // 不変 & 可変参照
r3.0 = 234; // 可変参照なのでOK
let mut r5 = r3; // 可変 & 可変参照
865デフォルトの名無しさん
2024/09/13(金) 13:37:30.00ID:bblj+c3p struct A {bref_1: &B, bref_2: &mut B}
lifetime無いとだめなんじゃね
lifetime無いとだめなんじゃね
866デフォルトの名無しさん
2024/09/13(金) 13:38:15.45ID:bblj+c3p >>863
ああ断りがあったわスマソωωω
ああ断りがあったわスマソωωω
867デフォルトの名無しさん
2024/09/13(金) 13:47:53.90ID:Q2/6uPpv なんていうか
質問が曖昧な時ってどういうことか問い直すだけで曖昧さが消えて勝手に解決することのほうが多いんじゃないかって
質問が曖昧な時ってどういうことか問い直すだけで曖昧さが消えて勝手に解決することのほうが多いんじゃないかって
868デフォルトの名無しさん
2024/09/13(金) 13:49:36.00ID:bblj+c3p moveされたものはともかく
copyされたものが可変になっても嬉しくないパターンが多い
copyされたものが可変になっても嬉しくないパターンが多い
869デフォルトの名無しさん
2024/09/13(金) 13:51:25.85ID:bblj+c3p unsafe {
参照は
可変参照→不変参照は可能
不変参照→可変参照も可能
}
参照は
可変参照→不変参照は可能
不変参照→可変参照も可能
}
870デフォルトの名無しさん
2024/09/13(金) 14:55:43.09ID:HD5QYSk4 OpenAIが複雑な推論能力をもつAIモデル「OpenAI o1」と「OpenAI o1-mini」を発表、プログラミングや数学で高い能力を発揮
https://gigazine.net/news/20240913-openai-o1/
https://gigazine.net/news/20240913-openai-o1/
871デフォルトの名無しさん
2024/09/13(金) 16:25:09.37ID:9KFHzeXz >>617
>NimはCより2倍速いと主張している人がまずはその比較コードとベンチ結果を示す義務がありますよ
下記のNim2.0ベンチマークより速くできなかったら、今度こそ本当にRustはNim2.0より劣る言語と理解してもよろしいでしょうか?
Rustは変数の所有権や借用を開発時に考慮する必要があり、とても学習コストが高いです。
Nim2.0ではコンパイラがソースコードを解析し、スコープと所有権に基づくメモリ管理を開発者が考える必要がなく自動で行います。
Nim2.0では開発者はプログラムをスクリプト言語のように書け、所有権や変数の寿命を意識する必要はありません。
しかし内部ではRustと同じメカニズムでメモリ管理を行っています。
フィボナッチ数列(回帰関数)のベンチマークはNim 2.0がダントツの速さでした
fibonacci(44)の計算
Nim 2.0.0 + gcc HEAD 14.0.0 -O2 (44はコマンドライン引数)
https://wandbox.org/...ink/cpYesJtnlRNJiu7Z
>Time= 0.197s Result=701408733
Nim(44はコマンドライン引数)
https://wandbox.org/...ink/WoYP0STRKxaRBGCY
>Time= 0.240s Result=701408733
C/gcc(44はソース直書き)
https://wandbox.org/...ink/9OYZBH14tYooZHF7
> Time: 0.89583 seconds
C/clang(44はソース直書き)
https://wandbox.org/...ink/U97PecZYrzymnfH4
>Time=1.58712s Result=701408733
>NimはCより2倍速いと主張している人がまずはその比較コードとベンチ結果を示す義務がありますよ
下記のNim2.0ベンチマークより速くできなかったら、今度こそ本当にRustはNim2.0より劣る言語と理解してもよろしいでしょうか?
Rustは変数の所有権や借用を開発時に考慮する必要があり、とても学習コストが高いです。
Nim2.0ではコンパイラがソースコードを解析し、スコープと所有権に基づくメモリ管理を開発者が考える必要がなく自動で行います。
Nim2.0では開発者はプログラムをスクリプト言語のように書け、所有権や変数の寿命を意識する必要はありません。
しかし内部ではRustと同じメカニズムでメモリ管理を行っています。
フィボナッチ数列(回帰関数)のベンチマークはNim 2.0がダントツの速さでした
fibonacci(44)の計算
Nim 2.0.0 + gcc HEAD 14.0.0 -O2 (44はコマンドライン引数)
https://wandbox.org/...ink/cpYesJtnlRNJiu7Z
>Time= 0.197s Result=701408733
Nim(44はコマンドライン引数)
https://wandbox.org/...ink/WoYP0STRKxaRBGCY
>Time= 0.240s Result=701408733
C/gcc(44はソース直書き)
https://wandbox.org/...ink/9OYZBH14tYooZHF7
> Time: 0.89583 seconds
C/clang(44はソース直書き)
https://wandbox.org/...ink/U97PecZYrzymnfH4
>Time=1.58712s Result=701408733
872デフォルトの名無しさん
2024/09/13(金) 16:48:36.51ID:9KFHzeXz >>871
リンク訂正
fibonacci(44)の計算
Nim 2.0.0 + gcc HEAD 14.0.0 -O2 (44はコマンドライン引数)
https://wandbox.org/permlink/cpYesJtnlRNJiu7Z
>Time= 0.197s Result=701408733
Nim 2.0.0 + gcc 12.2.0 -O2 (44はコマンドライン引数)
https://wandbox.org/permlink/RVJ4eHKKl5DARK3u
>Time= 0.250s Result=701408733
C/gcc -O2 (44はソース直書き)
https://wandbox.org/permlink/9OYZBH14tYooZHF7
> Time: 0.89583 seconds
C/clang -O2 (44はソース直書き)
https://wandbox.org/permlink/U97PecZYrzymnfH4
>Time=1.58712s Result=701408733
リンク訂正
fibonacci(44)の計算
Nim 2.0.0 + gcc HEAD 14.0.0 -O2 (44はコマンドライン引数)
https://wandbox.org/permlink/cpYesJtnlRNJiu7Z
>Time= 0.197s Result=701408733
Nim 2.0.0 + gcc 12.2.0 -O2 (44はコマンドライン引数)
https://wandbox.org/permlink/RVJ4eHKKl5DARK3u
>Time= 0.250s Result=701408733
C/gcc -O2 (44はソース直書き)
https://wandbox.org/permlink/9OYZBH14tYooZHF7
> Time: 0.89583 seconds
C/clang -O2 (44はソース直書き)
https://wandbox.org/permlink/U97PecZYrzymnfH4
>Time=1.58712s Result=701408733
873デフォルトの名無しさん
2024/09/13(金) 18:49:24.01ID:Q2/6uPpv これは荒れるぞ…!
874デフォルトの名無しさん
2024/09/13(金) 18:54:08.50ID:XNZ3+5G0 C言語よりNimが4倍速いと確定
メモリ管理に優れたNimはフィボナッチ計算でも速い
メモリ管理に優れたNimはフィボナッチ計算でも速い
875デフォルトの名無しさん
2024/09/13(金) 20:47:19.98ID:0tvxUAPp 低知能さんは即NGされるだけやで
876デフォルトの名無しさん
2024/09/13(金) 21:30:58.64ID:3+j4DpP0 https://wandbox.org/permlink/EZG1tVHViP2HfZsH
Time=0.00000s Result=701408733
シンプルな書き方ではなくなるけど、ちゃんと最適化すると早くなるぞ
(nimでも同じことはできるかもしれないが)
元のコードでもCの方はインライン化されてるのかが気になった
inline 付けるとエラーになる (wandbox の仕様?不具合?) から試せなかったけど
Time=0.00000s Result=701408733
シンプルな書き方ではなくなるけど、ちゃんと最適化すると早くなるぞ
(nimでも同じことはできるかもしれないが)
元のコードでもCの方はインライン化されてるのかが気になった
inline 付けるとエラーになる (wandbox の仕様?不具合?) から試せなかったけど
877デフォルトの名無しさん
2024/09/13(金) 22:25:18.35ID:Q2/6uPpv う~ん高知能
878デフォルトの名無しさん
2024/09/13(金) 22:29:46.65ID:XNZ3+5G0 普通に書いてCの4~5倍速いNimが最速プログラミング言語でよろしいでしょうか?
879デフォルトの名無しさん
2024/09/13(金) 22:42:17.50ID:7dvxgxgq マイクロベンチマークは特性の把握に使うものであって優劣を決めるものじゃないよ。
単純な再帰の速度を計測してわかるのは単純な再帰のときの速度だ。
それが想定するユースケースにマッチしてるならそれでもいいけど……。
フィボナッチ数を計算するのが Nim の典型的な用途ってわけじゃないだろ?
単純な再帰の速度を計測してわかるのは単純な再帰のときの速度だ。
それが想定するユースケースにマッチしてるならそれでもいいけど……。
フィボナッチ数を計算するのが Nim の典型的な用途ってわけじゃないだろ?
881デフォルトの名無しさん
2024/09/13(金) 22:56:11.85ID:3+j4DpP0 Nimはメモリ管理が良いという話なら、ヒープを使わないコードで比較しても意味がないと思う
再起呼び出しの速さだけ見て何になるんだ
再起呼び出しの速さだけ見て何になるんだ
882デフォルトの名無しさん
2024/09/13(金) 23:00:41.14ID:FL81G/Fa883デフォルトの名無しさん
2024/09/13(金) 23:12:47.89ID:z8SS7FBe Cの4-5倍も速いのに全く普及する気配がないのは何故かを気にしたほうがいいと思うけど…
884デフォルトの名無しさん
2024/09/13(金) 23:13:27.70ID:36xg6fYR 俺環(Nim2.0.8)だと-d: dangerで-O3になる
Cを同じ-O3にすると所要時間はほぼ同じになる(ややCのほうが高速)
-d:releaseと-O2で比べるとNimのほうが有意に遅い
pragmaとコンパイルオプションと環境を揃えればそんな差が出るわけがない
Cを同じ-O3にすると所要時間はほぼ同じになる(ややCのほうが高速)
-d:releaseと-O2で比べるとNimのほうが有意に遅い
pragmaとコンパイルオプションと環境を揃えればそんな差が出るわけがない
885デフォルトの名無しさん
2024/09/13(金) 23:18:25.01ID:36xg6fYR 生成されたCのコードはNimのコンパイラ作ってる人間ならともかく普通の人間が読むのはキツイな
886デフォルトの名無しさん
2024/09/14(土) 00:15:56.82ID:tADrZaHu https://wandbox.org/permlink/MN8P2xOdeXQRYrEB
関数呼び出しコストの話とはあんま関係ないけど、小さな再帰関数なら数段分を別関数に分けると爆速になるという気づきを得た
たぶん数段分がひとつの関数内にインライン展開されてる
関数呼び出しコストの話とはあんま関係ないけど、小さな再帰関数なら数段分を別関数に分けると爆速になるという気づきを得た
たぶん数段分がひとつの関数内にインライン展開されてる
887デフォルトの名無しさん
2024/09/14(土) 01:41:16.01ID:vw4ahZGC structoptクレート外したら、リリースビルドで2.5MB小さくなった
たかがオプション解析でコードサイズでかすぎだろ
たかがオプション解析でコードサイズでかすぎだろ
888デフォルトの名無しさん
2024/09/14(土) 13:43:40.74ID:o3f0Ddoe >>872
糞リンク貼ってると誰の自演かバレるなω
糞リンク貼ってると誰の自演かバレるなω
889デフォルトの名無しさん
2024/09/14(土) 13:46:57.51ID:FiNQTETj Nimが、Cのトランスパイラのままなら、
Cを超えることは、出来ないんだけど。
C以外との比較なら、まだわかる。
Cを超えることは、出来ないんだけど。
C以外との比較なら、まだわかる。
890デフォルトの名無しさん
2024/09/14(土) 14:59:24.39ID:5H/bnNk9 Rust の std::sync::atomic::fence って C++ の std::atomic_thread_fence 相当?
891デフォルトの名無しさん
2024/09/14(土) 18:16:26.88ID:/jwt/PtH C/C++コードをパクろうとしているか?
RustでGPLロンダリングするな
RustでGPLロンダリングするな
892デフォルトの名無しさん
2024/09/14(土) 18:32:44.15ID:5H/bnNk9 メモリモデルが C++ のパクリだしそっちのほうが資料が豊富なんだからしょうがないじゃん
893デフォルトの名無しさん
2024/09/14(土) 19:17:14.39ID:zKyrbT+d そんなことよりCarbon Languageの話をしようぜ
894デフォルトの名無しさん
2024/09/14(土) 20:13:02.31ID:AKZgRAxV スレチ
895デフォルトの名無しさん
2024/09/15(日) 09:30:53.13ID:xw1jp1Zr Rustでreplaceするとロンダ楽なのか
良い話を教えてもらった
良い話を教えてもらった
896デフォルトの名無しさん
2024/09/15(日) 13:04:00.82ID:hg9QOZOF specialization って unsound なんですか?
897デフォルトの名無しさん
2024/09/15(日) 14:09:53.01ID:IQt0DXZr full specializationはunsoundな問題を抱えている
それが君の言う「specializationはunsound」の定義なら答えはyes
それが君の言う「specializationはunsound」の定義なら答えはyes
898デフォルトの名無しさん
2024/09/15(日) 14:54:57.41ID:O4LroQh3 Nimって初めて聞いたけどCのコード出力するんか
ならNimがCより早い、じゃなくてNimがおまえより早い、じゃね?
ならNimがCより早い、じゃなくてNimがおまえより早い、じゃね?
899デフォルトの名無しさん
2024/09/15(日) 15:02:55.04ID:hg9QOZOF >>897
あっうん、それは分かってて聞いたんだ
具体的にどういうコードだと UB になるのか
それを回避しているらしい min_specialization はどういう制約が付いたサブセットなのか
そういうのが知りたかったかな……
あっうん、それは分かってて聞いたんだ
具体的にどういうコードだと UB になるのか
それを回避しているらしい min_specialization はどういう制約が付いたサブセットなのか
そういうのが知りたかったかな……
900デフォルトの名無しさん
2024/09/15(日) 18:34:12.34ID:3FvPGoq2 >>899
Tracking Issueを読んでね
特にまとめ的なこの2つのコメントを
https://github.com/rust-lang/rust/issues/31844#issuecomment-1712327948
https://github.com/rust-lang/rust/issues/31844#issuecomment-1707023896
Tracking Issueを読んでね
特にまとめ的なこの2つのコメントを
https://github.com/rust-lang/rust/issues/31844#issuecomment-1712327948
https://github.com/rust-lang/rust/issues/31844#issuecomment-1707023896
901デフォルトの名無しさん
2024/09/15(日) 23:40:25.17ID:TlrO/i0R >>6
トヨタもRustかよ
トヨタもRustかよ
902デフォルトの名無しさん
2024/09/15(日) 23:50:17.65ID:D8okZ/+L Rustのビルド中間ファイルってなんであんなにでかくなるの?
Tauri使ったちょっとしたツールで20GBぐらい行ったりする
LLVM使ってる言語はみんなそうなの?
Tauri使ったちょっとしたツールで20GBぐらい行ったりする
LLVM使ってる言語はみんなそうなの?
903デフォルトの名無しさん
2024/09/16(月) 14:06:23.46ID:KZuryTv7 cargo clean
cargo update
これ毎回やってる
cargo update
これ毎回やってる
904デフォルトの名無しさん
2024/09/16(月) 14:06:47.97ID:KZuryTv7 Tauriは特に糞
905デフォルトの名無しさん
2024/09/17(火) 23:55:54.51ID:fQRlhwbL >>829
そこまで使い勝手が違うならshared_ptrとは別物と認識した方がよさそうだ
そこまで使い勝手が違うならshared_ptrとは別物と認識した方がよさそうだ
906デフォルトの名無しさん
2024/09/18(水) 11:56:36.10ID:vGGDuA6m Zigだんとつやんけ
ver1.0早う
github.com/kostya/benchmarks?tab=readme-ov-file#primes
ver1.0早う
github.com/kostya/benchmarks?tab=readme-ov-file#primes
907デフォルトの名無しさん
2024/09/18(水) 12:51:56.38ID:Vqc4Tj2+ >>906
ソース見たらコストの高いハッシュ衝突安全性を必要としない計算ベンチでそれを使っているいつもの話だった
知識がないとそういうミスをしてしまいがち
他にもVecをインデックスでシーケンシャルアクセスしたりRustに不慣れすぎ
ソース見たらコストの高いハッシュ衝突安全性を必要としない計算ベンチでそれを使っているいつもの話だった
知識がないとそういうミスをしてしまいがち
他にもVecをインデックスでシーケンシャルアクセスしたりRustに不慣れすぎ
908デフォルトの名無しさん
2024/09/18(水) 13:01:04.32ID:vQRPyR7n それより>>890ってどうなの
909デフォルトの名無しさん
2024/09/18(水) 13:54:44.95ID:3YdRpzvH910デフォルトの名無しさん
2024/09/18(水) 14:41:44.76ID:Qk7JHPx8 >>906
Rsutってインタープリター言語だっけ?
Rsutってインタープリター言語だっけ?
911デフォルトの名無しさん
2024/09/18(水) 15:08:51.57ID:TO48nZmb >>906
Rustは二重ループ内(141行目)の
let new_prefix = prefix.clone() + &ch.to_string();
が負担になってそう
他の言語と比べてないけどcloneはいらないはず
Rustは二重ループ内(141行目)の
let new_prefix = prefix.clone() + &ch.to_string();
が負担になってそう
他の言語と比べてないけどcloneはいらないはず
912デフォルトの名無しさん
2024/09/18(水) 15:25:03.39ID:TO48nZmb zigの実装に寄せるなら
let new_prefix = format!("{prefix}{ch}");
でいいのかな
全部見てないから動くか分からんけど
let new_prefix = format!("{prefix}{ch}");
でいいのかな
全部見てないから動くか分からんけど
913デフォルトの名無しさん
2024/09/18(水) 15:26:20.88ID:SWVF2jAZ914デフォルトの名無しさん
2024/09/18(水) 19:11:45.89ID:mTxD41RC >> 909
Go & trie-rs 追加
Go 0.845
Rust 1.306 (trie-rs)
>> 912
影響ないっぽい、ブレの範囲内だった
Go & trie-rs 追加
Go 0.845
Rust 1.306 (trie-rs)
>> 912
影響ないっぽい、ブレの範囲内だった
915デフォルトの名無しさん
2024/09/18(水) 22:13:43.11ID:nFxNUCWE >>906
意図的なのかわからないがそのコード
ZigではArenaAllocatorつまりアリーナを用いている
C++ではmonotonic_buffer_resorceつまりアリーナを用いている
Rustではなぜかアリーナが使われていない
その差が速度差となっている
前にもこのアリーナ利用の有無で速度が全く異なる話がこのスレで出ていたような
意図的なのかわからないがそのコード
ZigではArenaAllocatorつまりアリーナを用いている
C++ではmonotonic_buffer_resorceつまりアリーナを用いている
Rustではなぜかアリーナが使われていない
その差が速度差となっている
前にもこのアリーナ利用の有無で速度が全く異なる話がこのスレで出ていたような
レス数が900を超えています。1000を超えると表示できなくなるよ。
ニュース
- 橋下徹氏 外務省幹部の訪中受け「口だけ番長」へ痛烈指摘 「喧嘩は日本の完敗…なんとかっこ悪い日本か」 [冬月記者★]
- 【外国人問題】小野田紀美担当相「不法就労や不法滞在は許さない」 [シャチ★]
- 【野球】井端監督 大谷翔平、山本由伸らのWBCへの参加 「1日も早く返事ほしい」「待っててといっても、国内組が遅くなってしまう」★3 [冬月記者★]
- 経団連会長、日中は建設的対話を 経済3団体が高市首相と初会談も日中関係は話題に登らず… [BFU★]
- 中国で「クレしん」公開延期 対日報復、エンタメに波及 [蚤の市★]
- 東京株式市場 インバウンド関連株が下落 中国政府の渡航自粛要請で [バイト歴50年★]
- そういや米倉涼子はどうなったんんや?
- 有識者「高市総理が発言を撤回したり、辞職するしかないと言っている人は、それで日中関係が今まで通りになると思ってる?」 [834922174]
- 戦争は無くならないし殺人は起きるし女はレイプされるし子供は餓死するし
- ( -᷄ὢ-᷅ )💤
- 女性検診なんでオナニーしてグチョグチョで行ってやる
- 日経時間外、5万円割れ 垂直落下始まる [402859164]
