公式
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
レス数が1000を超えています。これ以上書き込みはできません。
2024/07/31(水) 00:46:26.17ID:DBMWY2QT
2024/07/31(水) 00:47:02.26ID:DBMWY2QT
Rust The Book (日本語版)
https://doc.rust-jp.rs/book-ja/
Rust edition guide (日本語版)
https://doc.rust-jp.rs/edition-guide/
Rust by example (日本語版)
https://doc.rust-jp.rs/rust-by-example-ja/
Rust cookbook (日本語版)
https://uma0317.github.io/rust-cookbook-ja/
Rust API guideline (日本語版)
https://sinkuu.github.io/api-guidelines/
Rust nomicon book (日本語版)
https://doc.rust-jp.rs/rust-nomicon-ja/
Rust async book (日本語版)
https://async-book-ja.netlify.app/
Rust WASM book (日本語版)
https://moshg.github.io/rustwasm-book-ja/
Rust embeded book (日本語版)
https://tomoyuki-nakabayashi.github.io/book/
Rust enbeded discovery (日本語版)
https://tomoyuki-nakabayashi.github.io/discovery/
Rust Design Patterns (日本語版)
https://qiita.com/Yappii_111/items/4ccc3a8461cdd4035651
https://qiita.com/Yappii_111/items/654717e6a6a980722189
Rust API guideline (日本語版)
https://sinkuu.github.io/api-guidelines/
https://doc.rust-jp.rs/book-ja/
Rust edition guide (日本語版)
https://doc.rust-jp.rs/edition-guide/
Rust by example (日本語版)
https://doc.rust-jp.rs/rust-by-example-ja/
Rust cookbook (日本語版)
https://uma0317.github.io/rust-cookbook-ja/
Rust API guideline (日本語版)
https://sinkuu.github.io/api-guidelines/
Rust nomicon book (日本語版)
https://doc.rust-jp.rs/rust-nomicon-ja/
Rust async book (日本語版)
https://async-book-ja.netlify.app/
Rust WASM book (日本語版)
https://moshg.github.io/rustwasm-book-ja/
Rust embeded book (日本語版)
https://tomoyuki-nakabayashi.github.io/book/
Rust enbeded discovery (日本語版)
https://tomoyuki-nakabayashi.github.io/discovery/
Rust Design Patterns (日本語版)
https://qiita.com/Yappii_111/items/4ccc3a8461cdd4035651
https://qiita.com/Yappii_111/items/654717e6a6a980722189
Rust API guideline (日本語版)
https://sinkuu.github.io/api-guidelines/
2024/07/31(水) 00:47:20.93ID:DBMWY2QT
Rust Reference Book
https://doc.rust-lang.org/reference/
Rust Standard Library
https://doc.rust-lang.org/std/
Rust rustc Book
https://doc.rust-lang.org/rustc/
Rust rustdoc Book
https://doc.rust-lang.org/rustdoc/
Rust rustup Book
https://rust-lang.github.io/rustup/
Rust Cargo Book
https://doc.rust-lang.org/cargo/
Rust unstable Book
https://doc.rust-lang.org/nightly/unstable-book/
Rust macro Book
https://danielkeep.github.io/tlborm/book/
Rust CLI (Command Line Interface) apps Book
https://rust-cli.github.io/book/
Rust Future Book
https://cfsamson.github.io/books-futures-explained/
Rust async-std Book
https://book.async.rs/
Rust tokio Book
https://tokio.rs/tokio/tutorial
Rust serde Book
https://serde.rs/
https://doc.rust-lang.org/reference/
Rust Standard Library
https://doc.rust-lang.org/std/
Rust rustc Book
https://doc.rust-lang.org/rustc/
Rust rustdoc Book
https://doc.rust-lang.org/rustdoc/
Rust rustup Book
https://rust-lang.github.io/rustup/
Rust Cargo Book
https://doc.rust-lang.org/cargo/
Rust unstable Book
https://doc.rust-lang.org/nightly/unstable-book/
Rust macro Book
https://danielkeep.github.io/tlborm/book/
Rust CLI (Command Line Interface) apps Book
https://rust-cli.github.io/book/
Rust Future Book
https://cfsamson.github.io/books-futures-explained/
Rust async-std Book
https://book.async.rs/
Rust tokio Book
https://tokio.rs/tokio/tutorial
Rust serde Book
https://serde.rs/
2024/08/01(木) 16:24:10.41ID:x8y3t2qM
>>1
乙
乙
2024/08/01(木) 18:56:40.59ID:pdiRiMAP
2024/08/01(木) 23:55:38.74ID:GRWphbaC
「The Rust Foundation」は、人命や財産に関わるような安全性が決定的に重要になるシステムのために、
Rust言語を責任を持ってサポートするためのコンソーシアム「Safety-Critical Rust Consortium」の設立を発表しました。
設立には日本からWoven by Toyotaが参加
Rust言語を責任を持ってサポートするためのコンソーシアム「Safety-Critical Rust Consortium」の設立を発表しました。
設立には日本からWoven by Toyotaが参加
2024/08/03(土) 23:20:11.39ID:Ir85kifm
今日調べたけど、RustでVecを拡張するときのサイズは前の2倍
JavaとRubyは1.5倍
Pythonはややこしくて約112.5%
Goはまず2倍だけど要素数が256を超えたら1.25倍におさえる
Rustはメモリ大目に使いがちかも
JavaとRubyは1.5倍
Pythonはややこしくて約112.5%
Goはまず2倍だけど要素数が256を超えたら1.25倍におさえる
Rustはメモリ大目に使いがちかも
2024/08/03(土) 23:47:40.31ID:b8/nS+s7
Note that the exponential growth is important.
On each reallocation, we have to copy twice as much, but then it takes twice as long to fill up again.
These factors cancel out and we get (on average) constant-time .push().
On each reallocation, we have to copy twice as much, but then it takes twice as long to fill up again.
These factors cancel out and we get (on average) constant-time .push().
2024/08/04(日) 09:23:44.30ID:smF75lRu
>>7
そのレートを利用者側で調整出来れば最強だった
そのレートを利用者側で調整出来れば最強だった
2024/08/04(日) 12:21:30.93ID:65IaeFum
要らない
設定できてしまうと、測定もせずに小さなレートを設定してかえって遅くなるか、
神経質な人やチームなら必要もないのにいちいち測定する羽目になって生産性爆下がりするかの二択になる
本当に調整する価値のある状況ならちゃんと測定して決めるはずだし、その手間に比べたら自前で適宜リサイズするくらい全く問題にならない手間だろう
設定できてしまうと、測定もせずに小さなレートを設定してかえって遅くなるか、
神経質な人やチームなら必要もないのにいちいち測定する羽目になって生産性爆下がりするかの二択になる
本当に調整する価値のある状況ならちゃんと測定して決めるはずだし、その手間に比べたら自前で適宜リサイズするくらい全く問題にならない手間だろう
2024/08/04(日) 12:26:21.94ID:gacpQS9v
>>7
それらGC言語は言語によってはメモリ管理上で仕方ない場合もあるのかもしれないが
C++やRustでは全く問題がないように作られているためパフォーマンスの良い2倍にしている
重要な点はキャパシティを2倍にしても実メモリ割り当ては2倍の消費をせずにその後ベクタを使用した長さ分だけに限られること
それらGC言語は言語によってはメモリ管理上で仕方ない場合もあるのかもしれないが
C++やRustでは全く問題がないように作られているためパフォーマンスの良い2倍にしている
重要な点はキャパシティを2倍にしても実メモリ割り当ては2倍の消費をせずにその後ベクタを使用した長さ分だけに限られること
2024/08/04(日) 12:30:08.75ID:65IaeFum
んなわけあるかい
いつのまにか勝手に他に割り当てられたらキャパシティの意味ないでしょ
いつのまにか勝手に他に割り当てられたらキャパシティの意味ないでしょ
2024/08/04(日) 12:37:16.12ID:gacpQS9v
>>12
実メモリ割り当てと仮想メモリ割り当ての違いを学ぼう
C++でもRustでもベクタのキャパ内の未使用エリアにアクセスしない
そのため未使用分の実メモリ割り当ては発生せずメモリ使用量の問題が起きない
実メモリ割り当てと仮想メモリ割り当ての違いを学ぼう
C++でもRustでもベクタのキャパ内の未使用エリアにアクセスしない
そのため未使用分の実メモリ割り当ては発生せずメモリ使用量の問題が起きない
2024/08/04(日) 13:05:57.09ID:+t3m9FIs
まーた複オジの嘘がはじまったね
2024/08/04(日) 14:52:31.44ID:EnndQ4ap
ユーザ空間の話してるときにカーネルの話混ぜないでよ
16デフォルトの名無しさん
2024/08/04(日) 15:19:59.12ID:ao1w9dwD 仮想メモリと実メモリの話はそもそもGoやJavaやRubyでも同じだろ
「他の言語では必ず実メモリから取られるから物理メモリ以上の量のデータを確保できない、だからこれらの言語では動的配列の確保を2倍よりも小さい値ずつにしている」とでも言いたいのか?
「他の言語では必ず実メモリから取られるから物理メモリ以上の量のデータを確保できない、だからこれらの言語では動的配列の確保を2倍よりも小さい値ずつにしている」とでも言いたいのか?
2024/08/04(日) 16:16:53.81ID:HF9mGFi1
2倍にしていけば累積コピー回数を平均1回台に抑えられるメリットがあって
これは1+2+4+8+...+2^(n-2)+2^(n-1)=2^n-1で累積と同じになるからで
そのためC++(gccやclang)やRustは2倍を採用している状況
別問題として
2倍にしていくのはメモリがもったいなくね?があるけど
OSの仮想メモリ管理により実際に使われるまでは実メモリが使われることはないのでだいじょうぶ
さらに自らv.reserve(size)とサイズを指定する手段も用意されていて
size以下の間はお引っ越しコピーを避けることができるので見積もれる時は推奨だよ
これは1+2+4+8+...+2^(n-2)+2^(n-1)=2^n-1で累積と同じになるからで
そのためC++(gccやclang)やRustは2倍を採用している状況
別問題として
2倍にしていくのはメモリがもったいなくね?があるけど
OSの仮想メモリ管理により実際に使われるまでは実メモリが使われることはないのでだいじょうぶ
さらに自らv.reserve(size)とサイズを指定する手段も用意されていて
size以下の間はお引っ越しコピーを避けることができるので見積もれる時は推奨だよ
18デフォルトの名無しさん
2024/08/04(日) 17:23:30.18ID:ku/HSe0h reallocationなんてパフォーマンス落ちるだけだし
with_capacityで自分でコントロールした方が良いと思う
with_capacityで自分でコントロールした方が良いと思う
19デフォルトの名無しさん
2024/08/04(日) 17:51:55.81ID:tbuKemgK2024/08/04(日) 18:11:52.52ID:mDDM97lI
大きなサイズに育っていくならコピー回数が少なくなる毎回2倍が有利
仮想メモリが足りるか足りないかの限界状況で用いるならwith_capacity()やreserve()を最初から用いる
仮想メモリが足りるか足りないかの限界状況で用いるならwith_capacity()やreserve()を最初から用いる
2024/08/04(日) 18:28:12.58ID:mhkxn3lF
フラグメンテーションの問題とかもあるから教科書通りの2倍固定よりも
Goのようにサイズが大きくなるにつれGrowth Factorも小さくしていくモデルのほうが一般的には良さそうだね
Goのようにサイズが大きくなるにつれGrowth Factorも小さくしていくモデルのほうが一般的には良さそうだね
2024/08/04(日) 18:43:06.42ID:YKxthOUq
gccでもclangでもC++のvectorは2倍にしていくから
これはRustの話ではなくて
2倍にしていくのが好ましいという長年の確立された知見が存在しているんだよ
これはRustの話ではなくて
2倍にしていくのが好ましいという長年の確立された知見が存在しているんだよ
2024/08/04(日) 18:44:03.04ID:YKxthOUq
一方でガベージコレクション依存言語は内部のメモリ管理方式が全く異なるから
各言語個別の事情があるかもしれないけどこのスレの話題ではないね
各言語個別の事情があるかもしれないけどこのスレの話題ではないね
2024/08/04(日) 19:01:06.46ID:S53R2Qhs
>>16
それらの言語は仮想メモリを持たない環境のことも考慮しての増加率なんだろうな
それらの言語は仮想メモリを持たない環境のことも考慮しての増加率なんだろうな
2024/08/04(日) 19:12:09.84ID:gh5gXoAa
仮想メモリを持たない環境でGC言語www
2024/08/04(日) 19:40:14.37ID:EnndQ4ap
思い込みの激しい人だこと
27デフォルトの名無しさん
2024/08/04(日) 19:41:13.70ID:ao1w9dwD Vecのアロケート戦略なんて標準ライブラリの実装レベルの話でしかないし、言語の特徴や優劣のような話でもないだろ
GoやJavaが2倍でも、逆にRustがより小さい値だったとしても、GCの有無とかの話に比べればずっと些細な話でしかないし
マジでなにいってるんだこいつとしか思えない
GoやJavaが2倍でも、逆にRustがより小さい値だったとしても、GCの有無とかの話に比べればずっと些細な話でしかないし
マジでなにいってるんだこいつとしか思えない
2024/08/04(日) 19:48:10.28ID:S53R2Qhs
2024/08/04(日) 20:16:30.17ID:5nFDNjd2
この議論
元々メモリ無駄食いのGC依存言語は無視してよくて、
Rustと同じジャンルのC++で長年議論されてきて2倍という結論が出ている。
どうしても2倍を批判したいならまずはgccやclangのC++に対して行なうとよいかと。
元々メモリ無駄食いのGC依存言語は無視してよくて、
Rustと同じジャンルのC++で長年議論されてきて2倍という結論が出ている。
どうしても2倍を批判したいならまずはgccやclangのC++に対して行なうとよいかと。
30デフォルトの名無しさん
2024/08/04(日) 20:31:51.43ID:ao1w9dwD 2倍に対して突っ込んでるんじゃなくて延々と的外れなことを書いてることに対して突っ込まれてるだけでは?
平均的なコピー回数が少ない点で2倍は妥当ではあるけど、それも「よく使われる方法」くらいの意味しかない
C++でもMSVCだと1.5倍だったと思うし (今のバージョンでもそうかは未確認)
平均的なコピー回数が少ない点で2倍は妥当ではあるけど、それも「よく使われる方法」くらいの意味しかない
C++でもMSVCだと1.5倍だったと思うし (今のバージョンでもそうかは未確認)
2024/08/04(日) 22:06:56.31ID:H9q8xh4E
>>21
Goがなぜそんなやり方をしているのか
実行しながら実メモリ使用量の変化を傍らでウォッチして見た
Goの大きなsliceでcapacityが増える時に実メモリ使用量が急激に増える
C++やRustではcapacityが増えてもそんな変動は起きない
つまりGoはこの問題のため2倍ではなく1.25倍にせざるをえないと思われる
Goがなぜそんなやり方をしているのか
実行しながら実メモリ使用量の変化を傍らでウォッチして見た
Goの大きなsliceでcapacityが増える時に実メモリ使用量が急激に増える
C++やRustではcapacityが増えてもそんな変動は起きない
つまりGoはこの問題のため2倍ではなく1.25倍にせざるをえないと思われる
2024/08/05(月) 00:28:29.24ID:vHNgTuSQ
>>16の主張が間違っていた可能性があるな
例えば世代別GC各管理領域も拡張再編などが起きるため
C++/Rustとは状況が異なり
増やしたメモリ領域への書き込みがすぐに生じて実メモリ使用量が一気に増えてしまうのかもしれない
例えば世代別GC各管理領域も拡張再編などが起きるため
C++/Rustとは状況が異なり
増やしたメモリ領域への書き込みがすぐに生じて実メモリ使用量が一気に増えてしまうのかもしれない
2024/08/05(月) 02:39:57.82ID:zvBpOjwN
C++で folly::fbvector を開発したFacebookによれば
成長係数2は最悪であることが数学的に証明されてるらしい
結論は1.5
https://github.com/facebook/folly/blob/main/folly/docs/FBVector.md
https://medium.com/smucs/fbvector-a-possible-replacement-for-std-vector-e46bb31b8a56
成長係数2は最悪であることが数学的に証明されてるらしい
結論は1.5
https://github.com/facebook/folly/blob/main/folly/docs/FBVector.md
https://medium.com/smucs/fbvector-a-possible-replacement-for-std-vector-e46bb31b8a56
2024/08/05(月) 05:37:35.60ID:7ld9tmOF
>>34
読んでみたが色々とおかしい
まず1.5倍がベストな理由が書かれていない
次に2倍が悪い理由の説明と現実が合っていない
書かれている2倍が悪い理由を具体的な数字で書いてみると
例えばベクタの使用メモリサイズが育っていって1GBになっている時に
過去に使った半分の512MBの空きが抜け殻としてあり
さらにその前の分として半分の256MBの空きもありそれが過去に繰り返されていて
512MB + 256MB + 128MB + 64MB + ...
= 1GB未満のの再利用できていないメモリがあることになる
つまり再利用ができていないために合わせて約2GBのメモリを確保しているにも関わらず使っているのは半分の1GBなってしまう
という2倍が悪い理由が書かれている
しかしこれは現実と異なる
実際にベクタをゼロから地道にプッシュしていきそのサイズが1GBになった時
確保しているメモリサイズを調べると1GBである
再利用できていない昔の抜け殻が計1GB弱残るという話が現実と合っていない
読んでみたが色々とおかしい
まず1.5倍がベストな理由が書かれていない
次に2倍が悪い理由の説明と現実が合っていない
書かれている2倍が悪い理由を具体的な数字で書いてみると
例えばベクタの使用メモリサイズが育っていって1GBになっている時に
過去に使った半分の512MBの空きが抜け殻としてあり
さらにその前の分として半分の256MBの空きもありそれが過去に繰り返されていて
512MB + 256MB + 128MB + 64MB + ...
= 1GB未満のの再利用できていないメモリがあることになる
つまり再利用ができていないために合わせて約2GBのメモリを確保しているにも関わらず使っているのは半分の1GBなってしまう
という2倍が悪い理由が書かれている
しかしこれは現実と異なる
実際にベクタをゼロから地道にプッシュしていきそのサイズが1GBになった時
確保しているメモリサイズを調べると1GBである
再利用できていない昔の抜け殻が計1GB弱残るという話が現実と合っていない
2024/08/05(月) 07:22:04.78ID:Fnw9TU7n
mmap/munmapでOSにメモリを返却できるから古い抜け殻は残らない
さらにmremapで実コピーをせずに利用可能サイズを増やすことができる
それらを呼び出すコストがかかるためその頻度が1.x倍より少なくなる2倍が好ましい
さらにmremapで実コピーをせずに利用可能サイズを増やすことができる
それらを呼び出すコストがかかるためその頻度が1.x倍より少なくなる2倍が好ましい
37デフォルトの名無しさん
2024/08/05(月) 12:04:08.00ID:3XGRFYoN 話が難しいから何を言っているかじゃなくて誰が言ってるかでしか判断出来ねえ
そして5chをソースにfollyのreadmeを否定する意見を信じることも出来ねえ
そして5chをソースにfollyのreadmeを否定する意見を信じることも出来ねえ
2024/08/05(月) 12:25:55.60ID:GBSMEVUI
話は聞かせてもらった
最適な比率は2でも1.5でもなく黄金比1.618だな
こういう問題は大体フィボナッチ数列が正解になる
僕は数学に詳しいんだ
最適な比率は2でも1.5でもなく黄金比1.618だな
こういう問題は大体フィボナッチ数列が正解になる
僕は数学に詳しいんだ
2024/08/05(月) 12:37:42.98ID:KD4qg6Wm
2024/08/05(月) 12:46:25.51ID:oUc4bjr3
>>37
むしろ彼しか問題にしてないだろ
g++とclang++のvectorとrustcのVecは2倍にしていく
もし2倍が致命的なら大論争になり変更されるはずだ
現実には実用面も含めて問題となっていない
むしろ彼しか問題にしてないだろ
g++とclang++のvectorとrustcのVecは2倍にしていく
もし2倍が致命的なら大論争になり変更されるはずだ
現実には実用面も含めて問題となっていない
2024/08/05(月) 13:06:57.87ID:8Bk1A49H
「致命的」に後退しちゃったねw
2024/08/05(月) 13:12:56.68ID:cmuXon6W
Linux などのメモリ管理戦略ではアロケータは空いてる番地を返すだけで
アクセスするまで実メモリの割り当てをしない。 (割り当てを遅延させる。)
vector を極端に伸ばしたり縮めたりするなら話は別だが、
徐々に伸びていって最後に捨てる一般的なユースケースなら
倍率はテキトーでも理論的な効率はそんなに差はない。
アクセスするまで実メモリの割り当てをしない。 (割り当てを遅延させる。)
vector を極端に伸ばしたり縮めたりするなら話は別だが、
徐々に伸びていって最後に捨てる一般的なユースケースなら
倍率はテキトーでも理論的な効率はそんなに差はない。
2024/08/05(月) 13:21:17.66ID:0eF3nMAk
rustやc++では再割り当てが行われると参照が無効になるから2倍にして頻度を下げるのかも
2024/08/05(月) 14:50:20.61ID:Ha+1Ci4D
https://github.com/rust-lang/rust/issues/29931
これだね
2015年から議論されてるけど、結局1.5倍がいいという結論には至ってないし
実際1.5倍を試してみた結果パフォーマンスが落ちてるから単純に1.5倍にするのはダメそう
もし1.X倍でパフォーマンス上がる方法があるならそのissueに報告すれば採用されるかもよ
これだね
2015年から議論されてるけど、結局1.5倍がいいという結論には至ってないし
実際1.5倍を試してみた結果パフォーマンスが落ちてるから単純に1.5倍にするのはダメそう
もし1.X倍でパフォーマンス上がる方法があるならそのissueに報告すれば採用されるかもよ
2024/08/05(月) 15:01:05.36ID:zvBpOjwN
>>44
rustcがベンチマークのネタに適してないんじゃないの?
rustcがベンチマークのネタに適してないんじゃないの?
2024/08/05(月) 15:14:32.99ID:Ha+1Ci4D
2024/08/05(月) 15:48:02.67ID:dNRQyEIb
もっと歴史の長いGCCのC++もClangのC++もvectorの再割り当ての長さ2倍を採用している
そしてGCを用いてメモリ管理する言語は各々で諸事情があるようだから参考にできない
そしてGCを用いてメモリ管理する言語は各々で諸事情があるようだから参考にできない
2024/08/05(月) 16:04:04.60ID:trHMLJ8c
fbvectorの話はアロケータが確保する単位に合わせて無駄を無くすということと
Vecのリサイズによって開放されたメモリ領域を再利用しやすくするということが書いてるだけ
どっちも理にかなってる
Vecのリサイズによって開放されたメモリ領域を再利用しやすくするということが書いてるだけ
どっちも理にかなってる
2024/08/05(月) 16:26:39.60ID:cmuXon6W
標準として提供する機能には平均的な性能が高いよりも
最悪の場合でもそれなりの性能が出るほうを優先するみたいな考え方もあるし
設計思想にもよるわな。
最悪の場合でもそれなりの性能が出るほうを優先するみたいな考え方もあるし
設計思想にもよるわな。
2024/08/05(月) 18:42:38.74ID:4UY8EQs1
https://medium.com/smucs/fbvector-a-possible-replacement-for-std-vector-e46bb31b8a56
C++の結果だけど結構な差が出てる
この人のコードを自分の環境でも試してみたがpush_backで5倍前後違う
単純に1.5倍固定じゃなくて真似したやつで試してみたらいいのにね
C++の結果だけど結構な差が出てる
この人のコードを自分の環境でも試してみたがpush_backで5倍前後違う
単純に1.5倍固定じゃなくて真似したやつで試してみたらいいのにね
2024/08/05(月) 19:15:50.62ID:YtHc3yqJ
>>50
ソース見てみたけど恣意的に10倍ずつ異なる長さで順にアロケーションを汚染していき
vectorは単発使い捨てで毎回残らないからその前の残骸の空きエリアにたまたま上手くマッチするかの勝負になっていて
現実とはかけ離れたテストになっていると思った
ソース見てみたけど恣意的に10倍ずつ異なる長さで順にアロケーションを汚染していき
vectorは単発使い捨てで毎回残らないからその前の残骸の空きエリアにたまたま上手くマッチするかの勝負になっていて
現実とはかけ離れたテストになっていると思った
52デフォルトの名無しさん
2024/08/05(月) 23:13:48.63ID:SkPCtOW0 >>49
速度vsメモリ効率なんかもあるしね
速度vsメモリ効率なんかもあるしね
2024/08/05(月) 23:56:18.02ID:pmuFbIFu
>>50
こんなに違いが出るのか
こんなに違いが出るのか
2024/08/06(火) 00:27:44.41ID:XznSKINw
2024/08/06(火) 10:36:53.30ID:SBxTyrdX
2.71828倍が良いとおもいますん
56デフォルトの名無しさん
2024/08/06(火) 13:40:39.24ID:BFQfD5mu 1.14514倍で
2024/08/06(火) 17:53:14.98ID:XznSKINw
C++が1.5倍伸長のFBVectorで自分の抜け殻を上手く再利用する件
Rustはなぜ2倍伸長でもっと速いのかを調べてみた
同じように他に邪魔されず伸長していくケースだと
RustのVecは以下のように
128Kバイトまでは同じアドレスのまま移動せずにコピー無しで2倍伸長していく
256Kバイト以上ではmremap利用でアドレスは移動するがコピー無しで2倍伸長していく
そのためRustのVecは2倍伸長でもサイズが巨大になっても速いことがわかった
addr=0x5642549e6ab0 cap=8 len=1+1
addr=0x5642549e6ab0 cap=8 len=2+1
addr=0x5642549e6ab0 cap=8 len=4+1
addr=0x5642549e6ab0 cap=16 len=8+1
addr=0x5642549e6ab0 cap=32 len=16+1
(途中略) 【アドレスはずっと変わらない】
addr=0x5642549e6ab0 cap=32K len=16K+1
addr=0x5642549e6ab0 cap=64K len=32K+1
addr=0x5642549e6ab0 cap=128K len=64K+1
【ここでアドレスが変化&mremap利用が始まる】
addr=0x7f661c06f010 cap=256K len=128K+1
addr=0x7f661bfee010 cap=512K len=256K+1
addr=0x7f661beed010 cap=1M len=512K+1
addr=0x7f661bcec010 cap=2M len=1M+1
(以降略)
Rustはなぜ2倍伸長でもっと速いのかを調べてみた
同じように他に邪魔されず伸長していくケースだと
RustのVecは以下のように
128Kバイトまでは同じアドレスのまま移動せずにコピー無しで2倍伸長していく
256Kバイト以上ではmremap利用でアドレスは移動するがコピー無しで2倍伸長していく
そのためRustのVecは2倍伸長でもサイズが巨大になっても速いことがわかった
addr=0x5642549e6ab0 cap=8 len=1+1
addr=0x5642549e6ab0 cap=8 len=2+1
addr=0x5642549e6ab0 cap=8 len=4+1
addr=0x5642549e6ab0 cap=16 len=8+1
addr=0x5642549e6ab0 cap=32 len=16+1
(途中略) 【アドレスはずっと変わらない】
addr=0x5642549e6ab0 cap=32K len=16K+1
addr=0x5642549e6ab0 cap=64K len=32K+1
addr=0x5642549e6ab0 cap=128K len=64K+1
【ここでアドレスが変化&mremap利用が始まる】
addr=0x7f661c06f010 cap=256K len=128K+1
addr=0x7f661bfee010 cap=512K len=256K+1
addr=0x7f661beed010 cap=1M len=512K+1
addr=0x7f661bcec010 cap=2M len=1M+1
(以降略)
2024/08/06(火) 18:25:14.08ID:XznSKINw
もちろんVecは2倍伸長をアロケータにリクエストするだけなので
実際に処理しているのはRust標準のGlobalアロケータ
この環境では出来たバイナリにglibcのmallocやreallocがリンクされてるので最終的にはそこに行き着くはず
実際に処理しているのはRust標準のGlobalアロケータ
この環境では出来たバイナリにglibcのmallocやreallocがリンクされてるので最終的にはそこに行き着くはず
2024/08/06(火) 19:53:13.46ID:qnIYIy1G
Carbon Languageに期待
2024/08/06(火) 20:16:16.47ID:XznSKINw
Rustの標準アロケータを使わずに
>>57をjemalloc利用でアドレス変化を調べると全く異なる結果となった
8Kバイトまではアドレスが毎回変わりコピー移動
16Kバイトから1Mバイトまではアドレスが変わらずコピー無し
2Mバイト以上はアドレスが毎回変わりmremapが使われてないためコピー移動
少なくとも今回の前提での利用の範囲内ならば
Rust標準をそのまま用いるのが最適となる
>>57をjemalloc利用でアドレス変化を調べると全く異なる結果となった
8Kバイトまではアドレスが毎回変わりコピー移動
16Kバイトから1Mバイトまではアドレスが変わらずコピー無し
2Mバイト以上はアドレスが毎回変わりmremapが使われてないためコピー移動
少なくとも今回の前提での利用の範囲内ならば
Rust標準をそのまま用いるのが最適となる
2024/08/06(火) 20:54:39.49ID:wYh3ia3o
そういや一昔前、jemallocを採用してるから
Rustは良いんだよ、って主張があったよね
Rustは良いんだよ、って主張があったよね
2024/08/06(火) 21:01:13.77ID:6BvweKuM
jemallocは色々と問題もあるため5年半前の2019年1月のRust1.32で標準採用しなくなった
もちろんjemallocが好ましいケースもあるのでその時は各自で簡単に使えるようにもなってる
もちろんjemallocが好ましいケースもあるのでその時は各自で簡単に使えるようにもなってる
2024/08/07(水) 00:45:04.42ID:9wVUhjvG
未だに Vec::new_in() が安定化しないRustとは対照的に
Zigはヒープ使う関数すべてで毎回毎回アロケータを引数に渡させて
毎回毎回成功したか確認させるんだね
Linuxカーネル開発にはZigの方が向いてるんじゃなかろうか?
Zigはヒープ使う関数すべてで毎回毎回アロケータを引数に渡させて
毎回毎回成功したか確認させるんだね
Linuxカーネル開発にはZigの方が向いてるんじゃなかろうか?
2024/08/07(水) 01:13:06.44ID:laZXlxij
{C++ std::vector, C++ fbvector, Rust std::Vec} × {jemalloc, glibc malloc, LLVM libc malloc, msvc malloc, musl libc malloc} × {Linux, macOS, Windows} × {x86_64, 仮想メモリの機能を持たない何らかのアーキテクチャ}
壮大な議論になってきたなあ
これ全部検証するつもり?
そういやglibc mallocは環境変数でヒープとmmapのどっちを使うかの閾値調整できるとか
msvc mallocは_DEBUGマクロが定義されていると確保したメモリに未初期化を表すバイトを書き込むとかもあった
条件はいくらでも付け加えられそうやね
壮大な議論になってきたなあ
これ全部検証するつもり?
そういやglibc mallocは環境変数でヒープとmmapのどっちを使うかの閾値調整できるとか
msvc mallocは_DEBUGマクロが定義されていると確保したメモリに未初期化を表すバイトを書き込むとかもあった
条件はいくらでも付け加えられそうやね
2024/08/07(水) 01:28:00.75ID:bHbc7bDV
サイズの大きなベクタは
キャパシティ拡張してもコピーが発生しないmremap利用のアロケータが有利という結論だな
サーバなどで一般的に使われるLinux環境ならRust標準でその条件を満たすから大丈夫
キャパシティ拡張してもコピーが発生しないmremap利用のアロケータが有利という結論だな
サーバなどで一般的に使われるLinux環境ならRust標準でその条件を満たすから大丈夫
2024/08/07(水) 08:32:07.19ID:PoJHP1fy
2024/08/07(水) 22:36:11.64ID:U8gMstyu
https://www.publickey1.jp/blog/24/rustservowebverso.html
2024年8月6日
欧州を基盤にオープンでセキュアなインターネットの実現を支援しているNLnet Foundationは、
昨年(2023年)末から、Linux Foundation傘下でRust製のクロスプラットフォーム対応Webブラウザエンジンとして開発が進められている「Servo」を用いたWebブラウザ「Verso」の開発プロジェクトの立ち上げを発表した。
また、この「Servo」をTauriの組み込みのWebViewとする方向で開発が始まっている。
Chromiumに代わるRust製
2024年8月6日
欧州を基盤にオープンでセキュアなインターネットの実現を支援しているNLnet Foundationは、
昨年(2023年)末から、Linux Foundation傘下でRust製のクロスプラットフォーム対応Webブラウザエンジンとして開発が進められている「Servo」を用いたWebブラウザ「Verso」の開発プロジェクトの立ち上げを発表した。
また、この「Servo」をTauriの組み込みのWebViewとする方向で開発が始まっている。
Chromiumに代わるRust製
2024/08/07(水) 22:38:49.83ID:s3SzVI85
>>67
名前がダサすぎるからダメ
名前がダサすぎるからダメ
2024/08/08(木) 05:28:31.41ID:KaOTCOs+
ChromiumがC++のメモリ管理ミスで度々セキュリティ脆弱性を招いてるから
対抗馬ができるのは良いこと
対抗馬ができるのは良いこと
2024/08/08(木) 06:03:12.33ID:8alSA2PJ
まともに動くまで20年ぐらい掛かるんだろ
2024/08/08(木) 13:55:28.27ID:xUywgMY3
Firefox先生の明日はどっちだ
2024/08/09(金) 06:14:59.59ID:ho+3w6rX
Tauri2.0 Android/iOSでマルチwebviewしたかった
この流れだとVersoになるまで出来なさそう
この流れだとVersoになるまで出来なさそう
2024/08/09(金) 10:26:33.54ID:6vJua0o/
タウリン実際どうなん?
実用になる?
実用になる?
2024/08/09(金) 10:41:11.99ID:yHKv01cw
>>73
有用だけど場合による。
有用だけど場合による。
75デフォルトの名無しさん
2024/08/09(金) 17:08:58.86ID:k9SqobKt implementation of `From` is not general enough
= note: `From<&'0 Hoge>` would have to be implemented for the type `Fuga<'_>`,
for any lifetime `'0`...
= note: ...but `From<&'1 Hoge>` is actually implemented for the type `Fuga<'1>`,
for some specific lifetime `'1`
これはどうやって解決するのが普通?
= note: `From<&'0 Hoge>` would have to be implemented for the type `Fuga<'_>`,
for any lifetime `'0`...
= note: ...but `From<&'1 Hoge>` is actually implemented for the type `Fuga<'1>`,
for some specific lifetime `'1`
これはどうやって解決するのが普通?
76デフォルトの名無しさん
2024/08/09(金) 17:13:42.47ID:k9SqobKt こういう実装は書いてあります
impl<'a> From<&'a Hoge> for Fuga<'a> {
fn from(src: &'a Hoge) -> Fuga<'_> {
Fuga::from(なんかの変換(src))
}
}
impl<'a> From<&'a Hoge> for Fuga<'a> {
fn from(src: &'a Hoge) -> Fuga<'_> {
Fuga::from(なんかの変換(src))
}
}
77デフォルトの名無しさん
2024/08/09(金) 17:18:10.35ID:k9SqobKt fn moge<T>(a: &str, b: &str) -> i64 where T: for<'a> From<&'a Hoge> {
中身
let m = T::from(hoge);
中身
}
みたいな関数を呼んだ(コンパイル時)ときに >>75 のエラーで止まります
中身
let m = T::from(hoge);
中身
}
みたいな関数を呼んだ(コンパイル時)ときに >>75 のエラーで止まります
78デフォルトの名無しさん
2024/08/09(金) 17:22:16.81ID:k9SqobKt 呼ぶ方は
let x = moge::<Fuga>(2, 5);
みたいに呼びたいのです
let x = moge::<Fuga>(2, 5);
みたいに呼びたいのです
79デフォルトの名無しさん
2024/08/09(金) 17:22:41.31ID:k9SqobKt fn mame(a: &str, b: &str) -> i64 {
中身
let m = Fuga::from(hoge);
中身
}
としたときは正常にコンパイルも動作もできました
中身
let m = Fuga::from(hoge);
中身
}
としたときは正常にコンパイルも動作もできました
2024/08/09(金) 18:10:20.58ID:KcU/iUYV
81デフォルトの名無しさん
2024/08/09(金) 19:57:46.44ID:JtHudt0o `src` does not live long enough
--- argument requires that `src` is borrowed for `'a`
borrowed value does not live long enough
`src` dropped here while still borrowed
--- argument requires that `src` is borrowed for `'a`
borrowed value does not live long enough
`src` dropped here while still borrowed
2024/08/09(金) 21:05:31.98ID:tUCUurcu
playgroundに再現する最小限のコードを貼れよ
2024/08/09(金) 21:17:17.11ID:6vJua0o/
タウリンで作られたなんか実用的なアプリある?
2024/08/09(金) 23:57:36.49ID:3boFjk2T
2024/08/10(土) 00:51:32.88ID:uWTGSvHq
>>84
なんか中国人が多いな
なんか中国人が多いな
2024/08/10(土) 09:52:32.95ID:3hKdT569
先月の航空業界や病院に政府機関など850万台のWindows端末が影響を受けた世界的な大規模システム障害について、
CrowdStrikeが根本原因分析のレポートを発表しました。
「コンテンツインタープリターは20個の値しか想定していませんでした。
したがって、21番目の値にコンテンツインタープリターがアクセスしようとすると、入力データ配列の末尾を超えて領域外のメモリが読み取られ、
その結果システムがクラッシュしました」と報告しています。
記事
https://gigazine.net/news/20240809-crowdstrike-root-cause-analysis/
CrowdStrikeが根本原因分析のレポートを発表しました。
「コンテンツインタープリターは20個の値しか想定していませんでした。
したがって、21番目の値にコンテンツインタープリターがアクセスしようとすると、入力データ配列の末尾を超えて領域外のメモリが読み取られ、
その結果システムがクラッシュしました」と報告しています。
記事
https://gigazine.net/news/20240809-crowdstrike-root-cause-analysis/
2024/08/10(土) 10:02:51.23ID:KZxV9Wds
>>86
Windowsやマイクロソフトは何も悪くなかったのか
Windowsやマイクロソフトは何も悪くなかったのか
2024/08/10(土) 11:11:45.08ID:ymCXtc/f
2024/08/10(土) 12:59:11.84ID:hldat476
Rustを使っていればってのは机上の空論なんだよな
自分でできないことを人に求めるなよと
自分でできないことを人に求めるなよと
2024/08/10(土) 13:41:40.63ID:KZxV9Wds
っぱRustだな
91デフォルトの名無しさん
2024/08/10(土) 13:42:02.22ID:hJCMdysf 今までそのプロジェクトに一度も貢献したことの無い人が「Rustで書き直さないの?」ってIssueを立てて即リジェクトされるのを見かける……
なぜかそういう人が好む言語 (彼らが本当にRustを書いているのかは不明)
なぜかそういう人が好む言語 (彼らが本当にRustを書いているのかは不明)
2024/08/10(土) 13:42:44.88ID:KZxV9Wds
人間がチェックするよりコンパイラに機械的にチェックさせたほうがこういうミスは出ないってことだ
93デフォルトの名無しさん
2024/08/10(土) 13:45:07.25ID:fX5Mv2O+ >>92
今回のクラウドストライクのやらかしは本来はテストコードで見つかるはずの脆弱性なんだけどな
今回のクラウドストライクのやらかしは本来はテストコードで見つかるはずの脆弱性なんだけどな
2024/08/10(土) 13:56:12.38ID:WA5EFoZj
Rustで防げる種類バグがあるのは事実でも、Rustに変えるとバグが減ります! と言っちゃうと嘘になる現実があるからみんな苦しんでるんですよ
2024/08/10(土) 14:13:42.84ID:yKio8xQl
2024/08/10(土) 15:13:38.79ID:qd6SEEuZ
それなのにRustは全然使われない理由って何なのかなあ
97デフォルトの名無しさん
2024/08/10(土) 15:33:50.34ID:NMxi230z クラウドストライクが件のセキュリティソフトを開発し始めた頃はまだRustが安定版になかったし仕方ない
98デフォルトの名無しさん
2024/08/10(土) 15:37:06.14ID:hJCMdysf 言語とビジネスは別の話だからだろ
顧客はソフトウェア製品にお金を出すのであって、「Rustで書かれていること」にお金を払うわけじゃない
既存プロジェクトを置き換えたところで顧客から追加のお金を貰えるわけではないし、置き換えをメインに作業してる間は機能追加などの開発は止まるわけだし
新規開発での採用は進んでると思うぞ
顧客はソフトウェア製品にお金を出すのであって、「Rustで書かれていること」にお金を払うわけじゃない
既存プロジェクトを置き換えたところで顧客から追加のお金を貰えるわけではないし、置き換えをメインに作業してる間は機能追加などの開発は止まるわけだし
新規開発での採用は進んでると思うぞ
2024/08/10(土) 16:01:23.31ID:7leusf5/
以前からのは対策が遅れるの仕方ないよな
ただし新規案件でC++はアウトで言い訳できない
十分に学習とお試しする時間があったのだから
ただし新規案件でC++はアウトで言い訳できない
十分に学習とお試しする時間があったのだから
100デフォルトの名無しさん
2024/08/10(土) 16:03:24.43ID:AQDKnTti もともとC++を使う案件自体が少ないんで
シビアなところは互換性を考慮してC++のまんまだし
シビアなところは互換性を考慮してC++のまんまだし
101デフォルトの名無しさん
2024/08/10(土) 16:16:28.94ID:hldat476 >>99
お前は何様なんだよw
お前は何様なんだよw
103デフォルトの名無しさん
2024/08/10(土) 16:58:24.77ID:dQTVCz1X104デフォルトの名無しさん
2024/08/10(土) 17:14:57.10ID:WA5EFoZj 多分>>76の戻り値をFuga<'a>に直すのが根本的解決だけどうまくいったならもういっか
105デフォルトの名無しさん
2024/08/10(土) 22:48:05.26ID:ogPlSB6Z タウリン好き
WinMacで動くクライアントアプリ書きたかってん
WinMacで動くクライアントアプリ書きたかってん
106デフォルトの名無しさん
2024/08/10(土) 23:49:33.16ID:oQf4NdPP >>104
私の記憶ではそこはやってみたのですが治りませんでしたね
私の記憶ではそこはやってみたのですが治りませんでしたね
107デフォルトの名無しさん
2024/08/11(日) 08:59:52.85ID:aVi0ITMX108デフォルトの名無しさん
2024/08/11(日) 11:53:58.67ID:iWzuk0+l Rustで防げるっていうのは、リストに正常にアクセスできたかチェックを強制されるって意味?
109デフォルトの名無しさん
2024/08/11(日) 12:32:03.37ID:Vk240t5v 標準環境なら範囲外アクセスはpanicして停止する
Cだとそこに有効なデータがあるものと思ってそのまま操作してしまい、その結果何が起きるか分からないということがある (言語でなくOS側のチェックにより防がれることはある)
no-std環境のRustについては自分も詳しくないので誰か書いてくれ
Cだとそこに有効なデータがあるものと思ってそのまま操作してしまい、その結果何が起きるか分からないということがある (言語でなくOS側のチェックにより防がれることはある)
no-std環境のRustについては自分も詳しくないので誰か書いてくれ
110デフォルトの名無しさん
2024/08/11(日) 12:55:28.88ID:GcC/Tgf1 >>108
Rustでは20個の領域を作った時点で
そこをその先頭アドレス=ポインタで指すのではなく
連続体(スライス)を抽象的な参照で指す
もちろんそのスライスへの参照は内部では先頭アドレスと長さになるが抽象的なスライス参照&[T]として扱う
そこからイテレータは20個の個別参照&Tを連続的に返したりインデックス指定によりget(index)でOption<&T>を得たりできる
21個目のアドレスを得たりその中身を見たりすることはsafeの範囲ではできない
Rustでは20個の領域を作った時点で
そこをその先頭アドレス=ポインタで指すのではなく
連続体(スライス)を抽象的な参照で指す
もちろんそのスライスへの参照は内部では先頭アドレスと長さになるが抽象的なスライス参照&[T]として扱う
そこからイテレータは20個の個別参照&Tを連続的に返したりインデックス指定によりget(index)でOption<&T>を得たりできる
21個目のアドレスを得たりその中身を見たりすることはsafeの範囲ではできない
112デフォルトの名無しさん
2024/08/11(日) 14:30:38.38ID:GcC/Tgf1 抽象的なレベルで安全を確保してしまえばその後にそのコードは最適化し放題
生成アセンブルコードはcargo asmでその場で確認できる
生成アセンブルコードはcargo asmでその場で確認できる
113デフォルトの名無しさん
2024/08/11(日) 15:19:18.37ID:1MlIj3rk >>111
範囲内かどうか比較する処理は入る。
ただし、静的に絶対安全と分かる状況なら最適化で消えることもある。
そうでなくても現代的 CPU だと分岐予測によって速度的ペナルティは小さいことが多い。
ゼロコストというわけではないが、 C 風のポインタがあまりにも素朴でミスしやすいことに対する解決法としては十分以上に小さいコストだと考えられている。
今では C++ にもスライス的な、範囲を表すクラスが標準に追加されていて再編成が進んでるのでやっぱりそのほうがよいという時代の潮流があるんだと思う。
範囲内かどうか比較する処理は入る。
ただし、静的に絶対安全と分かる状況なら最適化で消えることもある。
そうでなくても現代的 CPU だと分岐予測によって速度的ペナルティは小さいことが多い。
ゼロコストというわけではないが、 C 風のポインタがあまりにも素朴でミスしやすいことに対する解決法としては十分以上に小さいコストだと考えられている。
今では C++ にもスライス的な、範囲を表すクラスが標準に追加されていて再編成が進んでるのでやっぱりそのほうがよいという時代の潮流があるんだと思う。
114デフォルトの名無しさん
2024/08/11(日) 15:21:08.97ID:aeJBanf7 またいつもの嘘吐きが
115デフォルトの名無しさん
2024/08/11(日) 16:17:49.13ID:x9x8amRR zigはリリースビルドだと範囲チェックをオフにしちゃうらしい
やっぱゼロコストじゃないよね
やっぱゼロコストじゃないよね
116デフォルトの名無しさん
2024/08/11(日) 16:42:50.50ID:cW25bVgR >>111
例えばスライスをforで回してその値を書き込む関数
#[inline(never)]
fn foo(slice: &[i32]) {
for t in slice {
write_volatile!(VOLATILE, *t);
}
}
生成アセンブリコード
::foo:
test rsi, rsi
je .LBB11_3
shl rsi, 2
xor eax, eax
.LBB11_2:
mov ecx, dword ptr [rdi + rax]
mov dword ptr [rip + ::VOLATILE], ecx
add rax, 4
cmp rsi, rax
jne .LBB11_2
.LBB11_3:
ret
範囲内かどうかのチェックはC/C++と同じくループ内で1箇所のみで同じ動作になる
例えばスライスをforで回してその値を書き込む関数
#[inline(never)]
fn foo(slice: &[i32]) {
for t in slice {
write_volatile!(VOLATILE, *t);
}
}
生成アセンブリコード
::foo:
test rsi, rsi
je .LBB11_3
shl rsi, 2
xor eax, eax
.LBB11_2:
mov ecx, dword ptr [rdi + rax]
mov dword ptr [rip + ::VOLATILE], ecx
add rax, 4
cmp rsi, rax
jne .LBB11_2
.LBB11_3:
ret
範囲内かどうかのチェックはC/C++と同じくループ内で1箇所のみで同じ動作になる
117デフォルトの名無しさん
2024/08/11(日) 17:01:54.96ID:Vk240t5v ベアメタル環境でもRustってCより有用なものなの?
安全性は保証しやすくなるとして、書きやすさ (あるいは面倒臭さ) がどれほどのものか
実際経験ある人いる?
安全性は保証しやすくなるとして、書きやすさ (あるいは面倒臭さ) がどれほどのものか
実際経験ある人いる?
118デフォルトの名無しさん
2024/08/11(日) 18:11:06.27ID:1MlIj3rk >>117
内部的には unsafe が必要だけど外に対しては安全性を保障している基礎的な語彙が標準ライブラリにはいっぱいあるじゃん。
ああいう感じの基礎的なものを環境に合わせて作るというのがスタートラインで、それが適切に出来てればベアメタル環境だからといって特別な違いはない。
unsafe を適切に下層レイヤに押し込めれていないと全体に unsafe が頻出して Rust の安全性の恩恵を受けにくいし、
安全性の恩恵を受けられないのに Rust の面倒くさい部分はあるという状況になって嬉しくない。
最初の整備をまじめにやるのがすごく大事。
内部的には unsafe が必要だけど外に対しては安全性を保障している基礎的な語彙が標準ライブラリにはいっぱいあるじゃん。
ああいう感じの基礎的なものを環境に合わせて作るというのがスタートラインで、それが適切に出来てればベアメタル環境だからといって特別な違いはない。
unsafe を適切に下層レイヤに押し込めれていないと全体に unsafe が頻出して Rust の安全性の恩恵を受けにくいし、
安全性の恩恵を受けられないのに Rust の面倒くさい部分はあるという状況になって嬉しくない。
最初の整備をまじめにやるのがすごく大事。
>>116
thx
thx
120デフォルトの名無しさん
2024/08/11(日) 21:00:21.89ID:7p9p1GDG no_stdだとRustの基本的な機能は使えるけど
I/O入出力ライブラリなどが当然ないから
Hello, World!するのにこんな感じなのね
https://zenn.dev/zulinx86/articles/rust-nostd-101#final-code
I/O入出力ライブラリなどが当然ないから
Hello, World!するのにこんな感じなのね
https://zenn.dev/zulinx86/articles/rust-nostd-101#final-code
121デフォルトの名無しさん
2024/08/12(月) 13:11:33.58ID:XQ/hRBSk122デフォルトの名無しさん
2024/08/12(月) 13:21:38.56ID:XQ/hRBSk >>120
ベアメタルって元々そういうもんでそ
ベアメタルって元々そういうもんでそ
123デフォルトの名無しさん
2024/08/12(月) 14:00:36.88ID:zYUAXUFL124デフォルトの名無しさん
2024/08/12(月) 14:04:58.34ID:s7amXorj125デフォルトの名無しさん
2024/08/12(月) 14:12:42.26ID:zYUAXUFL トレイトを使いこなせば便利で快適なのに
難しいと思い込んで使いこなさない人が困るだけ
難しいと思い込んで使いこなさない人が困るだけ
126デフォルトの名無しさん
2024/08/12(月) 14:53:33.48ID:1PYqSgWq 複オジに餌を与えないでください!
みんなが迷惑しています!
みんなが迷惑しています!
127デフォルトの名無しさん
2024/08/12(月) 15:10:33.91ID:CLy07uUA 事前に理想的な設計が出来るなら苦労はないんだが現実はそうではないという話だわな
128デフォルトの名無しさん
2024/08/12(月) 15:15:42.43ID:YiYv/cy+ 新たにtraitを導入する時やリファクタリングで構成を変える時も新たなtrait境界を満たしていけばよくて使い勝手がいいね
129デフォルトの名無しさん
2024/08/12(月) 15:16:59.31ID:KoHKVvuj リファクタリングができない難しいという
人が定期的に出るけど他の言語とも比較して
コード例出してくれ
人が定期的に出るけど他の言語とも比較して
コード例出してくれ
130デフォルトの名無しさん
2024/08/12(月) 15:32:17.85ID:c1LudIob リファクタリングしやすいしにくいの違いの定義がそもそもわからん
そういう意味でも例を頼む
そういう意味でも例を頼む
131デフォルトの名無しさん
2024/08/12(月) 16:20:20.18ID:IbEOTvl2 自分的には「リファクタリングしやすい」=「書き換えミスがコンパイルエラーとして検出されやすい」なので
型強めの静的型(Rust)>型弱めの静的型(C系)>動的型
って感じ
ただ「書き換え時にコンパイルエラーに煩わされない」を重視してて動的型がリファクタリングしやすい派もいるっぽい
(個人的にはエラーにならなくてもいつのまにか動作変わってたら意味なくない?と思うけど…)
型強めの静的型(Rust)>型弱めの静的型(C系)>動的型
って感じ
ただ「書き換え時にコンパイルエラーに煩わされない」を重視してて動的型がリファクタリングしやすい派もいるっぽい
(個人的にはエラーにならなくてもいつのまにか動作変わってたら意味なくない?と思うけど…)
132デフォルトの名無しさん
2024/08/12(月) 17:02:05.11ID:Hka8sI98 ああ,書き換え中にエラーなり警告なりが出るのが煩わしいってことか
大抵の言語でそれはありそうだから,エディタの設定で最後にタイプしてから何秒後にアナライザのチェックを入れるかとかいじればいいのでは
大抵の言語でそれはありそうだから,エディタの設定で最後にタイプしてから何秒後にアナライザのチェックを入れるかとかいじればいいのでは
133デフォルトの名無しさん
2024/08/12(月) 17:13:40.85ID:rd9pnszR JetBrainsがリファクタリング機能の出来具合で比べてみると一目瞭然
静的型付け言語の中では最弱
静的型付け言語の中では最弱
134デフォルトの名無しさん
2024/08/12(月) 17:14:55.12ID:s11pSEyp 前スレでもリファクタリングの話出てたけど
無かったことにしてまた同じ話するの
無かったことにしてまた同じ話するの
135デフォルトの名無しさん
2024/08/12(月) 17:16:15.95ID:CLy07uUA プログラマの中には剛腕タイプというか、脳のメモリが大きくて広い範囲の見通しを付けられる人はいる。
そういう人にとっては抽象レイヤも静的型も邪魔になる。
でもまあそういうのはほんまもんの超人なので普通の人は静的型のほうがいいと思う
そういう人にとっては抽象レイヤも静的型も邪魔になる。
でもまあそういうのはほんまもんの超人なので普通の人は静的型のほうがいいと思う
136デフォルトの名無しさん
2024/08/12(月) 17:23:31.41ID:s11pSEyp 他言語との比較もネタ切れ感無理矢理感が激しくていい加減飽きてきた
137デフォルトの名無しさん
2024/08/12(月) 17:32:40.07ID:hWGH0NP6 昔から静的型付け言語はリファクタリングが不便と主張する人がいるけど
イヤなら動的型付け言語を使っていなさい、で終わる話
イヤなら動的型付け言語を使っていなさい、で終わる話
138デフォルトの名無しさん
2024/08/12(月) 20:58:59.97ID:+jMHtzbv Rustの面倒臭さって静的型付けだけでないと思う
方針が見えてるものを堅く作る分には強いけど、作る→試す→改善するといったサイクルを回すような開発は負荷が大きい
Rustでのゲーム開発を断念したLogLog Gamesが出した文章 (https://loglog.games/blog/leaving-rust-gamedev/) なんかは、全てに同意しないにしても、Rustってそういうデメリットはあるよねって感じるだろうし
方針が見えてるものを堅く作る分には強いけど、作る→試す→改善するといったサイクルを回すような開発は負荷が大きい
Rustでのゲーム開発を断念したLogLog Gamesが出した文章 (https://loglog.games/blog/leaving-rust-gamedev/) なんかは、全てに同意しないにしても、Rustってそういうデメリットはあるよねって感じるだろうし
139デフォルトの名無しさん
2024/08/12(月) 21:02:06.81ID:Bgv7f5Pf matchで全揃い(Some(a), Some(b), Some(c)) =>などができない言語だと確かに面倒かもしれない
484 デフォルトの名無しさん 2024/08/12(月) 17:05:54
Optional型の変数はNoneの場合のハンドリングが必要だから余計に複雑度が増す
だからNoneで明示的に初期化が必要な関数ローカルの状態変数が3つもあるのなら
リファクタリングを検討したほうがいいと思ってる
484 デフォルトの名無しさん 2024/08/12(月) 17:05:54
Optional型の変数はNoneの場合のハンドリングが必要だから余計に複雑度が増す
だからNoneで明示的に初期化が必要な関数ローカルの状態変数が3つもあるのなら
リファクタリングを検討したほうがいいと思ってる
140デフォルトの名無しさん
2024/08/12(月) 21:06:34.61ID:P+uhzEsZ >>138
その人も「Once you get good at Rust all of these problems will go away」と書いているように
Rust流のやり方を身に着ければ消える問題ばかり
その人も「Once you get good at Rust all of these problems will go away」と書いているように
Rust流のやり方を身に着ければ消える問題ばかり
141デフォルトの名無しさん
2024/08/12(月) 21:13:39.00ID:s11pSEyp https://github.com/rust-lang/rust/issues/91639
デフォルトでwarnにもdenyにもなってないけど最重要級のlint見つけたぞい
前スレのライフタイムリファクタの話題が出た時点で教えて欲しかったな……
デフォルトでwarnにもdenyにもなってないけど最重要級のlint見つけたぞい
前スレのライフタイムリファクタの話題が出た時点で教えて欲しかったな……
142デフォルトの名無しさん
2024/08/12(月) 21:19:15.69ID:+jMHtzbv >>140
内容読んでるか?
その反応こそ批判対象の一部だぞ
Rustの根本的な部分で困難が生じていても、Rustコミュニティは「それはあなたがRustのやり方を知らないだけだ」としか言わない、というのを批判してるチャプターだ
内容読んでるか?
その反応こそ批判対象の一部だぞ
Rustの根本的な部分で困難が生じていても、Rustコミュニティは「それはあなたがRustのやり方を知らないだけだ」としか言わない、というのを批判してるチャプターだ
143デフォルトの名無しさん
2024/08/12(月) 21:32:50.85ID:eisITTDv 複オジをRustコミュニティの代表者として扱うなよ
144デフォルトの名無しさん
2024/08/12(月) 21:42:37.55ID:3Ibpt2aV145デフォルトの名無しさん
2024/08/12(月) 22:04:56.11ID:AOmsGFzU146デフォルトの名無しさん
2024/08/12(月) 22:12:53.72ID:s11pSEyp 他言語と比較して優位を示したい向きがメインになってしまうとどうも Rust の問題の存在を否定する方向に向かいがちで良くないな
そう考えるとオナニーコードでレスバやってたほうがいくらかマシだったのかもしれん
そう考えるとオナニーコードでレスバやってたほうがいくらかマシだったのかもしれん
147デフォルトの名無しさん
2024/08/12(月) 23:01:06.12ID:ksJqJtTC リファクタリングの件でも他の件でもいいけど、
他の言語と比較してRustで何が難しくて困っているのかを具体的なコード例で出してくれないと、
話が進まずに個人の感想か空想に終わってしまう。
他の言語と比較してRustで何が難しくて困っているのかを具体的なコード例で出してくれないと、
話が進まずに個人の感想か空想に終わってしまう。
148デフォルトの名無しさん
2024/08/13(火) 12:11:44.59ID:Nsck/Z03 >>131
ミスをコンパイルエラーにしてくれることがプログラム書いて色々試してる時もリファクタリングしてる時も一番重要だもんな
他の言語だと実行時のエラーや実行時のデバッグに依存せざるを得なかったことがRustでは実行前に解決することが多くて開発効率が良くて助かる
ミスをコンパイルエラーにしてくれることがプログラム書いて色々試してる時もリファクタリングしてる時も一番重要だもんな
他の言語だと実行時のエラーや実行時のデバッグに依存せざるを得なかったことがRustでは実行前に解決することが多くて開発効率が良くて助かる
149デフォルトの名無しさん
2024/08/13(火) 12:58:50.63ID:qGcIneKd 設計を変更する際に必要な変更が多いのはありそう
例えば既存のコードをasyncに対応させようとすると、必要なデータを Arc, Mutex で包んだり、参照のせいでSendできないものをOwnedな型に置き換えたり、トレイト境界に Sync + Send を付けてまわったりといった手間が要る
「設計を変更する」と決めたのでなく、「変更するとどうなるか試したい」といった場合でもこういった作業が必要で、その点は面倒かもしれない
必要な変更をコンパイラが教えてくれるのがありがたいというのは自分も同意する
例えば既存のコードをasyncに対応させようとすると、必要なデータを Arc, Mutex で包んだり、参照のせいでSendできないものをOwnedな型に置き換えたり、トレイト境界に Sync + Send を付けてまわったりといった手間が要る
「設計を変更する」と決めたのでなく、「変更するとどうなるか試したい」といった場合でもこういった作業が必要で、その点は面倒かもしれない
必要な変更をコンパイラが教えてくれるのがありがたいというのは自分も同意する
150デフォルトの名無しさん
2024/08/13(火) 13:12:20.55ID:J7fCsAWj >>149
シングルスレッドの言語以外は
メモリを共有するならそれら排他制御が必要となる点で言語に関係なく同じ
メモリを直接共有しない(例えばチャネル使用)ならRustでもそれらは必要ない
つまりRust特有の話ではない
シングルスレッドの言語以外は
メモリを共有するならそれら排他制御が必要となる点で言語に関係なく同じ
メモリを直接共有しない(例えばチャネル使用)ならRustでもそれらは必要ない
つまりRust特有の話ではない
151デフォルトの名無しさん
2024/08/13(火) 13:12:37.07ID:iXbJ0ifY 動的言語に比べて静的言語がリファクタリングしやすいのは当たり前
モダンな言語の中でRustは所有権とライフタイムのせいで他に比べて明らかにリファクタリングが面倒
火を見るより明らかなことなのになぜ必死に否定したがるのか意味がわからない
モダンな言語の中でRustは所有権とライフタイムのせいで他に比べて明らかにリファクタリングが面倒
火を見るより明らかなことなのになぜ必死に否定したがるのか意味がわからない
152デフォルトの名無しさん
2024/08/13(火) 13:14:54.05ID:6c4LDvBa >>149
asyncはリファクタリングとはまた別のRustの弱点
asyncはリファクタリングとはまた別のRustの弱点
153デフォルトの名無しさん
2024/08/13(火) 13:23:07.46ID:MGOQRx4E154デフォルトの名無しさん
2024/08/13(火) 13:28:41.46ID:+eZNFqL6155デフォルトの名無しさん
2024/08/13(火) 13:46:36.22ID:qGcIneKd 非同期による排他は別にしても参照まわりの面倒さはある
&str にするか String にするか、Rc<String> なのか Arc<Mutex<String>> なのかといったものを考える必要があるし、リファクタ/設計変更の際にこれらの置き換え作業が必要になることはある
細かな最適化はできなくても、GC有りの言語がシンプルに1つString型だけ提供しているのは楽といえば楽
なぜエラーになるのかはコンパイラが教えてくれるし、慣れれば分かるものだけど、必要な変更が他の静的言語に比べて多くて面倒というのは否めないでしょ
自分はRustは好きだし良い言語だと思ってるけど、不便が無いとは思わないし、それが分からないのは現実の開発経験が無いんじゃないかとすら思う
&str にするか String にするか、Rc<String> なのか Arc<Mutex<String>> なのかといったものを考える必要があるし、リファクタ/設計変更の際にこれらの置き換え作業が必要になることはある
細かな最適化はできなくても、GC有りの言語がシンプルに1つString型だけ提供しているのは楽といえば楽
なぜエラーになるのかはコンパイラが教えてくれるし、慣れれば分かるものだけど、必要な変更が他の静的言語に比べて多くて面倒というのは否めないでしょ
自分はRustは好きだし良い言語だと思ってるけど、不便が無いとは思わないし、それが分からないのは現実の開発経験が無いんじゃないかとすら思う
156デフォルトの名無しさん
2024/08/13(火) 13:51:51.56ID:FRB3Y3s9 Rustはわかってないとそもそも型チェックに通るコードが書けない
157デフォルトの名無しさん
2024/08/13(火) 14:03:17.07ID:vwwzn05u もっと経験を積むと「なぜエラーになるのかはコンパイラが教えてくれる」どころか「コンパイラはこちらのミスをエラーにしてくれる」すら思い込みだったと気づく時が来る
もう一度貼っておくからよく読むように
特に「5) コンパイルされたならライフタイムの記述は正しい」と「7) コンパイラのエラーメッセージはプログラムの直し方を教えてくれる」
https://github.com/pretzelhammer/rust-blog/blob/master/posts/translations/jp/common-rust-lifetime-misconceptions.md
もう一度貼っておくからよく読むように
特に「5) コンパイルされたならライフタイムの記述は正しい」と「7) コンパイラのエラーメッセージはプログラムの直し方を教えてくれる」
https://github.com/pretzelhammer/rust-blog/blob/master/posts/translations/jp/common-rust-lifetime-misconceptions.md
158デフォルトの名無しさん
2024/08/13(火) 14:04:43.72ID:SFyZa65C Rustの問題じゃないね
チーム適用や実要件に当てはめて見る実務マと趣味マの違い
チーム適用や実要件に当てはめて見る実務マと趣味マの違い
159デフォルトの名無しさん
2024/08/13(火) 16:05:15.51ID:d5oxWZvl >>157
それは詭弁
例えばその「5) コンパイルされたならライフタイムの記述は正しい」
まずこれは参照の安全性を保証するRustとしては常に正しい
もちろん複数の参照が登場する時は色んな組み合わせのライフタイムの付け方がある
それらのうち参照の安全性を保証できる組み合わせのみをコンパイラは通す
コンパイルが通る組み合わせのうちどれが自分の意図なのかは各自の問題となる
もし自分の意図と異なっていた場合はそれが利用されるところで参照が切れてコンパイルエラーとなる
そのため間違っていたことに気づくことができる
そして修正してコンパイルが通れば記述は正しい
その記事の例でもこの流れで正しい記述にたどり着けている
それは詭弁
例えばその「5) コンパイルされたならライフタイムの記述は正しい」
まずこれは参照の安全性を保証するRustとしては常に正しい
もちろん複数の参照が登場する時は色んな組み合わせのライフタイムの付け方がある
それらのうち参照の安全性を保証できる組み合わせのみをコンパイラは通す
コンパイルが通る組み合わせのうちどれが自分の意図なのかは各自の問題となる
もし自分の意図と異なっていた場合はそれが利用されるところで参照が切れてコンパイルエラーとなる
そのため間違っていたことに気づくことができる
そして修正してコンパイルが通れば記述は正しい
その記事の例でもこの流れで正しい記述にたどり着けている
160デフォルトの名無しさん
2024/08/13(火) 17:41:07.28ID:3jlS4CIE 「Rustで作るプログラミング言語」
この本おすすめですか?
この本おすすめですか?
161デフォルトの名無しさん
2024/08/13(火) 17:55:28.98ID:vwwzn05u >>159
利用の仕方が変わると、それに引っ張られて宣言側が正しかったかどうかが変わる、と言いたいの?
利用の仕方が変わると、それに引っ張られて宣言側が正しかったかどうかが変わる、と言いたいの?
162デフォルトの名無しさん
2024/08/13(火) 18:03:57.04ID:d5oxWZvl >>161
一般的にそうなる
例えば二つの参照を引数にとる関数で二つに異なるライフタイムを持たせるかどうかは利用の前提や方針でどちらもありうる
利用する側(やそれを全て想定したtest)でコンパイルが通るならばそのコードは正しい
一般的にそうなる
例えば二つの参照を引数にとる関数で二つに異なるライフタイムを持たせるかどうかは利用の前提や方針でどちらもありうる
利用する側(やそれを全て想定したtest)でコンパイルが通るならばそのコードは正しい
163デフォルトの名無しさん
2024/08/13(火) 18:21:49.94ID:qGcIneKd 「参照を扱う際は適切なライフタイム注釈を書く必要がある」は他の静的言語より面倒という指摘そのものでは?
「適切なライフタイム注釈を書けばコンパイルは通るし、それで安全性が保障される」のは分かってるけど、問題はそこではなくて
「適切なライフタイム注釈を書けばコンパイルは通るし、それで安全性が保障される」のは分かってるけど、問題はそこではなくて
164デフォルトの名無しさん
2024/08/13(火) 18:23:56.90ID:vwwzn05u >>162
なるほどね、「正しいコード」の定義に齟齬があるのね
「5) コンパイルされたならライフタイムの記述は正しい」の「正しい」は「プログラマの意図通りである」の意味だと思って
それを念頭にもう一回読み直してみて
なるほどね、「正しいコード」の定義に齟齬があるのね
「5) コンパイルされたならライフタイムの記述は正しい」の「正しい」は「プログラマの意図通りである」の意味だと思って
それを念頭にもう一回読み直してみて
165デフォルトの名無しさん
2024/08/13(火) 18:27:02.24ID:6FUbHmIE166デフォルトの名無しさん
2024/08/13(火) 18:33:34.80ID:d5oxWZvl167デフォルトの名無しさん
2024/08/13(火) 18:35:53.44ID:G2fhNxh+ 「正しい」という言葉を多用する技術者にまともなやつはいない
168デフォルトの名無しさん
2024/08/13(火) 18:48:09.58ID:qGcIneKd >>165
C/C++に比べても面倒では?
設計で防げる問題/考慮が要らない問題に対して必要以上のガードを書かされる感じ
例えばグローバルな変数 (一度だけ初期化され、以降は不変) に対して Sync が要るのも、初期化が複数スレッドから呼ばれた場合の安全性を保証しないとコンパイルが通らないからだけど、設計上それは要らないって場面はある
シングルスレッドなアプリだったり、マルチスレッドだけどスレッド生成は初期化の後であるいった場合
参照も同じで、設計上無効なデータを指すことがないといえるケースでも、コンパイラを納得させるために手動でライフタイム注釈を書く必要があるといった感じ
C/C++に比べても面倒では?
設計で防げる問題/考慮が要らない問題に対して必要以上のガードを書かされる感じ
例えばグローバルな変数 (一度だけ初期化され、以降は不変) に対して Sync が要るのも、初期化が複数スレッドから呼ばれた場合の安全性を保証しないとコンパイルが通らないからだけど、設計上それは要らないって場面はある
シングルスレッドなアプリだったり、マルチスレッドだけどスレッド生成は初期化の後であるいった場合
参照も同じで、設計上無効なデータを指すことがないといえるケースでも、コンパイラを納得させるために手動でライフタイム注釈を書く必要があるといった感じ
169デフォルトの名無しさん
2024/08/13(火) 18:49:04.65ID:d5oxWZvl170デフォルトの名無しさん
2024/08/13(火) 18:59:01.23ID:6FUbHmIE >>168
スレッド内でしか用いないならばthread_localにより!Syncでも使えるよ
「設計上それは要らない」「設計上無効なデータを指すことがない」という思い込みは絶対にダメ
例えば無効なデータを指さないが&'staticの意味ならばそれを使えばよいのだよ
スレッド内でしか用いないならばthread_localにより!Syncでも使えるよ
「設計上それは要らない」「設計上無効なデータを指すことがない」という思い込みは絶対にダメ
例えば無効なデータを指さないが&'staticの意味ならばそれを使えばよいのだよ
171デフォルトの名無しさん
2024/08/13(火) 19:01:54.22ID:vwwzn05u >>166
想定するケースが最初から全部書けるならそれでいいが、残念ながらそんな現実は無いよ
ソフトウェアテストの7原則のひとつ: 全数テストは不可能
それに、意図はコード化できるものばかりではない、unsafe関数のdoc-commentに書くべきsafety sectionだってそうだろう
コード化できなければ「プログラマの意図」ではないというのならそれも一理あるだろうが、多分誰も同意しないと思うぞ
想定するケースが最初から全部書けるならそれでいいが、残念ながらそんな現実は無いよ
ソフトウェアテストの7原則のひとつ: 全数テストは不可能
それに、意図はコード化できるものばかりではない、unsafe関数のdoc-commentに書くべきsafety sectionだってそうだろう
コード化できなければ「プログラマの意図」ではないというのならそれも一理あるだろうが、多分誰も同意しないと思うぞ
172デフォルトの名無しさん
2024/08/13(火) 19:10:37.01ID:d5oxWZvl >>171
そんな大きな話はなされていない
一般的な話はRustの範囲を超えている
今回はRustのライフタイムの記述が正しいかどうかの話
想定した使い方でコンパイルが通ればそのコードは正しい&安全となる
想定範囲を変えたり広げたりしてコンパイルエラーとなったならばそれに対応すればよい
そんな大きな話はなされていない
一般的な話はRustの範囲を超えている
今回はRustのライフタイムの記述が正しいかどうかの話
想定した使い方でコンパイルが通ればそのコードは正しい&安全となる
想定範囲を変えたり広げたりしてコンパイルエラーとなったならばそれに対応すればよい
173デフォルトの名無しさん
2024/08/13(火) 19:44:50.08ID:qGcIneKd そもそもの話は「他の言語に比べてリファクタや設計変更がしづらい」という話では?
誰も「ライフタイムが提供する安全性が間違ってる」なんてレスはしてないよ
安全性の保証は強力だけど、そのぶん生産性を低下させ得るデメリットもあるよねって話をしてるだけで
誰も「ライフタイムが提供する安全性が間違ってる」なんてレスはしてないよ
安全性の保証は強力だけど、そのぶん生産性を低下させ得るデメリットもあるよねって話をしてるだけで
174デフォルトの名無しさん
2024/08/13(火) 19:53:38.42ID:vwwzn05u >>172
あなたが「コンパイルが通ればそのコードは正しい」というとき、それは利用側と定義側を含むコード全体の正しさのことを言っているんだよね
でも例のブログ記事は、利用側のfn main()の本体に何が書かれていようと、定義側のfn next()はそれ単独で「正しい」か(≒プログラマの意図通りか)を考えられる前提で書かれているんですよ
つまりmain()でnext()を1回呼ぼうが2回呼ぼうが、next()は変えていないんだから想定する意図は変わらない
最初からnext()は間違っていたことが、main()を変えたことで明らかになった、と
そう思ってもう一回読んでみてね?
あなたが「コンパイルが通ればそのコードは正しい」というとき、それは利用側と定義側を含むコード全体の正しさのことを言っているんだよね
でも例のブログ記事は、利用側のfn main()の本体に何が書かれていようと、定義側のfn next()はそれ単独で「正しい」か(≒プログラマの意図通りか)を考えられる前提で書かれているんですよ
つまりmain()でnext()を1回呼ぼうが2回呼ぼうが、next()は変えていないんだから想定する意図は変わらない
最初からnext()は間違っていたことが、main()を変えたことで明らかになった、と
そう思ってもう一回読んでみてね?
175デフォルトの名無しさん
2024/08/13(火) 19:55:05.46ID:qGcIneKd Dioxusのチームもこのような記事を書いている
https://dioxus.notion.site/Dioxus-Labs-High-level-Rust-5fe1f1c9c8334815ad488410d948f05e
GitHub Acceleratorに選ばれるくらい有望なプロジェクトだし、間違いなくレベルの高い開発者が揃ってるチームけど、彼らですらRustの課題を指摘してるわけで
https://dioxus.notion.site/Dioxus-Labs-High-level-Rust-5fe1f1c9c8334815ad488410d948f05e
GitHub Acceleratorに選ばれるくらい有望なプロジェクトだし、間違いなくレベルの高い開発者が揃ってるチームけど、彼らですらRustの課題を指摘してるわけで
176デフォルトの名無しさん
2024/08/13(火) 19:56:59.13ID:6FUbHmIE >>173
ライフタイムをコンパイラがチェックしてくれることで生産性は低下ではなく上昇でしょ
全てのコードを人間がチェックし続けたりチェックし忘れて実行時デバッグとなることが生産性の低下ですね
さらにその参照バグにきづかないままだとセキュリティホールを招いてしまいますよ
ライフタイムをコンパイラがチェックしてくれることで生産性は低下ではなく上昇でしょ
全てのコードを人間がチェックし続けたりチェックし忘れて実行時デバッグとなることが生産性の低下ですね
さらにその参照バグにきづかないままだとセキュリティホールを招いてしまいますよ
177デフォルトの名無しさん
2024/08/13(火) 19:57:14.06ID:w/VnRva3 >>157
めっちゃ判りますωωω
めっちゃ判りますωωω
178デフォルトの名無しさん
2024/08/13(火) 20:05:14.94ID:d5oxWZvl >>174
最初のコードもコンパイラが通ってアサートも通って意図通りに動いている
次のコードはイテレータが返した値を保持したままイテレータを作動させられる仕様への変更 (今回の例は可能だが必ずしも仕様変更できるかどうかは別)
それぞれコンパイルが通れば意図通りに正しく動作している
最初のコードもコンパイラが通ってアサートも通って意図通りに動いている
次のコードはイテレータが返した値を保持したままイテレータを作動させられる仕様への変更 (今回の例は可能だが必ずしも仕様変更できるかどうかは別)
それぞれコンパイルが通れば意図通りに正しく動作している
179デフォルトの名無しさん
2024/08/13(火) 20:07:43.05ID:w/VnRva3 >>174
ほんそれ
ほんそれ
180デフォルトの名無しさん
2024/08/13(火) 21:30:24.68ID:vwwzn05u >>178
アサートも利用側のmain()にあるものなんだから、next()の呼び出し回数の話と同じで
ここからnext()についてのプログラマの想定を読み取ってたら、この記事が理解できないのは当然なんだってば
最初から理解する気が無くてそういう意地悪言ってるんじゃないよね?
修正後のプログラムの後に
> 今こうして前のプログラムを見返してみると、明らかに間違っていましたね。
って書いてあるんだから、これは仕様を変更したじゃなくて、最初から間違っていたのを修正したという体なんですよ
アサートも利用側のmain()にあるものなんだから、next()の呼び出し回数の話と同じで
ここからnext()についてのプログラマの想定を読み取ってたら、この記事が理解できないのは当然なんだってば
最初から理解する気が無くてそういう意地悪言ってるんじゃないよね?
修正後のプログラムの後に
> 今こうして前のプログラムを見返してみると、明らかに間違っていましたね。
って書いてあるんだから、これは仕様を変更したじゃなくて、最初から間違っていたのを修正したという体なんですよ
181デフォルトの名無しさん
2024/08/13(火) 21:51:35.56ID:d5oxWZvl >>180
一番最初に書いたようにその人の詭弁
後者の利用方法に対応する仕様にしたいならば最初からその後者用のアサートを入れたらよい
そうすれば一発でコンパイルエラーになって修正して終わり
ライフタイムに関してはコンパイルが通ればその利用方法については必ず正しい
コンパイルが通ったのに間違っていることはない
一番最初に書いたようにその人の詭弁
後者の利用方法に対応する仕様にしたいならば最初からその後者用のアサートを入れたらよい
そうすれば一発でコンパイルエラーになって修正して終わり
ライフタイムに関してはコンパイルが通ればその利用方法については必ず正しい
コンパイルが通ったのに間違っていることはない
182デフォルトの名無しさん
2024/08/13(火) 22:37:13.69ID:d5oxWZvl もう少しわかりやすい別の例を出すと
struct Foo(&str, &str);
このライフタイム注釈が無いのは当然エラーになるのは置いとくとして
struct Foo<'a>(&'a str, &'a str);
このように宣言しても多くの用途で困ることはなく
むしろこれで都合がよいこともある
つまりこの宣言方法はバグではない
そしてこれでコンパイルが通る範囲の利用方法をしていれば正しく動作する
しかし用途によっては上記では困りエラーとなる利用方法もある
そこで
struct Foo<'a, 'b>(&'a str, &'b str);
このように宣言することで新たな利用方法に対応が可能となる
こちらに変えてもそれでコンパイルが通る範囲の利用方法をしていれば正しく動作する
どちらのケースでもコンパイラが通せば各々の利用範囲でライフタイムの記述は正しい
コンパイラが通したのに間違っているなんてことは起きない
struct Foo(&str, &str);
このライフタイム注釈が無いのは当然エラーになるのは置いとくとして
struct Foo<'a>(&'a str, &'a str);
このように宣言しても多くの用途で困ることはなく
むしろこれで都合がよいこともある
つまりこの宣言方法はバグではない
そしてこれでコンパイルが通る範囲の利用方法をしていれば正しく動作する
しかし用途によっては上記では困りエラーとなる利用方法もある
そこで
struct Foo<'a, 'b>(&'a str, &'b str);
このように宣言することで新たな利用方法に対応が可能となる
こちらに変えてもそれでコンパイルが通る範囲の利用方法をしていれば正しく動作する
どちらのケースでもコンパイラが通せば各々の利用範囲でライフタイムの記述は正しい
コンパイラが通したのに間違っているなんてことは起きない
183デフォルトの名無しさん
2024/08/13(火) 22:44:00.39ID:vwwzn05u >>181
じゃあ別の切り口から
next()を単独で見てみようか
結局、問題の根本は戻り値のbyte(=&self.remainder[0])としてあり得る最大のlifetimeは'remainderなのに、それより小さい'mut_selfを指定してしまっていることだよね
trait実装の場合にはtraitの宣言に合わせるために実際より小さいlifetimeを指定しないといけない場合があるしれないが、この例は単なるミスで'mut_selfでなくてはいけない理由は特に無いということだった
このnext()の定義を単独で見て、おかしなところは本当に何も無いのか?
next()が正しくないということを示すために、main()の内容を考慮する必要が本当にあるのか?
別にコンパイルエラーになることをいちいち確認しなくても、「なんかおかしいなこれ」って早く気付いて修正できるならそのほうがいいでしょ、って個人的には思うけどね
じゃあ別の切り口から
next()を単独で見てみようか
結局、問題の根本は戻り値のbyte(=&self.remainder[0])としてあり得る最大のlifetimeは'remainderなのに、それより小さい'mut_selfを指定してしまっていることだよね
trait実装の場合にはtraitの宣言に合わせるために実際より小さいlifetimeを指定しないといけない場合があるしれないが、この例は単なるミスで'mut_selfでなくてはいけない理由は特に無いということだった
このnext()の定義を単独で見て、おかしなところは本当に何も無いのか?
next()が正しくないということを示すために、main()の内容を考慮する必要が本当にあるのか?
別にコンパイルエラーになることをいちいち確認しなくても、「なんかおかしいなこれ」って早く気付いて修正できるならそのほうがいいでしょ、って個人的には思うけどね
184デフォルトの名無しさん
2024/08/13(火) 22:54:24.44ID:d5oxWZvl185デフォルトの名無しさん
2024/08/13(火) 23:11:58.95ID:vwwzn05u >>184
ここまでのあなたの主張は正確に言えば「*十分に実際のユースケースを反映した利用側コードとともに* コンパイルが通ればライフタイムの記述は正しい」じゃないか
強い前提を置けば正しいと言える確度も高まって当然だろう
勝手に前提を変えて違う結論を導くのは、それこそ詭弁ではないか
ここまでのあなたの主張は正確に言えば「*十分に実際のユースケースを反映した利用側コードとともに* コンパイルが通ればライフタイムの記述は正しい」じゃないか
強い前提を置けば正しいと言える確度も高まって当然だろう
勝手に前提を変えて違う結論を導くのは、それこそ詭弁ではないか
186デフォルトの名無しさん
2024/08/13(火) 23:29:33.49ID:d5oxWZvl 利用方法とその範囲は各実際のケースで各々異なるのだよ
あらゆるケースを想定して対応することは必要ないだけでなく事実上無理なこともあるだろう
必要となるケースのみ対応すればよい
そして必要となるケースはプログラムとして書かれているかテストコードに書く
どのようなケースでもコンパイルが通ればその記述コードは正しい
コンパイルが通ったのに誤動作することは起きない
あらゆるケースを想定して対応することは必要ないだけでなく事実上無理なこともあるだろう
必要となるケースのみ対応すればよい
そして必要となるケースはプログラムとして書かれているかテストコードに書く
どのようなケースでもコンパイルが通ればその記述コードは正しい
コンパイルが通ったのに誤動作することは起きない
187デフォルトの名無しさん
2024/08/13(火) 23:29:58.94ID:vwwzn05u next()で戻り値のlifetimeを不必要に小さくしているのが、単独で見て「普通に考えるとおかしい」と言えるように
>>182の構造体の例も、「普通は」struct Foo<'a, 'b>(&'a str, &'b str);のように分けるべきだろう
例外は実際に.0も.1も同じStringの部分列であることを想定しているような、同じlifetimeを持つ参照から作ることが想定されている場合か、他にもあるかもしれんが
あと例の「Rustのライフタイムについてのよくある誤解」にもある通り、こういう具体的なメンバを想定したlifeitme in pathには'inputとか'bufとか説明的な名前を付けるべきである
そうすれば「あれ、よく考えたらこの.0と.1って同じlifetimeで本当にいいのか」ってことを、利用側でコンパイルエラーになるのを待たず考慮できるとは思わんのかね
'aみたいなテキトウな名前のlifetimeが許されるのは汎用的なコンテナくらいだろう、Iter<'a, T>とかRef<'a, T>とかCow<'a, T>とか
そういう嗅覚というか、経験知みたいな情報は誰も持ち合わせちゃいないのかね
>>182の構造体の例も、「普通は」struct Foo<'a, 'b>(&'a str, &'b str);のように分けるべきだろう
例外は実際に.0も.1も同じStringの部分列であることを想定しているような、同じlifetimeを持つ参照から作ることが想定されている場合か、他にもあるかもしれんが
あと例の「Rustのライフタイムについてのよくある誤解」にもある通り、こういう具体的なメンバを想定したlifeitme in pathには'inputとか'bufとか説明的な名前を付けるべきである
そうすれば「あれ、よく考えたらこの.0と.1って同じlifetimeで本当にいいのか」ってことを、利用側でコンパイルエラーになるのを待たず考慮できるとは思わんのかね
'aみたいなテキトウな名前のlifetimeが許されるのは汎用的なコンテナくらいだろう、Iter<'a, T>とかRef<'a, T>とかCow<'a, T>とか
そういう嗅覚というか、経験知みたいな情報は誰も持ち合わせちゃいないのかね
188デフォルトの名無しさん
2024/08/13(火) 23:36:10.30ID:Hu5uSedp 複オジに何を言ったところで時間の無駄
そろそろ気付いてね
そろそろ気付いてね
189デフォルトの名無しさん
2024/08/13(火) 23:40:06.70ID:d5oxWZvl 同じところで生まれるものしか取り扱わない場合にFoo<'a, 'b, 'c, 'd, 'e>とする必要はない
そこをFoo<'a>でコンパイルが通る使い方をしているならばFoo<'a>で正しい
どちらかが間違っているという変な考えを捨てよう
そこをFoo<'a>でコンパイルが通る使い方をしているならばFoo<'a>で正しい
どちらかが間違っているという変な考えを捨てよう
190デフォルトの名無しさん
2024/08/13(火) 23:46:03.09ID:vwwzn05u191デフォルトの名無しさん
2024/08/13(火) 23:55:49.36ID:LZM61rZJ >>175
読んだ
大雑把な要約
Rustは非常に素晴らしく成功しているがまだ改善できる点がある
一方で既存の言語には問題があり
他の新言語は社会的賛同が低い
そのため唯一の解決方法はRustをさらに改善に導くことである
そこで具体的な改善案を示す
読んだ
大雑把な要約
Rustは非常に素晴らしく成功しているがまだ改善できる点がある
一方で既存の言語には問題があり
他の新言語は社会的賛同が低い
そのため唯一の解決方法はRustをさらに改善に導くことである
そこで具体的な改善案を示す
192デフォルトの名無しさん
2024/08/14(水) 00:30:36.57ID:gAudIBvM >>187
> >>182の構造体の例も、「普通は」struct Foo<'a, 'b>(&'a str, &'b str);のように分けるべきだろう
> 例外は実際に.0も.1も同じStringの部分列であることを想定しているような、同じlifetimeを持つ参照から作ることが想定されている場合か、他にもあるかもしれんが
これについていえば、必要なのは「構造体は自身よりも寿命の短いデータへの参照を持たない」ことなので、基本的には Foo<'a> だけで済むと思う
fn func() {
let a: String = "foo".to_owned();
{
let b: String = "bar".to_owned();
{
let c = Foo{&a, &b};
}
}
}
これはaとbは違う寿命を持つけど、Fooとしては「c が生きているうちに a と b の寿命が尽きない」ことが保証されてれば良いだけなので、aとbの寿命の区別までは必要まではない
だからメンバーは Foo<'a> の寿命である &'a だけで済むという感じ
自分の認識違いだったらすまん
> >>182の構造体の例も、「普通は」struct Foo<'a, 'b>(&'a str, &'b str);のように分けるべきだろう
> 例外は実際に.0も.1も同じStringの部分列であることを想定しているような、同じlifetimeを持つ参照から作ることが想定されている場合か、他にもあるかもしれんが
これについていえば、必要なのは「構造体は自身よりも寿命の短いデータへの参照を持たない」ことなので、基本的には Foo<'a> だけで済むと思う
fn func() {
let a: String = "foo".to_owned();
{
let b: String = "bar".to_owned();
{
let c = Foo{&a, &b};
}
}
}
これはaとbは違う寿命を持つけど、Fooとしては「c が生きているうちに a と b の寿命が尽きない」ことが保証されてれば良いだけなので、aとbの寿命の区別までは必要まではない
だからメンバーは Foo<'a> の寿命である &'a だけで済むという感じ
自分の認識違いだったらすまん
193デフォルトの名無しさん
2024/08/14(水) 00:42:39.43ID:9bQ7P5cg 働け
194デフォルトの名無しさん
2024/08/14(水) 01:41:38.41ID:trbBeScR >>153
ライブラリが乱立してる点
ライブラリが乱立してる点
195デフォルトの名無しさん
2024/08/14(水) 02:10:03.49ID:/eVAI9ia >>194
まずasync/awaitはRustの標準機能
そして使われるFutureやPollやWakerなど各種はRustのcore標準ライブラリにありno_stdでも使える
asyncランタイムは用途ごとに適したものを自由に作ったり選んだり使える
標準的に使われるものはtokioがダウンロード10倍差で圧勝しており乱立と悩まなくていい
まずasync/awaitはRustの標準機能
そして使われるFutureやPollやWakerなど各種はRustのcore標準ライブラリにありno_stdでも使える
asyncランタイムは用途ごとに適したものを自由に作ったり選んだり使える
標準的に使われるものはtokioがダウンロード10倍差で圧勝しており乱立と悩まなくていい
196デフォルトの名無しさん
2024/08/14(水) 06:30:03.80ID:xnFjuNS8 >>164
ライフタイム注釈が間違っているのにコンパイルが通ってしまい正しく動作しない、というプログラム例を一つでも示せばよいのではないか?
そんな例は存在しないと思う
コンパイルが通ったらそのプログラムでライフタイム注釈は間違っていなくて正しく動作するよ
ライフタイム注釈が間違っているのにコンパイルが通ってしまい正しく動作しない、というプログラム例を一つでも示せばよいのではないか?
そんな例は存在しないと思う
コンパイルが通ったらそのプログラムでライフタイム注釈は間違っていなくて正しく動作するよ
197デフォルトの名無しさん
2024/08/14(水) 09:24:59.76ID:9a/DnTrG 挙げた手降ろせない子どもすごい増えたよな
折り合いつける知能もない
折り合いつける知能もない
198デフォルトの名無しさん
2024/08/14(水) 09:32:09.98ID:92pG5tQ9199デフォルトの名無しさん
2024/08/14(水) 10:02:37.51ID:jTlv+Rl8 Tokioが圧勝しているせいでtokio でしか使えないライブラリが出てきていて、tokioが終わったらRustのasyncもオワる状況
200デフォルトの名無しさん
2024/08/14(水) 10:09:25.77ID:LfKGsMNu tokio以外を考慮してるライブラリの方が少数派だろ
201デフォルトの名無しさん
2024/08/14(水) 10:09:58.25ID:OuxAzukv >>199
GAFMなどIT大手がtokio直接支持してるから不滅だよん
GAFMなどIT大手がtokio直接支持してるから不滅だよん
202デフォルトの名無しさん
2024/08/14(水) 10:12:07.88ID:jTlv+Rl8203デフォルトの名無しさん
2024/08/14(水) 10:21:35.01ID:OuxAzukv Rustに代わりうるプログラミング言語の芽すらないよん
IT大手各社が結束して同じ新言語を支持したのはRustが最初で最後かな~
IT大手各社が結束して同じ新言語を支持したのはRustが最初で最後かな~
204デフォルトの名無しさん
2024/08/14(水) 10:31:23.23ID:LfKGsMNu >>203
zig 1.0待ちだろ
zig 1.0待ちだろ
205デフォルトの名無しさん
2024/08/14(水) 10:45:06.96ID:OuxAzukv Rustより保証してくれることが減ってしまう言語は代わりにならないよん
206デフォルトの名無しさん
2024/08/14(水) 10:50:42.29ID:z6gmNdON 良いか悪いかよりも一貫しているかどうかが寿命を決める。
(いや、及第点程度には良いものである必要はあると思うけど。)
C がよい言語とはとても言えないけど皆が一貫して使ってたから価値あるものとして認められてたわけで。
プログラミング言語も言語だからね。
(いや、及第点程度には良いものである必要はあると思うけど。)
C がよい言語とはとても言えないけど皆が一貫して使ってたから価値あるものとして認められてたわけで。
プログラミング言語も言語だからね。
207デフォルトの名無しさん
2024/08/14(水) 10:51:49.79ID:VXEGQejB >>192
lifetimeって究極的には関数の引数と戻り値の間でのリソースの依存関係を示すものだから
FooのメソッドもFooを引数に取る関数も無いなら、どっちでもいいよとしかならんと思う
そして実際にメソッドや関数を定義するときになったら、別々になっていたほうが一番柔軟に指定できるから、第一選択としては分けておいたほうがいい、というのが俺の直感
>>196
「コンパイルが通ってしまい正しく動作しない、というプログラム」が作れてしまうことを問題にしているのではない
「コンパイルは通って正しく動作もするが、制約が強すぎるために使える状況が過剰に限定される関数」が作れてしまうということを問題にしている
だから前者の例を出すことに意味は無いし、あなたもよく知っている通りそれは実際できないだろう
そして「Rustのライフタイムに関するよくある誤解」5)のnext()は後者の問題を示す例になっている
>>196
trait Iteratorではそうなっていないけど、例のnext()が別のtraitのメソッドfn next<'a>(&'a self) -> Option<&'a u8>として宣言されていれば、実装側はそれに従わざるを得ない、と思ったけど
現実にそんなことが要求されることがあるか、と聞かれるとちょっと微妙かも
lifetimeって究極的には関数の引数と戻り値の間でのリソースの依存関係を示すものだから
FooのメソッドもFooを引数に取る関数も無いなら、どっちでもいいよとしかならんと思う
そして実際にメソッドや関数を定義するときになったら、別々になっていたほうが一番柔軟に指定できるから、第一選択としては分けておいたほうがいい、というのが俺の直感
>>196
「コンパイルが通ってしまい正しく動作しない、というプログラム」が作れてしまうことを問題にしているのではない
「コンパイルは通って正しく動作もするが、制約が強すぎるために使える状況が過剰に限定される関数」が作れてしまうということを問題にしている
だから前者の例を出すことに意味は無いし、あなたもよく知っている通りそれは実際できないだろう
そして「Rustのライフタイムに関するよくある誤解」5)のnext()は後者の問題を示す例になっている
>>196
trait Iteratorではそうなっていないけど、例のnext()が別のtraitのメソッドfn next<'a>(&'a self) -> Option<&'a u8>として宣言されていれば、実装側はそれに従わざるを得ない、と思ったけど
現実にそんなことが要求されることがあるか、と聞かれるとちょっと微妙かも
208デフォルトの名無しさん
2024/08/14(水) 12:46:04.27ID:9gU6ei1I zigは本当に最強
209デフォルトの名無しさん
2024/08/14(水) 13:07:18.24ID:HK0RNQ5P >>174
>> next()を1回呼ぼうが2回呼ぼうが、
Rustではその1回目のnext()の値を保持したまま2回目を使えるかどうかの違いが大きいんだよ
最初の仕様は各々の値が使えれることが確認できればいい仕様になっているね
assert_eq!(Some(&b'1'), bytes.next());
assert_eq!(None, bytes.next());
その次の仕様は1回目の値を持ったまま2回目の値を使える仕様になっているね
let byte_1 = bytes.next();
let byte_2 = bytes.next();
if byte_1 == byte_2 {
// 何かしらの処理
}
つまり拡大された別の仕様となっているわけだよ
そのため最初の仕様ではライフタイムがselfと同じでも全く問題ないけど
次の仕様ではselfと異なるものでないといけなくなる
そこが本質があってどちらの仕様も別のものとして存在しているわけよ
わかりやすく例を挙げて説明すると
次のように&[T]ではなくVec<T>を保持するバージョンに変えてみよう
>> next()を1回呼ぼうが2回呼ぼうが、
Rustではその1回目のnext()の値を保持したまま2回目を使えるかどうかの違いが大きいんだよ
最初の仕様は各々の値が使えれることが確認できればいい仕様になっているね
assert_eq!(Some(&b'1'), bytes.next());
assert_eq!(None, bytes.next());
その次の仕様は1回目の値を持ったまま2回目の値を使える仕様になっているね
let byte_1 = bytes.next();
let byte_2 = bytes.next();
if byte_1 == byte_2 {
// 何かしらの処理
}
つまり拡大された別の仕様となっているわけだよ
そのため最初の仕様ではライフタイムがselfと同じでも全く問題ないけど
次の仕様ではselfと異なるものでないといけなくなる
そこが本質があってどちらの仕様も別のものとして存在しているわけよ
わかりやすく例を挙げて説明すると
次のように&[T]ではなくVec<T>を保持するバージョンに変えてみよう
210デフォルトの名無しさん
2024/08/14(水) 13:08:44.09ID:HK0RNQ5P >>209の続き
相違点以外は元コードと同じ名前と形で書いています
struct ByteIter {
vec: Vec<u8>,
index: usize,
}
impl ByteIter {
fn next(&mut self) -> Option<&u8> {
if self.index >= self.vec.len() {
None
} else {
let byte = &self.vec[self.index];
self.index += 1;
Some(byte)
}
}
}
参照を持たなくなったので一見すると有利になっているように見えるけど
最初の仕様しか満たせなくなってる!
ところがこれはGATを用いたLending Iteratorでは当たり前の仕様なんだよ
つまり制限された間違った仕様というよりは別の仕様と捉えることもできるんじゃないかな
相違点以外は元コードと同じ名前と形で書いています
struct ByteIter {
vec: Vec<u8>,
index: usize,
}
impl ByteIter {
fn next(&mut self) -> Option<&u8> {
if self.index >= self.vec.len() {
None
} else {
let byte = &self.vec[self.index];
self.index += 1;
Some(byte)
}
}
}
参照を持たなくなったので一見すると有利になっているように見えるけど
最初の仕様しか満たせなくなってる!
ところがこれはGATを用いたLending Iteratorでは当たり前の仕様なんだよ
つまり制限された間違った仕様というよりは別の仕様と捉えることもできるんじゃないかな
211デフォルトの名無しさん
2024/08/14(水) 19:39:11.70ID:VXEGQejB >>209-210
「ByteIterはバイトのスライスを繰り返すイテレータです」
「今こうして前のプログラムを見返してみると、明らかに間違っていましたね」
とかの日本語で説明した文章をすべて無視して、コンパイルの通ったRustコードだけを正しいものとして「プログラマの意図」を見出そうとすると、そうなるんだね
どう考えるとそういう結論に至るのかはよく分かった
「ByteIterはバイトのスライスを繰り返すイテレータです」
「今こうして前のプログラムを見返してみると、明らかに間違っていましたね」
とかの日本語で説明した文章をすべて無視して、コンパイルの通ったRustコードだけを正しいものとして「プログラマの意図」を見出そうとすると、そうなるんだね
どう考えるとそういう結論に至るのかはよく分かった
212デフォルトの名無しさん
2024/08/14(水) 19:54:05.99ID:HK0RNQ5P213デフォルトの名無しさん
2024/08/14(水) 20:38:24.97ID:VXEGQejB 日本語を読めば分かるよ
新ネタ無さそうならもう終わりにしとくね
lending iteratorって発想は無かったから、そこだけは面白かったかもね
新ネタ無さそうならもう終わりにしとくね
lending iteratorって発想は無かったから、そこだけは面白かったかもね
214デフォルトの名無しさん
2024/08/14(水) 20:56:34.44ID:HK0RNQ5P >>213
最初のプログラムでイテレータの仕様を満たしており正しく動作していま
すよ
コードに問題はありません
その後に行われようとしているのはイテレータの仕様とは別の
以下を通す新たな仕様を満たすための拡張です
| let byte_1 = bytes.next();
| ----- first mutable borrow occurs here
| let byte_2 = bytes.next();
| ^^^^^ second mutable borrow occurs here
| if byte_1 == byte_2 {
| ------ first borrow later used here
両者を区別できていますか?
最初のプログラムでイテレータの仕様を満たしており正しく動作していま
すよ
コードに問題はありません
その後に行われようとしているのはイテレータの仕様とは別の
以下を通す新たな仕様を満たすための拡張です
| let byte_1 = bytes.next();
| ----- first mutable borrow occurs here
| let byte_2 = bytes.next();
| ^^^^^ second mutable borrow occurs here
| if byte_1 == byte_2 {
| ------ first borrow later used here
両者を区別できていますか?
215デフォルトの名無しさん
2024/08/14(水) 23:52:37.44ID:glbfXLC+ 最初のプログラムは関連型のItemを定義できないからIteratorの仕様を満たせないだろ
type Item = &'a u8;
だと拡張(というか修正)した方のコードになる
「正しい」の意味が噛み合ってないことに気付こう
type Item = &'a u8;
だと拡張(というか修正)した方のコードになる
「正しい」の意味が噛み合ってないことに気付こう
216デフォルトの名無しさん
2024/08/14(水) 23:59:55.13ID:orQgr5Ob 結局>>157の記事は破綻してるんだな
イテレータをstd::iter::Iteratorだけを指す狭い意味に取ると
その記事の最初の&u8をItemにした時点でコンパイルエラーとなるから記事は破綻
イテレータを広い意味にとってその記事の方法でもOKとすると
最初の実装でイテレータとしての機能は満たしていて
それを&'a u8にする必要はなくなり記事は破綻
イテレータをstd::iter::Iteratorだけを指す狭い意味に取ると
その記事の最初の&u8をItemにした時点でコンパイルエラーとなるから記事は破綻
イテレータを広い意味にとってその記事の方法でもOKとすると
最初の実装でイテレータとしての機能は満たしていて
それを&'a u8にする必要はなくなり記事は破綻
217デフォルトの名無しさん
2024/08/15(木) 00:04:11.15ID:JUA9dFMu 「コンパイルが通ったならばライフタイムの記述は正しい」で常に合ってるのに、
それがいかにも間違ってるかのように仕立て装うから矛盾が出てる感じ。
それがいかにも間違ってるかのように仕立て装うから矛盾が出てる感じ。
218デフォルトの名無しさん
2024/08/15(木) 13:27:43.17ID:TpdjcC5K Rustは良い言語だと思うけど
清書用だね
清書用だね
219デフォルトの名無しさん
2024/08/15(木) 14:13:48.29ID:ntgKOifP 他の言語よりバージョン管理(git)の技術が問われる気がする
全体の整合性が求められるから個人開発でもまじめにブランチ使わないとしんどい
全体の整合性が求められるから個人開発でもまじめにブランチ使わないとしんどい
220デフォルトの名無しさん
2024/08/15(木) 14:43:48.85ID:vVr6IPen221デフォルトの名無しさん
2024/08/15(木) 15:14:57.56ID:Q4hz384o Rustはコンパイル通らないと嫌な気持ちになるから整合性が必要
動的言語はバグってても笑えるから整合性は不要
動的言語はバグってても笑えるから整合性は不要
222デフォルトの名無しさん
2024/08/15(木) 15:28:46.91ID:bVAhHZZX >>218
Rustはリファクタリングに適していて
そのプログラムの本質のロジック以外のほとんどのミスをコンパイルエラーにしてくれるから
いきなり書き出し始めていってもなんとかなるよ
同じ機能が出てきた時点でtraitにして重複コードがあればそのprovided methodにするとかね
Rustはリファクタリングに適していて
そのプログラムの本質のロジック以外のほとんどのミスをコンパイルエラーにしてくれるから
いきなり書き出し始めていってもなんとかなるよ
同じ機能が出てきた時点でtraitにして重複コードがあればそのprovided methodにするとかね
223デフォルトの名無しさん
2024/08/15(木) 15:33:22.56ID:ntgKOifP 「全体の整合性が求められるから」は「全体の整合性をコンパイラにチェックされるから」に読み替えてくれ
コンパイル通らないと嫌な気持ちになる以前にテストできないだろw
コンパイル通らないと嫌な気持ちになる以前にテストできないだろw
224デフォルトの名無しさん
2024/08/15(木) 16:10:36.88ID:bOFVyCO2 モノリシックな巨大なコードを作らずにクレイトに分けよう
クレイト毎にコンパイルできる
クレイト毎にコンパイルできる
225デフォルトの名無しさん
2024/08/15(木) 16:13:34.27ID:gPssFbVF 自分だけかもしれないけど、新規にコードを書くとき/リファクタするときにエディタにワーニングが表示された状態になるのが精神的に負荷がかかるんだよね
だから新しく作ったファイルの先頭でまず #![allow(dead_code)] するね…
(ある程度コードができてきたら取り払うけど)
だから新しく作ったファイルの先頭でまず #![allow(dead_code)] するね…
(ある程度コードができてきたら取り払うけど)
226デフォルトの名無しさん
2024/08/15(木) 16:23:19.81ID:gPssFbVF >>218
分野によってはそう思う
探索的なデータ分析をするとか画像処理のアルゴリズムを考えるとか、そういう場面だとPython等で試してからRust等に移植というのは分かる
「書いて捨てる」を前提にするにはRustはやや重い
分野によってはそう思う
探索的なデータ分析をするとか画像処理のアルゴリズムを考えるとか、そういう場面だとPython等で試してからRust等に移植というのは分かる
「書いて捨てる」を前提にするにはRustはやや重い
227デフォルトの名無しさん
2024/08/15(木) 16:53:43.32ID:afsyCbP1 それはPythonに慣れてるだけじゃないか?
Python使ったことない人でもそうなるわけではない
Python使ったことない人でもそうなるわけではない
228デフォルトの名無しさん
2024/08/15(木) 17:04:07.16ID:WFExrDMY コンパイルワーニングやエラーが負荷になる人は動的言語でのテストファーストな開発も負荷になりそうだね。
229デフォルトの名無しさん
2024/08/15(木) 17:18:57.30ID:gPssFbVF 慣れというのは否定しないけど、そもそもコンパイル必要な言語とそうでない言語の違いだな
コード書いて Ctrl + S で保存すればすぐに変更後の動作を試せるのは大きい
特にRustなんてコンパイル時間長いんだし
書き捨てる前提の実験的なコードで完璧を目指すものでもないでしょ
コード書いて Ctrl + S で保存すればすぐに変更後の動作を試せるのは大きい
特にRustなんてコンパイル時間長いんだし
書き捨てる前提の実験的なコードで完璧を目指すものでもないでしょ
230デフォルトの名無しさん
2024/08/15(木) 17:31:23.55ID:2Mk02GNe そんなにコンパイル言語が嫌いなら使うな
このスレから永久に出ていけ
このスレから永久に出ていけ
231デフォルトの名無しさん
2024/08/15(木) 17:40:55.12ID:gPssFbVF 自分は用途によっては他の言語も使うとしか書いてないんだが
宗教的あるいは能力的に一つの言語しか使えないんです?
宗教的あるいは能力的に一つの言語しか使えないんです?
232デフォルトの名無しさん
2024/08/15(木) 17:53:40.88ID:KHsgBa/H 特性の真逆なスクリプト言語と比較しても既知の話ばかりで新たな知見も情報も得られないからなあ
ノイズとなるだけのスクリプト言語との比較の話は禁止しようぜ
やりたい人は別スレを立ててやればいい
ノイズとなるだけのスクリプト言語との比較の話は禁止しようぜ
やりたい人は別スレを立ててやればいい
233デフォルトの名無しさん
2024/08/15(木) 18:21:12.60ID:gPssFbVF 自分が言いたかったのは「Rustは清書用」というレスへの同意だけなんだよな
特定の言語を推したり比較したりしたいわけではなく
これ以上の話はスレチになりそうだからやめとく
特定の言語を推したり比較したりしたいわけではなく
これ以上の話はスレチになりそうだからやめとく
234デフォルトの名無しさん
2024/08/15(木) 18:25:33.11ID:IG6WI0D2 俺はRustの方が慣れてるため最初からRust使うので慣れの問題だと思う
235デフォルトの名無しさん
2024/08/15(木) 18:46:44.09ID:OZNxhJTv スクリプト言語で下書きするっていっても直和型もないような言語だと
Rustで清書するときにデータ構造からやり直しだし
どういう言語を想定してるんだろ
TSとか?
Rustで清書するときにデータ構造からやり直しだし
どういう言語を想定してるんだろ
TSとか?
236デフォルトの名無しさん
2024/08/15(木) 18:58:18.84ID:OZNxhJTv 画像処理みたいな純粋なアルゴリズムの検討ならあまりそういう問題はないだろうけど
単なる数値計算なら別に最初からRustでいいと思うんだよな
DLみたいに既存のフレームワーク使うためにPythonで検討したいとかなら分かるんだけど
単なる数値計算なら別に最初からRustでいいと思うんだよな
DLみたいに既存のフレームワーク使うためにPythonで検討したいとかなら分かるんだけど
237デフォルトの名無しさん
2024/08/15(木) 18:59:39.70ID:gPssFbVF アプリ全体の設計レベルだと流石に下書きなんてしないと思う
あくまでも部分的な話で、例えば画像処理なんかだと整数または小数型の多次元配列だけ扱えれば良いので
あくまでも部分的な話で、例えば画像処理なんかだと整数または小数型の多次元配列だけ扱えれば良いので
238デフォルトの名無しさん
2024/08/15(木) 19:32:04.42ID:+y/e/IpZ RustやC++で書かれたライブラリを呼び出すだけの話ならばどの言語でも同じだから議論の意味ない
そうではなく自分でプログラムを組んで実行するなら最初からRustで書けば高速実行できる
そうではなく自分でプログラムを組んで実行するなら最初からRustで書けば高速実行できる
239デフォルトの名無しさん
2024/08/15(木) 20:01:33.38ID:mLyUPHca 実験的な変更の波及範囲が広いんだよね
エラーの種類を増やすためにenum ErrorKindに新しい要素を追加したらErrorKindをmatchで網羅してるDisplayの修正も必要になるとか
最終的には必要な変更だから修正漏れを防ぐ意味では助かるけど一時的な変更だとちょっと大変
バージョン管理が適当だと戻すのも面倒になる
エラーの種類を増やすためにenum ErrorKindに新しい要素を追加したらErrorKindをmatchで網羅してるDisplayの修正も必要になるとか
最終的には必要な変更だから修正漏れを防ぐ意味では助かるけど一時的な変更だとちょっと大変
バージョン管理が適当だと戻すのも面倒になる
240デフォルトの名無しさん
2024/08/15(木) 20:17:28.56ID:cCrv94Lj >>239
thiserrorを使いなさい
thiserrorを使いなさい
241デフォルトの名無しさん
2024/08/15(木) 22:15:21.69ID:nyOB87vc 不満を言う人は単なる不慣れとそれによる知識不足という感じですねー
242デフォルトの名無しさん
2024/08/15(木) 22:23:50.08ID:J+lHdaYT 慣れてくるとサボり方も分かってくるからあまり困らんよね
とりあえずunwrapやtodo!多用してメインのパスだけ作ってしまうみたいなのはよくやる
とりあえずunwrapやtodo!多用してメインのパスだけ作ってしまうみたいなのはよくやる
243デフォルトの名無しさん
2024/08/16(金) 01:41:31.76ID:n83uLnGm で、Rustのコンパイル時間は改善されてるのかい?
244デフォルトの名無しさん
2024/08/16(金) 08:44:44.18ID:AlUb7wqr >>242
あとはclone連打したりBoxに入れたり
あとはclone連打したりBoxに入れたり
245デフォルトの名無しさん
2024/08/16(金) 11:16:32.52ID:NCq9ClXr cargo build とかで rustc にオプションを渡すにはどうすれば良いですか
特定の hoge.rs に対してだけ出来ると有難いです
特定の hoge.rs に対してだけ出来ると有難いです
246デフォルトの名無しさん
2024/08/16(金) 11:33:25.98ID:aaHau8VO clone減らしても結局処理速度変わらなかったりする
247デフォルトの名無しさん
2024/08/16(金) 11:41:08.16ID:ig7l4HYj >>245
cargo rustcかRUSTFLAGS
cargo rustcかRUSTFLAGS
248デフォルトの名無しさん
2024/08/16(金) 13:42:33.29ID:PUHP0I+b >>244
おまえらのために作ったった
// お手軽グローバル変数キット
#[macro_use]
mod x {
pub struct X<T>(pub std::sync::LazyLock<std::sync::Mutex<T>>);
#[macro_export]
macro_rules! x_init { ($x:expr) => { X(std::sync::LazyLock::new(|| std::sync::Mutex::new($x))) } }
#[macro_export]
macro_rules! x { ($x:ident) => (*($x.0.lock().unwrap())) }
}
use x::X;
// グローバル変数の宣言の仕方
static FOO: X<i32> = x_init!(999);
static BAR: X<Vec<i32>> = x_init!(vec![1, 2, 3]);
// グローバル変数の使い方
fn main_() {
x!(FOO) += 1;
assert_eq!(x!(FOO), 1000);
x!(BAR).push(777);
assert_eq!(x!(BAR), [1, 2, 3, 777]);
}
おまえらのために作ったった
// お手軽グローバル変数キット
#[macro_use]
mod x {
pub struct X<T>(pub std::sync::LazyLock<std::sync::Mutex<T>>);
#[macro_export]
macro_rules! x_init { ($x:expr) => { X(std::sync::LazyLock::new(|| std::sync::Mutex::new($x))) } }
#[macro_export]
macro_rules! x { ($x:ident) => (*($x.0.lock().unwrap())) }
}
use x::X;
// グローバル変数の宣言の仕方
static FOO: X<i32> = x_init!(999);
static BAR: X<Vec<i32>> = x_init!(vec![1, 2, 3]);
// グローバル変数の使い方
fn main_() {
x!(FOO) += 1;
assert_eq!(x!(FOO), 1000);
x!(BAR).push(777);
assert_eq!(x!(BAR), [1, 2, 3, 777]);
}
249デフォルトの名無しさん
2024/08/16(金) 14:04:22.59ID:l1JK1BDI 純粋な質問だけどマクロ使わずにできる?
以下のような感じに
static x: X<中身の型> = X::new(初期化式);
assert_eq!(&x, 中身の型と比較可能な値);
x.do_something(); // メソッド呼び出し
以下のような感じに
static x: X<中身の型> = X::new(初期化式);
assert_eq!(&x, 中身の型と比較可能な値);
x.do_something(); // メソッド呼び出し
250デフォルトの名無しさん
2024/08/16(金) 14:20:39.96ID:PUHP0I+b >>249
Mutexへの参照を持つMutexGuardを持つスコープ内でしかDerefできない
つまりメソッドを定義してDerefした結果の参照を返すのは無理
この仕組みにより参照をスコープ外へ持ち出せなくしていることが肝
ただしMutexGuardを返すメソッドは実現できる
その場合は自分でDerefして使うことになる
それにより具体的には *Foo.x() += 1; として使うメソッドx(&self)は実現可能
Mutexへの参照を持つMutexGuardを持つスコープ内でしかDerefできない
つまりメソッドを定義してDerefした結果の参照を返すのは無理
この仕組みにより参照をスコープ外へ持ち出せなくしていることが肝
ただしMutexGuardを返すメソッドは実現できる
その場合は自分でDerefして使うことになる
それにより具体的には *Foo.x() += 1; として使うメソッドx(&self)は実現可能
251デフォルトの名無しさん
2024/08/16(金) 14:28:26.26ID:2XNA/Shu >>249
それだけならできるよ
それだけならできるよ
252デフォルトの名無しさん
2024/08/16(金) 14:28:39.39ID:aaHau8VO >>248
こんなのZigならcomptime付ければ解決だろ
こんなのZigならcomptime付ければ解決だろ
253デフォルトの名無しさん
2024/08/16(金) 14:43:23.29ID:/FTYasP4 >>252
グローバル変数、すなわち、タスクやスレッドが排他制御して安全に扱える話をしているところで、comptime??
グローバル変数、すなわち、タスクやスレッドが排他制御して安全に扱える話をしているところで、comptime??
254デフォルトの名無しさん
2024/08/16(金) 15:12:00.16ID:l1JK1BDI Rustでもコンパイル時に作れるものは簡単にグローバルな定数にできる
問題なのは HashMap みたいなヒープを使うもので、LazyLockが必要になるのもほぼこのようなもののためだと思う
初期化した以降は不変な操作しかしない定数のような使い方をする場合でもMutexが必要なのは仕方ないという感じなのか
問題なのは HashMap みたいなヒープを使うもので、LazyLockが必要になるのもほぼこのようなもののためだと思う
初期化した以降は不変な操作しかしない定数のような使い方をする場合でもMutexが必要なのは仕方ないという感じなのか
255デフォルトの名無しさん
2024/08/16(金) 15:14:27.12ID:l1JK1BDI256デフォルトの名無しさん
2024/08/16(金) 15:20:06.84ID:PUHP0I+b >>254
読み出しだけならMutexは不要
static READ_ONLY: LazyLock<Vec<i32>> = LazyLock::new(|| vec![1, 2, 3]);
assert_eq!(*READ_ONLY, [1, 2, 3]);
読み出しだけならMutexは不要
static READ_ONLY: LazyLock<Vec<i32>> = LazyLock::new(|| vec![1, 2, 3]);
assert_eq!(*READ_ONLY, [1, 2, 3]);
257デフォルトの名無しさん
2024/08/16(金) 17:40:52.16ID:n/S+hvuh LazyLockは油断するとデッドロックの要因になりそうだな
初期化が単純なうちはいいけど
初期化が単純なうちはいいけど
258デフォルトの名無しさん
2024/08/16(金) 18:31:48.52ID:/FTYasP4 LazyLockは排他制御をRust1.0からあるstd::sys::Onceに任せている
その部分はOS依存だが例えばLinuxなどの場合、
未初期化か初期化中か初期化済かなどの状態を示すatomic整数で管理している
そして初期化実行は最初のスレッドのみで起きてそこでの競合は起きないことを保証している
一方で、あるLazyLock利用変数Aの初期化関数で資源Xを利用している時に、
資源Xをロックしたままの状態でその変数Aに最初にアクセスすればデッドロックとなりうる
これは一般的な話と同じなので今回特有の問題ではない
いわゆる資源ロック優先順序付けをA>Xとするだけで回避できる
ちなみに、LazyLock初期化後のT読み出し追加コストはその状態整数を見ることだけになり、
「初期化済」状態でずっと変わらないため分岐予測もおそらくずっと成功
そのためコストは気にせずに使える
その部分はOS依存だが例えばLinuxなどの場合、
未初期化か初期化中か初期化済かなどの状態を示すatomic整数で管理している
そして初期化実行は最初のスレッドのみで起きてそこでの競合は起きないことを保証している
一方で、あるLazyLock利用変数Aの初期化関数で資源Xを利用している時に、
資源Xをロックしたままの状態でその変数Aに最初にアクセスすればデッドロックとなりうる
これは一般的な話と同じなので今回特有の問題ではない
いわゆる資源ロック優先順序付けをA>Xとするだけで回避できる
ちなみに、LazyLock初期化後のT読み出し追加コストはその状態整数を見ることだけになり、
「初期化済」状態でずっと変わらないため分岐予測もおそらくずっと成功
そのためコストは気にせずに使える
259デフォルトの名無しさん
2024/08/17(土) 01:30:12.83ID:OMSBWIoV 小さなTauri v1アプリをv2 RCにアップグレードしたら
リリースビルドのファイルサイズが2倍になったんだが
ファイルサイズ小さいのが売りじゃなかったのか?
6MBが12MBになったぞ
リリースビルドのファイルサイズが2倍になったんだが
ファイルサイズ小さいのが売りじゃなかったのか?
6MBが12MBになったぞ
260デフォルトの名無しさん
2024/08/17(土) 13:50:23.56ID:kywszD5m TauriのことはJavaScript/TypeScriptスレでやれよ
261デフォルトの名無しさん
2024/08/17(土) 14:00:58.13ID:w43wc/GB >>260
Rust のバイナリにリンクする部分は Rust の話じゃね?
Rust のバイナリにリンクする部分は Rust の話じゃね?
262デフォルトの名無しさん
2024/08/17(土) 14:22:14.92ID:wXTvB1/z もしRustやRustの汎用ライブラリのバージョンを変えてバイナリサイズが増えたのならRustの話なのでここでやればいい
しかしアプリのバージョンを変えてサイズが増えたのだからアプリの話であってRustスレで語ることはなにもない
しかしアプリのバージョンを変えてサイズが増えたのだからアプリの話であってRustスレで語ることはなにもない
263デフォルトの名無しさん
2024/08/17(土) 14:27:21.91ID:OMSBWIoV もしかしてTauriがRustのライブラリだと知らない人?
264デフォルトの名無しさん
2024/08/17(土) 14:30:56.85ID:G1OfNx36 Rustに問題があると読めそうな文章なら手段を選ばずに排除する人
265デフォルトの名無しさん
2024/08/17(土) 15:23:05.55ID:Qf5pJUWp rustコードをコンパイルしたwasmバイナリが増えたってこと?
266デフォルトの名無しさん
2024/08/17(土) 15:45:50.91ID:EpylkaBR >>265
Tauriは各OSの他のアプリと同様に各ネイティブで動作するためwasmは関係ない
TauriはWebブラウザと同じ立場なので同様にJavaScriptとwasmが使えるが
そこでのwasmのコードはどのWebブラウザやTauriからも独立していて関係がない
Tauriは各OSの他のアプリと同様に各ネイティブで動作するためwasmは関係ない
TauriはWebブラウザと同じ立場なので同様にJavaScriptとwasmが使えるが
そこでのwasmのコードはどのWebブラウザやTauriからも独立していて関係がない
267デフォルトの名無しさん
2024/08/17(土) 15:53:49.31ID:bT3U9dm8 tauriはネイティブ部分とwebviewでプロセス間通信させて動いてるんだっけか
268デフォルトの名無しさん
2024/08/17(土) 15:55:16.69ID:w43wc/GB tauri は基本的にはその環境にあるウェブコントロールを使う。
生成される実行ファイルにリンクされるのは外部のウェブコントロールとの橋渡しに過ぎないからそんなに大きくないはずなのに……なんで?
っていう話。
生成される実行ファイルにリンクされるのは外部のウェブコントロールとの橋渡しに過ぎないからそんなに大きくないはずなのに……なんで?
っていう話。
269デフォルトの名無しさん
2024/08/17(土) 16:01:00.63ID:zPjNywzn tauriは糞
270デフォルトの名無しさん
2024/08/17(土) 16:05:04.51ID:K84lbgy4 TauriはGUI以外のロジックをTS/JS側で書くかRust側で書くかみたいな話もあるよな
271デフォルトの名無しさん
2024/08/17(土) 16:32:34.13ID:b7Mo3s6c >>268
ウェブコントロールなんて分かりづらい言葉を使わずにWebViewと言ってくれ
ウェブコントロールなんて分かりづらい言葉を使わずにWebViewと言ってくれ
272デフォルトの名無しさん
2024/08/17(土) 16:36:42.10ID:dIGhUzjt >>261
numpyのバージョン上げたら動かなくなったなどと言ってpythonやnumpyのスレではなくCのスレに乗り込んでるようなもんだぞ
numpyのバージョン上げたら動かなくなったなどと言ってpythonやnumpyのスレではなくCのスレに乗り込んでるようなもんだぞ
273デフォルトの名無しさん
2024/08/17(土) 16:47:26.11ID:YqZ4otqM https://tauri.app/v1/guides/building/app-size/
Tauri v1のページだけど、ここに書いてある手法自体はたぶんv2でも有効だから比較調査してみるとよし
Tauri v1のページだけど、ここに書いてある手法自体はたぶんv2でも有効だから比較調査してみるとよし
274デフォルトの名無しさん
2024/08/17(土) 16:50:47.17ID:K84lbgy4 >>272
TauriはRust部分もちゃんと使うフレームワークだぞ
アプリとして必要な処理をRustで書いてそれをJS/TSから呼んだり、データをRust側とフロント側で受け渡したりできる
ほぼTS/JSだけで書くこともできるけど、逆にUI以外のロジックはRustをメインに書くといった使い方もできる
実際のプロジェクトでどう使われてるのかは自分も知らないけど
TauriはRust部分もちゃんと使うフレームワークだぞ
アプリとして必要な処理をRustで書いてそれをJS/TSから呼んだり、データをRust側とフロント側で受け渡したりできる
ほぼTS/JSだけで書くこともできるけど、逆にUI以外のロジックはRustをメインに書くといった使い方もできる
実際のプロジェクトでどう使われてるのかは自分も知らないけど
275デフォルトの名無しさん
2024/08/17(土) 16:53:38.16ID:bEXpluCi 一般的にバイナリサイズは動的リンクの共有ライブラリの使用が多ければその分だけ小さくなり逆は大きくなる
だからバイナリサイズとプログラム全体のサイズは関係がない
そのver.1とver.2でバイナリに含まれていないライブラリの変化を調べて違いを投稿してください
だからバイナリサイズとプログラム全体のサイズは関係がない
そのver.1とver.2でバイナリに含まれていないライブラリの変化を調べて違いを投稿してください
276デフォルトの名無しさん
2024/08/17(土) 16:55:44.18ID:K84lbgy4 ビルドはCargoを使うし、「生成されたバイナリが大きい」みたいな問題もRustのカテゴリーで良い思う
フロント側に使ってるReactやVueについての質問ならJS/TSスレで聞くべきだけど
フロント側に使ってるReactやVueについての質問ならJS/TSスレで聞くべきだけど
277デフォルトの名無しさん
2024/08/17(土) 17:04:38.57ID:tGKWZUAz >「生成されたバイナリが大きい」みたいな問題もRustのカテゴリーで良い思う
意味わからんわwww
意味わからんわwww
278デフォルトの名無しさん
2024/08/17(土) 17:19:21.92ID:K84lbgy4 解決するかはともかく、質問先としてはJavascriptスレよりはRustスレの方が回答してもらえる可能性が高いじゃん
公式のリポジトリのissue見ろって話になるかもしれないけど
公式のリポジトリのissue見ろって話になるかもしれないけど
279デフォルトの名無しさん
2024/08/17(土) 17:24:48.12ID:K84lbgy4 >>259のレスを見落としてるせいでバイナリサイズの話が唐突な話に見えてるのだったらすまん
280デフォルトの名無しさん
2024/08/17(土) 17:35:27.19ID:bEXpluCi まずは動的リンクしているライブラリの変化を調べなよ
例えばもしそれが減ってるなら
依存していた外部ライブラリの不自由さから解放されて状況が良くなっている話の可能性もある
例えばもしそれが減ってるなら
依存していた外部ライブラリの不自由さから解放されて状況が良くなっている話の可能性もある
281デフォルトの名無しさん
2024/08/17(土) 17:40:36.43ID:SISNcxTZ 普通にissueで報告したらええやん
Rustのバージョンもビルド方法もビルドオプションも変えてないんやろ?
Rustのバージョンもビルド方法もビルドオプションも変えてないんやろ?
282デフォルトの名無しさん
2024/08/17(土) 17:47:51.42ID:co5P0ZaQ283デフォルトの名無しさん
2024/08/17(土) 18:16:28.63ID:OMSBWIoV 試しにTauri v1とv2-RCのscaffold同士で比較してみる
共にWindows 11のrustc 1.80.1 (x86_64-pc-windows-msvc)で
フロントエンドはnpm/Vanilla/TypeScriptを選択する
# v1
cargo create-tauri-app
npm run tauri build
src-tauri\target\release\v1-test.exe 5,271 KB
# v2
cargo create-tauri-app --rc
npm run tauri build
src-tauri\target\release\v2rc-test.exe 10,076 KB
やっぱりv2の方が2倍ぐらい大きいんじゃないの?
共にWindows 11のrustc 1.80.1 (x86_64-pc-windows-msvc)で
フロントエンドはnpm/Vanilla/TypeScriptを選択する
# v1
cargo create-tauri-app
npm run tauri build
src-tauri\target\release\v1-test.exe 5,271 KB
# v2
cargo create-tauri-app --rc
npm run tauri build
src-tauri\target\release\v2rc-test.exe 10,076 KB
やっぱりv2の方が2倍ぐらい大きいんじゃないの?
284デフォルトの名無しさん
2024/08/17(土) 18:41:27.25ID:I1dGWckH 今も小さい方のバイナリも生成できていることから
Rustとは無関係な話であると切り分けできてよかったね
Rustとは無関係な話であると切り分けできてよかったね
285デフォルトの名無しさん
2024/08/17(土) 18:46:42.10ID:AaqttF5e tauriのことはjavascriptの範囲 (キリッ)
って書いてたやつが的外れなのは変わらない
って書いてたやつが的外れなのは変わらない
286デフォルトの名無しさん
2024/08/17(土) 19:34:46.59ID:w2zHmV9M 全部issueで聞くべきなのでこのスレは存在意義がないんだよね
287デフォルトの名無しさん
2024/08/17(土) 21:17:58.40ID:WUwor7aX tauri2で
cargo tauri android init
cargo tauri android dev
ってやったらエミュレーターでスプラッシュ画面までは出るんだけど
コンテンツのところで↓みたいなエラーになるんだけど試した人いる?
error sending request for url
(http://127.0.01:1430/)
cargo tauri android init
cargo tauri android dev
ってやったらエミュレーターでスプラッシュ画面までは出るんだけど
コンテンツのところで↓みたいなエラーになるんだけど試した人いる?
error sending request for url
(http://127.0.01:1430/)
288デフォルトの名無しさん
2024/08/17(土) 21:22:36.94ID:bEXpluCi >>286
アドバイスしても反応ないからもういいのだろう
アドバイスしても反応ないからもういいのだろう
289デフォルトの名無しさん
2024/08/17(土) 21:26:19.66ID:OMSBWIoV Tauri v1もv2も動的リンクしているライブラリはいっしょだよ
290デフォルトの名無しさん
2024/08/17(土) 21:28:39.15ID:I1dGWckH Rustの話ならともかく
Rust製の個別のアプリの話は知ってる人がたまたまいたらラッキー
他の言語のスレでも同じ
Rust製の個別のアプリの話は知ってる人がたまたまいたらラッキー
他の言語のスレでも同じ
291デフォルトの名無しさん
2024/08/17(土) 22:26:04.77ID:Lg9B4E9Y >>290
>他の言語のスレでも同じ
同じじゃないでしょ
君はvscodeがTypeScript製だからといって
バージョンアップで問題が発生したら
TypeScriptスレに書き込みするのかい?
Tauriでもバックエンドやプラグイン開発の話ならわかるんだけどさ
>他の言語のスレでも同じ
同じじゃないでしょ
君はvscodeがTypeScript製だからといって
バージョンアップで問題が発生したら
TypeScriptスレに書き込みするのかい?
Tauriでもバックエンドやプラグイン開発の話ならわかるんだけどさ
292デフォルトの名無しさん
2024/08/17(土) 22:55:19.71ID:I1dGWckH Rust言語自体の話以外は
もし誰からの反応が無くても当然だから
反応が来ることをアテにするな、という意味だぞ
一方でTauriはRustのクレイトの一つだから
ここで話題にすること自体は全く問題がない
version 2.0の人柱なんてレアな話に誰も反応がなくて当たり前
もし誰からの反応が無くても当然だから
反応が来ることをアテにするな、という意味だぞ
一方でTauriはRustのクレイトの一つだから
ここで話題にすること自体は全く問題がない
version 2.0の人柱なんてレアな話に誰も反応がなくて当たり前
293デフォルトの名無しさん
2024/08/17(土) 23:48:49.41ID:Isu8e7gT WebでのWasmバイナリなら各利用者ブラウザによるリアルタイムのダウンロードとなりサイズを気にするけど、
WebブラウザやTauriアプリのバイナリのサイズはどうでもいいって立場。
WebブラウザやTauriアプリのバイナリのサイズはどうでもいいって立場。
294デフォルトの名無しさん
2024/08/18(日) 01:26:09.33ID:c9N8aWZH 倍といっても所詮は 5MB 増しでしかないならたいしたことではないとは言えるが……。
でも益なく増えてるのなら改善が望ましいのは確かだし、益があるならどんな益なのか知っておきたくもあるよ。
でも益なく増えてるのなら改善が望ましいのは確かだし、益があるならどんな益なのか知っておきたくもあるよ。
295デフォルトの名無しさん
2024/08/18(日) 02:36:20.00ID:BU3f2kLL 複おじに振り回されっ放しのバカばっか
296デフォルトの名無しさん
2024/08/18(日) 08:12:37.69ID:7bUmcmUR >>283
そのexeは解凍できないん?中にjs/ts要素と一緒にリンクライブラリが入っとるだろうからそれ比較すればと思った
そのexeは解凍できないん?中にjs/ts要素と一緒にリンクライブラリが入っとるだろうからそれ比較すればと思った
297デフォルトの名無しさん
2024/08/18(日) 13:27:09.96ID:gYLk4pIA tauri って新しいので servo 使うようになるんじゃなかったっけ?
それでバイナリサイズ増えてるんじゃ?
servo 使うようになるのは tauri 自身のコアコンセプト否定してる感じがして謎いが。
それでバイナリサイズ増えてるんじゃ?
servo 使うようになるのは tauri 自身のコアコンセプト否定してる感じがして謎いが。
298デフォルトの名無しさん
2024/08/18(日) 14:43:03.93ID:tu42Sbmi こいつ前からずっと1人でWebView推してるおじさんでしょ
変なのが居着いちゃったな
変なのが居着いちゃったな
299デフォルトの名無しさん
2024/08/18(日) 15:04:00.99ID:RAsFRw0P tauriのスレはちゃんとあるからそっちいけば?
【Electron】ハイブリッドアプリ開発総合【Cordova】 [無断転載禁止]©2ch.net
https://mevius.5ch.net/test/read.cgi/tech/1498985597/
【Electron】ハイブリッドアプリ開発総合【Cordova】 [無断転載禁止]©2ch.net
https://mevius.5ch.net/test/read.cgi/tech/1498985597/
300デフォルトの名無しさん
2024/08/18(日) 23:46:45.47ID:C/oeXKJM Tauri自体はcrates.ioにもある普通のRustのcrateで普通にRustのコードを書いてcargoで開発するものだから
それらcrateやRustコードやcargoの話はここでやっても構わない
Rust以外の話はこのスレの対象外
多少の脱線に限れば他の話題と同様に許容範囲
それらcrateやRustコードやcargoの話はここでやっても構わない
Rust以外の話はこのスレの対象外
多少の脱線に限れば他の話題と同様に許容範囲
301デフォルトの名無しさん
2024/08/19(月) 00:46:11.66ID:40PoSJGp 許容範囲が広いなら、話題に反応しない自由も大きくなってしまう
すべての話題・情報をノーカットで処理すべきと思う人は
反応しない自由は容認できないだろう
知らんけど
すべての話題・情報をノーカットで処理すべきと思う人は
反応しない自由は容認できないだろう
知らんけど
302デフォルトの名無しさん
2024/08/19(月) 03:37:53.96ID:fUo70iyi 「Rustは良い」の結論に結びつかない話題はスレチです
303デフォルトの名無しさん
2024/08/19(月) 08:28:41.87ID:E6sjrlZi 君らは
僕が選んだ(rust)は凄い
でしょ?
iPhone絶対正義やってる人と一緒
僕が選んだ(rust)は凄い
でしょ?
iPhone絶対正義やってる人と一緒
304デフォルトの名無しさん
2024/08/19(月) 08:33:51.85ID:QEF3ueHi >>303
個人的にはZig至上派でRustはC++よりマシという思いでやってる
個人的にはZig至上派でRustはC++よりマシという思いでやってる
305デフォルトの名無しさん
2024/08/19(月) 11:20:06.32ID:2cTqvZHP Xで、Hideyuki Tanakaは、Rust信者の典型的な説を言ってると思うけど、
ほとんど同意できない。
ほとんど同意できない。
306デフォルトの名無しさん
2024/08/19(月) 11:57:13.33ID:40PoSJGp 無課金という選択がすごい
二刀流でも三刀流でもできるのは課金しないからだ
有限のリソースがといって宗教を一つしか選べない人達が戦争を始める
二刀流でも三刀流でもできるのは課金しないからだ
有限のリソースがといって宗教を一つしか選べない人達が戦争を始める
307デフォルトの名無しさん
2024/08/19(月) 12:14:50.01ID:BR0GvBMw Rustはすごい
だからRustスレにいる俺はすごい
俺が知らない話題がRustスレにあると自分がすごくない気がするから許せない
だからRustスレにいる俺はすごい
俺が知らない話題がRustスレにあると自分がすごくない気がするから許せない
308デフォルトの名無しさん
2024/08/19(月) 15:34:27.05ID:sXHwNQud RustよりZigのほうがすごい
309デフォルトの名無しさん
2024/08/19(月) 16:46:33.01ID:KiHLz2jZ 米国国防総省のDARPA、CからRustへのコード変換を自動化する「TRACTOR」プログラムを開始
https://atmarkit.itmedia.co.jp/ait/spv/2408/14/news045.html
https://atmarkit.itmedia.co.jp/ait/spv/2408/14/news045.html
310デフォルトの名無しさん
2024/08/19(月) 17:48:38.35ID:5GtswNJ5 あ、zig要らなくなったな
311デフォルトの名無しさん
2024/08/19(月) 18:09:59.20ID:CLLx5KNp C/C++からRustへの変換こそ自然言語処理技術を使えばいいのに
312デフォルトの名無しさん
2024/08/19(月) 18:18:10.95ID:fUo70iyi プログラムって、計画とかそっちの意味のプログラムかい
313デフォルトの名無しさん
2024/08/19(月) 22:28:35.76ID:HWmXMBa7 >>304
1.0になるまで黙ってろ
1.0になるまで黙ってろ
314デフォルトの名無しさん
2024/08/19(月) 23:09:53.72ID:qGtdUYlI Cがやるような低レイヤ側だったらZigの方がシンプルだと思う
自分は式や型の表現力の高さの点でRustが好きだけど、これが強みになるのってより上位のレイヤーな気がする
RustでFFI用のC互換のコードを書こうとするとRustの管理を回避するためのコードが必要で、それが煩雑になりがち (基本的にunsafeが必要だったり、オブジェクトをCに渡すために Box から into_raw するのが必要だったり)
自分は式や型の表現力の高さの点でRustが好きだけど、これが強みになるのってより上位のレイヤーな気がする
RustでFFI用のC互換のコードを書こうとするとRustの管理を回避するためのコードが必要で、それが煩雑になりがち (基本的にunsafeが必要だったり、オブジェクトをCに渡すために Box から into_raw するのが必要だったり)
315デフォルトの名無しさん
2024/08/19(月) 23:37:07.40ID:53YDPjss316デフォルトの名無しさん
2024/08/19(月) 23:47:50.44ID:fihfH3vm 低レイヤと高レイヤを別言語にしたら接続箇所がいくらか煩雑になるが
全部 Rust にすれば低レイヤ部分は unsafe ばっかりで Rust の良さが活きてこない。
低レイヤで便利な言語は高レイヤでは抽象度の不足などで使い勝手が悪い。
全部が楽ってことはないので煩雑さをどこに持ってくるかの問題じゃないの。
ある程度は煩雑な部分があるのは仕方がないとして仕方ない部分を (快適とは言えずとも) 及第点に出来てれば十分に良い言語でしょ。
全部 Rust にすれば低レイヤ部分は unsafe ばっかりで Rust の良さが活きてこない。
低レイヤで便利な言語は高レイヤでは抽象度の不足などで使い勝手が悪い。
全部が楽ってことはないので煩雑さをどこに持ってくるかの問題じゃないの。
ある程度は煩雑な部分があるのは仕方がないとして仕方ない部分を (快適とは言えずとも) 及第点に出来てれば十分に良い言語でしょ。
317デフォルトの名無しさん
2024/08/19(月) 23:57:37.03ID:53YDPjss >>316
unsafeばっかりになる、が妄想思い込み
unsafeばっかりになる、が妄想思い込み
318デフォルトの名無しさん
2024/08/20(火) 09:21:19.12ID:5ubxjraY 変なことやることになった時にはRustのアロケーター指定面倒でZigはその辺楽だなってなる
319デフォルトの名無しさん
2024/08/20(火) 10:15:16.56ID:8nEEv7Ra 同一言語内で失敗例と成功例があるのは客観的事実だから
「言語を変えたら成功した」という因果関係は妄想と言われても仕方ない
「言語を変えたら成功した」という因果関係は妄想と言われても仕方ない
320デフォルトの名無しさん
2024/08/20(火) 10:46:28.17ID:I3hdmNTC >>317
理想的に設計できればいいけど現実はそうではない。
ホスト環境ありの高レイヤで unsafe まみれにならないのは標準ライブラリが慎重に設計されてるからで、標準の設計と同じくらいに上手くやれる人は稀。
そりゃカスなプログラマだからだろって言われればそのとおりだがだいたいの現場はカスなもんなんだよ。
理想的に設計できればいいけど現実はそうではない。
ホスト環境ありの高レイヤで unsafe まみれにならないのは標準ライブラリが慎重に設計されてるからで、標準の設計と同じくらいに上手くやれる人は稀。
そりゃカスなプログラマだからだろって言われればそのとおりだがだいたいの現場はカスなもんなんだよ。
321デフォルトの名無しさん
2024/08/20(火) 12:23:22.63ID:Sxib7Mvg 標準ライブラリのunsafeノウハウて、まとまっていたっけ?
322デフォルトの名無しさん
2024/08/20(火) 14:02:00.57ID:7gW0oenX うまくまとまってしまうとunsafeじゃなくても良くなる
323デフォルトの名無しさん
2024/08/20(火) 17:21:26.26ID:uQnpIujs unsafeまみれにならないのは、Rustが苦手な良いアルゴリズムを知らない人。
そういう人が圧倒的に多いので多数派意見になっているだけ。
そういう人が圧倒的に多いので多数派意見になっているだけ。
324デフォルトの名無しさん
2024/08/20(火) 18:19:19.40ID:wtC8SLN0 unsafeまみれにならないように工夫すれば、unsafeまみれにならない
だからこそ、unsafeまみれにならないように工夫すべきである、と私は思いますね
だからこそ、unsafeまみれにならないように工夫すべきである、と私は思いますね
325デフォルトの名無しさん
2024/08/20(火) 18:55:32.33ID:81clKmqR CやZigで作ったあとにAIで安心安全なRustに変換でいいんじゃね?
あ、それだとRust必要ないかも
あ、それだとRust必要ないかも
326デフォルトの名無しさん
2024/08/20(火) 20:54:37.99ID:AoNxQf2S いうてRustはまだまだ発展途上でしょ。このケースはunsafeなしでも安全性を推論可能でコンパイルできる。みたいなケースは今後もどんどん増えていくんじゃないの?
327デフォルトの名無しさん
2024/08/20(火) 21:23:27.30ID:wZEb7+R4 実際unsafeの安全性を証明するための研究も結構行われてるしな
Cみたいになんでもありだとかなり厳しいけど
Rustならunsafeといってもそれなりに制約があって研究としてもやりやすいらしい
Cみたいになんでもありだとかなり厳しいけど
Rustならunsafeといってもそれなりに制約があって研究としてもやりやすいらしい
328デフォルトの名無しさん
2024/08/20(火) 21:28:14.77ID:V+2PDpDB こゆことなんよ
https://x.com/atalocke/status/1599076649341194242
Zig is the new C.
Rust is the new C++.
Go is the new Java.
WASM is the new JS.
https://x.com/atalocke/status/1599076649341194242
Zig is the new C.
Rust is the new C++.
Go is the new Java.
WASM is the new JS.
329デフォルトの名無しさん
2024/08/20(火) 21:53:19.45ID:WNch2okD >>325
変換して生成させるかゼロから指示して生成させるかどちらが効率的かは意見が分かれるが、
変換して生成させるかゼロから指示して生成させるかどちらが効率的かは意見が分かれるが、
330デフォルトの名無しさん
2024/08/20(火) 21:54:44.32ID:WNch2okD 一般的にAIに生成させる場合は少なくとも以下の3つが必須とされる
(1) AIが安全なコードを生成できること
(2) 生成物の安全性を人間が確認できること
(3) 安全性とは別にAIのミスや暴走を食い止めるため人間がレビュー確認できること
(1) AIが安全なコードを生成できること
(2) 生成物の安全性を人間が確認できること
(3) 安全性とは別にAIのミスや暴走を食い止めるため人間がレビュー確認できること
331デフォルトの名無しさん
2024/08/20(火) 21:55:11.06ID:WNch2okD (1)は生成AIにとってかなり難しく様々な安全なパターンの学習をさせても間違いが起きるうる
生成先がRustならばコンパイルが通る条件など指定で間違いを防げる
(2)も生成先がC/C++やマシン語だと難関だがRustならばコンパイラに任せられる
(3)は(1)(2)によりRustを読める人材が今後も必要になることを意味する
さらに核心部分はAIに任せず人間が書くことで対AIの安全性を確保する考え方もある
したがってRustを書ける人材も必要とされる
生成先がRustならばコンパイルが通る条件など指定で間違いを防げる
(2)も生成先がC/C++やマシン語だと難関だがRustならばコンパイラに任せられる
(3)は(1)(2)によりRustを読める人材が今後も必要になることを意味する
さらに核心部分はAIに任せず人間が書くことで対AIの安全性を確保する考え方もある
したがってRustを書ける人材も必要とされる
332デフォルトの名無しさん
2024/08/20(火) 22:02:42.33ID:GiQ160H0 生成AIは既存物の変換処理は苦手でしょ
自然言語処理でやれないの?
自然言語処理でやれないの?
333デフォルトの名無しさん
2024/08/20(火) 22:26:06.21ID:WNch2okD334デフォルトの名無しさん
2024/08/20(火) 22:41:15.58ID:98E5vhfi すでにCで書かれてるものをRustで書きなおすのが時間と人材の無駄なのであって、イチから作るのであればRustでいいのでは…?
335デフォルトの名無しさん
2024/08/20(火) 22:46:48.76ID:04Vfq+Gu >>323
[補足]
「Rustでは上手く書けないアルゴリズム」を知らない人は、そもそも、
unsafeまみれにならない、ということが言いたかった。
「Rustでは上手く書けないアルゴリズム」を知らない人が圧倒的に多いので多数派意見になっている。
[補足]
「Rustでは上手く書けないアルゴリズム」を知らない人は、そもそも、
unsafeまみれにならない、ということが言いたかった。
「Rustでは上手く書けないアルゴリズム」を知らない人が圧倒的に多いので多数派意見になっている。
336デフォルトの名無しさん
2024/08/20(火) 22:49:18.72ID:04Vfq+Gu >>335
[さらに補足]
・C言語は、どんなアルゴリズムでも(分け隔てなく効率良く)書ける。
・Rustは、unsafeの範囲内のでは限られたアルゴリズムだけが効率よく書け、
それ以外のアルゴリズムは、効率が落ちてしまう。
[さらに補足]
・C言語は、どんなアルゴリズムでも(分け隔てなく効率良く)書ける。
・Rustは、unsafeの範囲内のでは限られたアルゴリズムだけが効率よく書け、
それ以外のアルゴリズムは、効率が落ちてしまう。
337デフォルトの名無しさん
2024/08/20(火) 23:44:10.92ID:o/ez13eh CPUから見たメモリは何でも自由にできるunsafeな存在だからさ
一番下ではunsafeな操作が必須な存在となることは当たり前さ
そのためunsafeだらけのRust標準ライブラリがそこをカバーしているのさ
だから普通のプログラマーはunsafeを使わずにプログラミングできるのさ
一番下ではunsafeな操作が必須な存在となることは当たり前さ
そのためunsafeだらけのRust標準ライブラリがそこをカバーしているのさ
だから普通のプログラマーはunsafeを使わずにプログラミングできるのさ
338デフォルトの名無しさん
2024/08/21(水) 00:04:15.03ID:9jT0I4l3 過去一キショい語尾のキャラ作り
339デフォルトの名無しさん
2024/08/21(水) 03:19:43.62ID:onw1PAAY >>336
最初からそう言えば良いのにωωω=2πf
最初からそう言えば良いのにωωω=2πf
340デフォルトの名無しさん
2024/08/21(水) 03:32:22.83ID:aTMrino2 >>336
Cで安全に書けるならば
Rustでもそれをライブラリとして提供できる
利用者にとってその中身がunsafeかどうかは気にする必要がない
例えばRustの標準ライブラリは何千ものunsafeブロックが含まれている
Cで安全に書けるならば
Rustでもそれをライブラリとして提供できる
利用者にとってその中身がunsafeかどうかは気にする必要がない
例えばRustの標準ライブラリは何千ものunsafeブロックが含まれている
341デフォルトの名無しさん
2024/08/21(水) 10:09:51.68ID:tqcavnGI >>339
Rust は清書用(キリっ
Rust は清書用(キリっ
342デフォルトの名無しさん
2024/08/21(水) 10:57:58.35ID:W+U2SbEM >>340
>Cで安全に書けるならば
>Rustでもそれをライブラリとして提供できる
問題は本当にCで安全に書けているのかわからないところ
アルゴリズム系は安全性がそれなりに担保されているからsafeラッパーを提供するのは難しくない
難しいのはFFI
>Cで安全に書けるならば
>Rustでもそれをライブラリとして提供できる
問題は本当にCで安全に書けているのかわからないところ
アルゴリズム系は安全性がそれなりに担保されているからsafeラッパーを提供するのは難しくない
難しいのはFFI
343デフォルトの名無しさん
2024/08/21(水) 17:22:42.80ID:Lo3kfkUP このスレにはRust理解してないガイジしかおらん
344デフォルトの名無しさん
2024/08/21(水) 18:51:27.99ID:CiN+yn7N オレはコンシューマ寄りであまり理解せずにRust書いてる
ほとんどSQL文のWEB APIだけど
ほとんどSQL文のWEB APIだけど
345デフォルトの名無しさん
2024/08/21(水) 19:17:17.31ID:e/imWdn6 サーバーやクラウドでCPUとメモリの使用リソース節約のために参照とライフタイム使いまくるプログラミングもあれば
リソースは金をかければよいだけだからとヒープ使いまくりのお大尽プログラミングもある
後者は技術力が低くてもいける
リソースは金をかければよいだけだからとヒープ使いまくりのお大尽プログラミングもある
後者は技術力が低くてもいける
346デフォルトの名無しさん
2024/08/21(水) 20:29:33.23ID:Hslv1ADF 有能な技術者を揃えて手間もかけて倍の性能を出すよりは機械を二台にするほうがコスト安ってのが昔の考え方だったんだよ。
高いのは設備より人の時間だったの。
いわゆる富豪的プログラミングという概念が生まれたのもそのときはちゃんと合理的な話だった。
だけど今は設備投資した上でまだ性能が要るという段階までコスト・性能の要求が厳しくなってきて揺り戻しが起こってる。
高いのは設備より人の時間だったの。
いわゆる富豪的プログラミングという概念が生まれたのもそのときはちゃんと合理的な話だった。
だけど今は設備投資した上でまだ性能が要るという段階までコスト・性能の要求が厳しくなってきて揺り戻しが起こってる。
347デフォルトの名無しさん
2024/08/21(水) 22:37:24.76ID:lzWu0Eqv Rustでライフタイム付きの構造体を書いたことがなく書けない人とかな
Cでポインタを含む構造体を扱うより楽なのに
Cでポインタを含む構造体を扱うより楽なのに
348デフォルトの名無しさん
2024/08/22(木) 00:18:39.99ID:5+ZOuDIT 同意
349デフォルトの名無しさん
2024/08/22(木) 00:33:56.97ID:JUiFuZPI そういう話ではないと思うけど、既存のC/C++のコードで構造体がポインタや参照 (C++のみ) を持ってた場合、それをRustに移植しようとすると面倒なケースはあるよね
元の設計でも参照先よりも自身の寿命が短いならライフタイム注釈を付けられるけど、そうでなければunsafeとポインタにするか Rc などに置き換えるかになる?
元の設計でも参照先よりも自身の寿命が短いならライフタイム注釈を付けられるけど、そうでなければunsafeとポインタにするか Rc などに置き換えるかになる?
350デフォルトの名無しさん
2024/08/22(木) 00:54:54.13ID:bBXwpWXG >>349
指してる先の寿命が短い危険なC/C++コードが
複雑で巧妙な条件管理でぎりぎりダングリングポインタとなることを上手く避けている
ように見えて実はある条件が揃った場合にはアウト、とかな
つまりunsafeでそのまま移植するとそのまま致命的バグが残ってしまう
根本から設計しなおせないならばRcと弱参照で致命的バグ回避か
指してる先の寿命が短い危険なC/C++コードが
複雑で巧妙な条件管理でぎりぎりダングリングポインタとなることを上手く避けている
ように見えて実はある条件が揃った場合にはアウト、とかな
つまりunsafeでそのまま移植するとそのまま致命的バグが残ってしまう
根本から設計しなおせないならばRcと弱参照で致命的バグ回避か
351デフォルトの名無しさん
2024/08/22(木) 13:30:25.79ID:NOd1y0JC 今、FirefoxとChromeってどっちがRust率高いんだろ?
JSONパーサーがC++からRustになった「Google Chrome 128」、ゼロデイ脆弱性の修正も
https://forest.watch.impress.co.jp/docs/news/1617607.html
JSONパーサーがC++からRustになった「Google Chrome 128」、ゼロデイ脆弱性の修正も
https://forest.watch.impress.co.jp/docs/news/1617607.html
352デフォルトの名無しさん
2024/08/22(木) 20:23:18.57ID:bSiaItqF353デフォルトの名無しさん
2024/08/22(木) 22:43:10.37ID:0OofYQEx Firefoxはおっさんしか使っていない
354デフォルトの名無しさん
2024/08/22(木) 22:46:45.14ID:RW7BB5aO chrome 系一色になるのも良くはないからね。
355デフォルトの名無しさん
2024/08/22(木) 22:47:07.99ID:Vc+ybjuc Rust信者からするとこの期に及んでC++でブラウザの再実装なんて始めやがったLadybirdのことは全力で呪ってる感じ?
356デフォルトの名無しさん
2024/08/22(木) 22:57:32.73ID:0cYmGRHf chromiumがC++のメモリ管理ミスでセキュリティ脆弱性を毎回出し続けているように
ブラウザのような新機能を常に加えていく大規模ソフトウェアでC++の使用は無理がある
だからchromiumはRustを採用し始めた
ブラウザのような新機能を常に加えていく大規模ソフトウェアでC++の使用は無理がある
だからchromiumはRustを採用し始めた
357デフォルトの名無しさん
2024/08/22(木) 23:59:43.53ID:cneVZgKz >>355
Ladybirdは作者が慣れてるから初期実装をC++でやっただけでSwift6.0が出たら移行みたいだよ
まぁRustのエコシステムに貢献してくれたほうが良かったとは思うけど、Swiftならいいんじゃないかな
Ladybirdは作者が慣れてるから初期実装をC++でやっただけでSwift6.0が出たら移行みたいだよ
まぁRustのエコシステムに貢献してくれたほうが良かったとは思うけど、Swiftならいいんじゃないかな
358デフォルトの名無しさん
2024/08/23(金) 00:10:40.25ID:P1vs0moa Swiftが遅い原因は
Rustで例えるとArc<Mutex<T>>を常用することでメモリ管理問題から逃げているため
という理解でいいのかな
Rustで例えるとArc<Mutex<T>>を常用することでメモリ管理問題から逃げているため
という理解でいいのかな
359デフォルトの名無しさん
2024/08/23(金) 00:24:23.39ID:4TKwTCLB Chromeは生ポインタ使ってるところを
一気にスマートポインタ等に置き換えたという
話を何年か前に聞いたけどそれじゃダメなんだな
一気にスマートポインタ等に置き換えたという
話を何年か前に聞いたけどそれじゃダメなんだな
360デフォルトの名無しさん
2024/08/23(金) 09:32:17.32ID:1xE8ro2C &strはlowercaseプルプル
361デフォルトの名無しさん
2024/08/23(金) 09:59:59.89ID:cja0xMPs primitive type は小文字ってのは Java あたりを踏襲した感じなのかね?
362デフォルトの名無しさん
2024/08/23(金) 10:07:13.27ID:cja0xMPs >>359
スマートポインタだけでは駄目で、 Rust で言うスライスみたいなものがないと安全に管理できない。
近年の C++ にはそういうライブラリも追加されたけどまだちょっと整備が不足している。
C++ は標準ライブラリには過剰なほど高い抽象度・汎用性を求めるので多次元のコンテナとの辻褄合わせでずっと議論してる……
スマートポインタだけでは駄目で、 Rust で言うスライスみたいなものがないと安全に管理できない。
近年の C++ にはそういうライブラリも追加されたけどまだちょっと整備が不足している。
C++ は標準ライブラリには過剰なほど高い抽象度・汎用性を求めるので多次元のコンテナとの辻褄合わせでずっと議論してる……
363デフォルトの名無しさん
2024/08/23(金) 10:12:11.46ID:UhIA8/Kr364デフォルトの名無しさん
2024/08/23(金) 10:29:44.46ID:cja0xMPs >>363
いや、暗黙の前提として「標準ライブラリの型名は camel case なのに」ってのを含んでる。
つまり「primitive とライブラリを違えている」ということを話題にしたくて、それを原則にしている言語の例として Java を挙げた。
いや、暗黙の前提として「標準ライブラリの型名は camel case なのに」ってのを含んでる。
つまり「primitive とライブラリを違えている」ということを話題にしたくて、それを原則にしている言語の例として Java を挙げた。
365デフォルトの名無しさん
2024/08/23(金) 12:43:06.00ID:HH2aHznt RustでcamelCaseは用いない
基本型は小文字
structやenumで作る型および別名はUpperCamelCaseを用いる
例えばstrは基本型だから小文字
StringはstructだからUpperCamelCase
基本型は小文字
structやenumで作る型および別名はUpperCamelCaseを用いる
例えばstrは基本型だから小文字
StringはstructだからUpperCamelCase
366デフォルトの名無しさん
2024/08/23(金) 14:34:53.94ID:gM6UWsJN strって言うほど基本型か? 問題
367デフォルトの名無しさん
2024/08/23(金) 15:29:42.74ID:gM6UWsJN https://users.rust-lang.org/t/why-is-str-a-primitive-type/36551
ふーん
Javaとは違ってprimitiveかそうでないかによる重要な違いはなくて、別に区別する必要性はそこまでないし、気にするだけ無駄そう
名前持ちのprimitive型の中でstrだけがDSTなのが違和感の正体かも
ふーん
Javaとは違ってprimitiveかそうでないかによる重要な違いはなくて、別に区別する必要性はそこまでないし、気にするだけ無駄そう
名前持ちのprimitive型の中でstrだけがDSTなのが違和感の正体かも
368デフォルトの名無しさん
2024/08/23(金) 15:49:44.63ID:HH2aHznt array(記述は[T; N])やslice(記述は[T])やstrはもちろん基本型
そしてヒープを必要としない
だからcoreにありno_stdでも使える
一方でBoxやVecやStringはヒープを必要とする
だからcoreにはなくallocにある
そしてヒープを必要としない
だからcoreにありno_stdでも使える
一方でBoxやVecやStringはヒープを必要とする
だからcoreにはなくallocにある
369デフォルトの名無しさん
2024/08/23(金) 20:34:48.59ID:7RGZdp5c https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=d8fa7bff7e61accb6f6bf7f0d4075dae
要素への不変参照を保ちつつ追加できるコレクションが欲しくて試しに書いてみたけど、どうすりゃいいんだ
UnsafeCell使うしかない?
要素への不変参照を保ちつつ追加できるコレクションが欲しくて試しに書いてみたけど、どうすりゃいいんだ
UnsafeCell使うしかない?
370デフォルトの名無しさん
2024/08/23(金) 21:33:21.24ID:IFprRKq6 >>367
スライスとstrとdynはDSTだからこそprimitiveだよ
参照が他と異なりfatポインタになるからね
"あいうえお" を正規UTF8と定めた点もRustの良いところ
それをprimitiveな型strとしたのも良い判断だね
スライスとstrとdynはDSTだからこそprimitiveだよ
参照が他と異なりfatポインタになるからね
"あいうえお" を正規UTF8と定めた点もRustの良いところ
それをprimitiveな型strとしたのも良い判断だね
371デフォルトの名無しさん
2024/08/23(金) 21:41:42.80ID:IFprRKq6 >>369
それは単純に参照を借りっぱなしになってるエラー
どこまで何をしたいのかによるけど
そのコンパイルエラーを解消したいだけなら
Cons(T, Box<List<T>>)を
Cons(Rc<T>, Box<List<T>>)にして
Some(t)をSome(t.clone())すればよい
ちなみにUnsafeCellは内部可変性の源泉なので
そういう新たな汎用型を作る時に使うものでunsafeだよ
一般プログラマーは使ってはいけない
それは単純に参照を借りっぱなしになってるエラー
どこまで何をしたいのかによるけど
そのコンパイルエラーを解消したいだけなら
Cons(T, Box<List<T>>)を
Cons(Rc<T>, Box<List<T>>)にして
Some(t)をSome(t.clone())すればよい
ちなみにUnsafeCellは内部可変性の源泉なので
そういう新たな汎用型を作る時に使うものでunsafeだよ
一般プログラマーは使ってはいけない
372デフォルトの名無しさん
2024/08/23(金) 21:46:56.38ID:cja0xMPs 名前に露骨に Unsafe って付いてるんだから十分な理解なしに使うのはやめておけという意図は感じるよな。
373デフォルトの名無しさん
2024/08/23(金) 21:47:30.17ID:3P3xaQHb >>370
UTF-32の方が単純で良かったんじゃないか?
UTF-32の方が単純で良かったんじゃないか?
374デフォルトの名無しさん
2024/08/23(金) 22:02:55.80ID:IFprRKq6375デフォルトの名無しさん
2024/08/23(金) 22:05:42.82ID:cja0xMPs UTF-8 はランダムアクセスに難があるが文字列のランダムアクセスってそんなに要らんだろという割りきりだな。
やりたければ UTF-32 用の型を使えるし、あくまでも言語の基本には UTF-8 を据えるってだけ。
やりたければ UTF-32 用の型を使えるし、あくまでも言語の基本には UTF-8 を据えるってだけ。
376デフォルトの名無しさん
2024/08/23(金) 22:07:14.75ID:7RGZdp5c >>371
そこは一般プログラマーじゃないと仮定して、UnsafeCell使うならこんな感じでいいんですかね?
RustのUBにちょっと詳しくなくて
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=509935956fa3b81133414a9e19920557
そこは一般プログラマーじゃないと仮定して、UnsafeCell使うならこんな感じでいいんですかね?
RustのUBにちょっと詳しくなくて
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=509935956fa3b81133414a9e19920557
377デフォルトの名無しさん
2024/08/23(金) 22:26:58.16ID:IFprRKq6 UnsafeCellは内部可変性を持つ安全な型を作るためのunsafeな部品として存在している
目的外に使う人に対しては今後は他の質問についても答えない
目的外に使う人に対しては今後は他の質問についても答えない
378デフォルトの名無しさん
2024/08/23(金) 22:27:06.29ID:TPfx6yeo >>376
値が数値だから今のところ問題ないけどこの実装だとListを新しいConsに突っ込んだ瞬間に
先頭の値の参照先が無効になりそうだな
自作にこだわらないならtyped-arenaを使うといい
https://docs.rs/typed-arena/latest/typed_arena/
小さいライブラリだから自作の参考にもなると思う
ライブラリ使わないならどこかでunsafeは必要になる
値が数値だから今のところ問題ないけどこの実装だとListを新しいConsに突っ込んだ瞬間に
先頭の値の参照先が無効になりそうだな
自作にこだわらないならtyped-arenaを使うといい
https://docs.rs/typed-arena/latest/typed_arena/
小さいライブラリだから自作の参考にもなると思う
ライブラリ使わないならどこかでunsafeは必要になる
379デフォルトの名無しさん
2024/08/23(金) 22:50:35.38ID:7RGZdp5c ちょっとuser-friendlyに整理してみた
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=509935956fa3b81133414a9e19920557
>>378
ListNode<T>は絶対にBoxに包むようにして、itemはヒープ上のTを指してるので
unsafeの中で間違ってBoxをdropしなければ無効な参照は発生しないと思うんですが、どうなんでしょう
typed-arena!
存在は知ってたけど、RefCellと組み合わせてグラフをなんかいい感じに扱えるやつくらいの認識だったので完全に盲点でした
これでいけそうです、ありがとうございます
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=509935956fa3b81133414a9e19920557
>>378
ListNode<T>は絶対にBoxに包むようにして、itemはヒープ上のTを指してるので
unsafeの中で間違ってBoxをdropしなければ無効な参照は発生しないと思うんですが、どうなんでしょう
typed-arena!
存在は知ってたけど、RefCellと組み合わせてグラフをなんかいい感じに扱えるやつくらいの認識だったので完全に盲点でした
これでいけそうです、ありがとうございます
380デフォルトの名無しさん
2024/08/23(金) 22:55:03.65ID:7RGZdp5c おっとリンク再生成してなかった
ちょっとuser-friendlyに整理してみた版
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=b0ca47dce14c07da2936f1964bc54485
ちょっとuser-friendlyに整理してみた版
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=b0ca47dce14c07da2936f1964bc54485
381デフォルトの名無しさん
2024/08/23(金) 23:21:46.23ID:HH2aHznt 安全だと思い込んでunsafeを使うやつはCでも使っとけ
382デフォルトの名無しさん
2024/08/23(金) 23:29:15.36ID:3P3xaQHb 依存クレートの中からunsafeを検索して一覧表示するようなツールある?
383デフォルトの名無しさん
2024/08/24(土) 00:11:50.62ID:7iJIMzJC 数えるだけならcargo-geiger
ナンセンスすぎて使ったことないけど
ナンセンスすぎて使ったことないけど
384デフォルトの名無しさん
2024/08/24(土) 05:53:44.99ID:4DIR6G6I >>382
あまり意味がない気もする
actix-webの作者は「unsafe使うな」「それはRustのやり方ではない」という沢山の声にうんざりして開発停止する事件が起きた
unsafeは危険というよりも「このコードの安全性はコンパイラでは検証しないので実装者が責任を持つ」ブロックと考えて、よくテストされたライブラリについてならある程度信用して良いと思う
あまり意味がない気もする
actix-webの作者は「unsafe使うな」「それはRustのやり方ではない」という沢山の声にうんざりして開発停止する事件が起きた
unsafeは危険というよりも「このコードの安全性はコンパイラでは検証しないので実装者が責任を持つ」ブロックと考えて、よくテストされたライブラリについてならある程度信用して良いと思う
385デフォルトの名無しさん
2024/08/24(土) 07:54:28.69ID:hn86gB+V unsafeは人間が安全性を保証しなければいけないため、必ず多くの監視者がいなければいけない。
そして不必要なコードと必要で安全なコードを皆で選別しなければならない。
パフォーマンスにほぼ影響なく無くせるケースは無くすべきというのが第一原則。
そして不必要なコードと必要で安全なコードを皆で選別しなければならない。
パフォーマンスにほぼ影響なく無くせるケースは無くすべきというのが第一原則。
386デフォルトの名無しさん
2024/08/24(土) 07:56:32.18ID:hn86gB+V 一方でRustの標準ライブラリには何千ものunsafeが存在していて、安全なインターフェースを提供してくれている。
このおかげで我々はunsafeを使わずにパフォーマンスの高いコードを書くことができる。
標準ライブラリと同様に他のクレートでも下支えをしてくれるものは同じ立ち位置として認められているものが多い。
つまり必要不可欠なものである。
いずれにしてもライブラリ内に隔離して外向けに安全なインターフェースを提供してくれることが第一原則。
このおかげで我々はunsafeを使わずにパフォーマンスの高いコードを書くことができる。
標準ライブラリと同様に他のクレートでも下支えをしてくれるものは同じ立ち位置として認められているものが多い。
つまり必要不可欠なものである。
いずれにしてもライブラリ内に隔離して外向けに安全なインターフェースを提供してくれることが第一原則。
387デフォルトの名無しさん
2024/08/24(土) 08:06:32.30ID:4K3Bdck4 Rust の参照についている様々な制約は機械的に解析可能なように制限したのであって
人間的な感覚での適切な抽象やデザインパターンと両立不可能な場合がある。
機械的検証可能性を維持するために不自然なデザインを持ち込むのが健全とは言い難いよ。
unsafe はなるべく低レイヤの小さな範囲に押し込めたほうが良いのは確かだが、
プロジェクトの性質によってはそれがもうちょっと高レイヤまではみ出してくることだってあるだろ。
人間的な感覚での適切な抽象やデザインパターンと両立不可能な場合がある。
機械的検証可能性を維持するために不自然なデザインを持ち込むのが健全とは言い難いよ。
unsafe はなるべく低レイヤの小さな範囲に押し込めたほうが良いのは確かだが、
プロジェクトの性質によってはそれがもうちょっと高レイヤまではみ出してくることだってあるだろ。
388デフォルトの名無しさん
2024/08/24(土) 08:21:40.08ID:oc2+bqUo >>382
grep
grep
389デフォルトの名無しさん
2024/08/24(土) 08:22:12.74ID:zb5PQrw4390デフォルトの名無しさん
2024/08/24(土) 09:00:02.66ID:p6ioLyHc391デフォルトの名無しさん
2024/08/24(土) 10:45:01.27ID:ddJ1kwEW servoが最低限まともに動くようになるには、あと軽く5年はかかる
今のバージョン動かしてみ?
夢見すぎ
今のバージョン動かしてみ?
夢見すぎ
392デフォルトの名無しさん
2024/08/24(土) 11:01:21.63ID:YypCtLY/ >>384
>unsafeは危険というよりも「このコードの安全性はコンパイラでは検証しないので実装者が責任を持つ」ブロックと考えて、よくテストされたライブラリについてならある程度信用して良いと思う
こういうスタンスはダメだよな
作ってるアプリによっては許される場合もあるんだろうけど
>unsafeは危険というよりも「このコードの安全性はコンパイラでは検証しないので実装者が責任を持つ」ブロックと考えて、よくテストされたライブラリについてならある程度信用して良いと思う
こういうスタンスはダメだよな
作ってるアプリによっては許される場合もあるんだろうけど
393デフォルトの名無しさん
2024/08/24(土) 11:31:23.33ID:yTiOx0eZ >>390
俺はtauriのコアコンセプトはOSが提供するブラウザエンジンを使い、バイナリサイズやセキュリティアップデートの問題を解決することだと俺は思ってるんだ。
だからRust使ってるからservo使うってのは門外漢には自然に見えてもコアコンセプトを忘れてもともとの問題を解決しないOSSになっていってる感じがするんだよな。
俺はtauriのコアコンセプトはOSが提供するブラウザエンジンを使い、バイナリサイズやセキュリティアップデートの問題を解決することだと俺は思ってるんだ。
だからRust使ってるからservo使うってのは門外漢には自然に見えてもコアコンセプトを忘れてもともとの問題を解決しないOSSになっていってる感じがするんだよな。
394デフォルトの名無しさん
2024/08/24(土) 11:47:25.22ID:7iJIMzJC ブラウザエンジンの選択肢が増えるだけでしょ
wryの中のfeatureが増えるのかwryごとservoに差し替えるfeatureになるのかは知らんけど
wryの中のfeatureが増えるのかwryごとservoに差し替えるfeatureになるのかは知らんけど
395デフォルトの名無しさん
2024/08/24(土) 12:27:15.89ID:7lrMjW7E .NET 9の新機能としてC#版Tauriが来るらしい
Go版Tauriもあるらしいし、流行ってるのかな
Go版Tauriもあるらしいし、流行ってるのかな
396デフォルトの名無しさん
2024/08/24(土) 12:33:53.63ID:4K3Bdck4 疎結合でブラウザを GUI として使うには接続部分を上手く標準化する必要がある。
参加が多いほど標準化の圧力が生まれるし、良いことだと思う。
参加が多いほど標準化の圧力が生まれるし、良いことだと思う。
397デフォルトの名無しさん
2024/08/24(土) 13:14:00.45ID:Ou5o/VfJ いまどき疎結合とか意味のないこだわりだな
398デフォルトの名無しさん
2024/08/24(土) 13:30:29.34ID:7lrMjW7E 疎結合とかそういうかっこいい話じゃなくて
今どき新規にGUIツールキット作ってもウィジェット開発してくれる人が集まらないから
Web技術転用してしのぐかって話でしょ?
当のMicrosoftは3連続ぐらいで新GUIツールキットの開発に失敗しバグ残したまま撤退を繰り返してるし
今どき新規にGUIツールキット作ってもウィジェット開発してくれる人が集まらないから
Web技術転用してしのぐかって話でしょ?
当のMicrosoftは3連続ぐらいで新GUIツールキットの開発に失敗しバグ残したまま撤退を繰り返してるし
399デフォルトの名無しさん
2024/08/24(土) 13:38:09.55ID:4K3Bdck4 unicode の表示からしてウェブブラウザ以外は規格に追い付いてない感触はあるなあ……
400デフォルトの名無しさん
2024/08/24(土) 13:46:07.91ID:6hMOShrr401デフォルトの名無しさん
2024/08/24(土) 13:46:41.99ID:Ou5o/VfJ いまはネットワークが高速で繋がっている前提なのなw
402デフォルトの名無しさん
2024/08/24(土) 13:54:50.23ID:62s/s0Ka >>395
仕組みは組み込みWebViewをネイティブの上で起動してるだけだから作るのが大して手間じゃないし実装してみたって感じでしょ
仕組みは組み込みWebViewをネイティブの上で起動してるだけだから作るのが大して手間じゃないし実装してみたって感じでしょ
403デフォルトの名無しさん
2024/08/24(土) 14:58:54.54ID:Jkp0q3NQ >>382
github
github
404デフォルトの名無しさん
2024/08/24(土) 15:01:04.10ID:Jkp0q3NQ >>387
+1
+1
405デフォルトの名無しさん
2024/08/24(土) 15:03:55.41ID:Jkp0q3NQ >>401
これホント困るわ
これホント困るわ
406デフォルトの名無しさん
2024/08/24(土) 16:36:29.92ID:yTiOx0eZ407デフォルトの名無しさん
2024/08/24(土) 16:50:25.05ID:tVyuBhwz unsafeブロックってどこからどこまで囲えば良いんだろう
408デフォルトの名無しさん
2024/08/24(土) 18:11:39.50ID:YypCtLY/ >>407
「可能な限り小さく」が原則
「可能な限り小さく」が原則
409デフォルトの名無しさん
2024/08/24(土) 18:18:35.56ID:oEJCcg2t Rustでunsafeは使ってはいけない
例外的にunsafeの使用が認められるのは以下2点のみ
ベテランが基盤クレートを提供する時
ベテランがFFI部分を記述する時
例外的にunsafeの使用が認められるのは以下2点のみ
ベテランが基盤クレートを提供する時
ベテランがFFI部分を記述する時
410デフォルトの名無しさん
2024/08/24(土) 18:20:35.25ID:4K3Bdck4 unsafe なことをやっている箇所をなるべく小さい範囲で囲むべきだがお互いに関係のある複数の unsafe がごく近くにあるならまとめて囲むほうが分かりやすいということはあるかもね。
411デフォルトの名無しさん
2024/08/24(土) 18:29:15.33ID:L19e2eSE そういうケースを除くとunsafeを使ってる者は技術力がないだけのバカと
パフォーマンスにほとんど変化しないのに高速化してるつもりで保守性を下げてるアホだからな
パフォーマンスにほとんど変化しないのに高速化してるつもりで保守性を下げてるアホだからな
412デフォルトの名無しさん
2024/08/24(土) 18:32:37.91ID:wRPlPCuY Rustでどう書くのか分かりませんが、C言語で書けば、
BYTE *ConvertUintToPtr( Uint32 u ) {
unsafe {
return (BYTE*)u;
}
}
のような関数をRustで作ることは出来ますかね?
BYTE *ConvertUintToPtr( Uint32 u ) {
unsafe {
return (BYTE*)u;
}
}
のような関数をRustで作ることは出来ますかね?
413デフォルトの名無しさん
2024/08/24(土) 18:33:08.29ID:tVyuBhwz >>408
最小限にするなら、>>380はこうしたほうがいいってことかね
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=f27cd2a3b6b850770a839c17d6fe3ec4
unsafeブロックもブロックではあるから、通常のブロックと同様にdropが働くから、それに注意して無効な参照をsafe内に持ち出さないようにすればいいってことかね?
最小限にするなら、>>380はこうしたほうがいいってことかね
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=f27cd2a3b6b850770a839c17d6fe3ec4
unsafeブロックもブロックではあるから、通常のブロックと同様にdropが働くから、それに注意して無効な参照をsafe内に持ち出さないようにすればいいってことかね?
414デフォルトの名無しさん
2024/08/24(土) 18:43:12.73ID:HUq12b/T >>406
現状だと
servo「うちの鰻丼を置かせてください!」
tauri「まぁ客に出せる味になったらメニューに加えてもいいよ」
くらいの温度感に見えるけどなぁ。これまでの発表はservo側からだし、tauriチームとしてservoに全面移行するなんて話は出てないと思うけど
現状だと
servo「うちの鰻丼を置かせてください!」
tauri「まぁ客に出せる味になったらメニューに加えてもいいよ」
くらいの温度感に見えるけどなぁ。これまでの発表はservo側からだし、tauriチームとしてservoに全面移行するなんて話は出てないと思うけど
415デフォルトの名無しさん
2024/08/24(土) 18:46:57.91ID:u5pZaQPK416デフォルトの名無しさん
2024/08/24(土) 18:51:25.05ID:0FPuuX3m unsafe Rust使うくらいならCでよくない?
反対意見あったら言ってくれ
反対意見あったら言ってくれ
417デフォルトの名無しさん
2024/08/24(土) 18:52:59.44ID:73Xik/Zr418デフォルトの名無しさん
2024/08/24(土) 18:53:02.17ID:tVyuBhwz >>415
一応Referenceのunsafe blockの部分は読んだけど、nomiconも全部読まなきゃだめ?
具体的にどこが間違っている/作法に反しているのか指摘してくれるとありがたいんですが……
一応Referenceのunsafe blockの部分は読んだけど、nomiconも全部読まなきゃだめ?
具体的にどこが間違っている/作法に反しているのか指摘してくれるとありがたいんですが……
419デフォルトの名無しさん
2024/08/24(土) 18:55:23.20ID:wRPlPCuY >>417
参考のため、どう書けばいいのか教えていただければ幸いです。
参考のため、どう書けばいいのか教えていただければ幸いです。
420デフォルトの名無しさん
2024/08/24(土) 18:55:51.72ID:NdtpJtS7421デフォルトの名無しさん
2024/08/24(土) 18:57:28.86ID:73Xik/Zr422デフォルトの名無しさん
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
変換するだけなら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
423デフォルトの名無しさん
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++でええやんいう話になるわな
そらそうやけど、それでうまく行くならC++でええやんいう話になるわな
426デフォルトの名無しさん
2024/08/24(土) 20:22:17.51ID:ZYhP4fGD Rustに不慣れで技術力の低い人がunsafeを使う傾向が高い
ほとんどのケースは既存の安全なパーツを組み合わせるだけで安全に実装できる
ほとんどのケースは既存の安全なパーツを組み合わせるだけで安全に実装できる
427デフォルトの名無しさん
2024/08/24(土) 21:14:33.88ID:tVyuBhwz >>426
単発君
自分でunsafeを書く必要性がない書く気がないならそれでいいと思うし、その立場は理解したから、どうか他人の足を引っ張らないでくれ
unsafeの書き方を学ぼうという同志がいないのならそのうち去るから、すまないがそれまで待ってくれないか
単発君
自分でunsafeを書く必要性がない書く気がないならそれでいいと思うし、その立場は理解したから、どうか他人の足を引っ張らないでくれ
unsafeの書き方を学ぼうという同志がいないのならそのうち去るから、すまないがそれまで待ってくれないか
428デフォルトの名無しさん
2024/08/24(土) 21:26:04.07ID:4K3Bdck4 unsafe で UB になる場合を知りたい場合にはどこに仕様が書いてあるのかがそもそもわからん。
429デフォルトの名無しさん
2024/08/24(土) 21:26:45.92ID:Fuip7Jnb UnsafeCellを使ってる頭のおかしな人のコードはborrow checkerに引っかかってコンパイルを通せないところから始まってるよね
unsafeの使い方を学ぶのではなくsafe Rustの使い方を学ぶべきかと
unsafeの使い方を学ぶのではなくsafe Rustの使い方を学ぶべきかと
430デフォルトの名無しさん
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で検索した結果とかでいいんでしょうか
現状のベストエフォートのまとめはこれですかねえ
LLVMのマニュアルなんて参照しちゃってるから、LLVM IRまでのloweringの詳細を完璧に把握でもしていない限りこれを一次資料として参考にするってのは無理そうですが……
https://doc.rust-lang.org/reference/behavior-considered-undefined.html
あとは呼んでいるunsafe fn/実装しているunsafe traitのドキュメント(当たり前)と、the Referenceをundefinedで検索した結果とかでいいんでしょうか
431デフォルトの名無しさん
2024/08/24(土) 22:14:58.07ID:cfGbu5GL 既存の安全なパーツを使いこなせる熟練者であることがunsafeを書くための最低限の資格だ
これができないとunsafeを使うべきか否かという入口すら判断できない
これができないとunsafeを使うべきか否かという入口すら判断できない
432デフォルトの名無しさん
2024/08/24(土) 22:53:26.45ID:4K3Bdck4 Rust のメモリまわりの動作モデルは結局は C/C++ に合わせることにしたみたいな話をどこかで見たようなおぼろげな記憶がちょっとある。
LLVM がなんだかんだで C/C++ を想定した形になってしまっているのとその辺の低レイヤの部分がちゃんとモデル化されている言語が C/C++ くらいしかないから Rust のためにあらためて検討するくらいならもう合わせちゃって良くない? みたいなニュアンスだったと思うんだけどどこで見たのかも思い出せないから違ってたらごめんね。
LLVM がなんだかんだで C/C++ を想定した形になってしまっているのとその辺の低レイヤの部分がちゃんとモデル化されている言語が C/C++ くらいしかないから Rust のためにあらためて検討するくらいならもう合わせちゃって良くない? みたいなニュアンスだったと思うんだけどどこで見たのかも思い出せないから違ってたらごめんね。
433デフォルトの名無しさん
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の指すアドレスに一致しますね。
有難うございます。
ところで、Rustでは、unsafe 以外では、専ら参照型が使われると思っていたのですが、
unsafe を使わない部分でも、ポインタ型 * が使えるようですね。
Rustにおけるポインタ型を参照型のアドレスに採用する方法も教えていただければ幸いです。
C++ であれば、
T x; //xは、T型の変数。
T *p = &x; //pは、T型へのポインタ型。アドレスは変数xのアドレス。
T &r = *p; //rは、T型の参照型。
で、参照型rのアドレスがpの指すアドレスに一致しますね。
434デフォルトの名無しさん
2024/08/24(土) 23:31:10.68ID:BmB2eUS9435デフォルトの名無しさん
2024/08/24(土) 23:50:29.93ID:2MnTl83M >>434
では、C++であるならば、以下の様に書けそうなコードをRustで書くとすると
どうなるでしょうか。
BYTE &ConvertPtrToRef( BYTE *p ) {
unsafe {
return *p;
}
}
では、C++であるならば、以下の様に書けそうなコードをRustで書くとすると
どうなるでしょうか。
BYTE &ConvertPtrToRef( BYTE *p ) {
unsafe {
return *p;
}
}
436デフォルトの名無しさん
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 }
unsafe { p.as_mut().expect("p is not null") }
unsafe { &*p }
unsafe { &mut *p }
437デフォルトの名無しさん
2024/08/25(日) 01:28:05.04ID:dkRsAaY3 そもそもRustの参照とC++の参照が1対1に対応しないので、そこを無視してもどうなんだという問題
438あぼーん
NGNGあぼーん
439デフォルトの名無しさん
2024/08/25(日) 06:34:29.42ID:5GOytbIs >>438
まじか
まじか
440デフォルトの名無しさん
2024/08/25(日) 15:06:59.24ID:ftonnHt3441デフォルトの名無しさん
2024/08/25(日) 16:07:14.33ID:+NmqKH/G unsafe大好き
442デフォルトの名無しさん
2024/08/26(月) 07:21:14.48ID:HvObP+1c unsafe rustよりzig
443デフォルトの名無しさん
2024/08/26(月) 07:32:17.72ID:EZDOC4zz zigは未完成
444デフォルトの名無しさん
2024/08/26(月) 11:03:43.55ID:3+7ACU+U zigよりNim
445デフォルトの名無しさん
2024/08/26(月) 12:45:51.89ID:6drfVC9J Rustでunsafeを迂闊に使っていると信用失墜リスクがある
例えば安全に書けるシーンでunsafeを使っていればRustに疎くレベルが低いと客観的に判定されてしまう
そして書いたコードは信頼されなくなるため要注意だ
例えば安全に書けるシーンでunsafeを使っていればRustに疎くレベルが低いと客観的に判定されてしまう
そして書いたコードは信頼されなくなるため要注意だ
446デフォルトの名無しさん
2024/08/26(月) 13:27:24.67ID:/RxTrZ/p んでNimよりCってわけ
447デフォルトの名無しさん
2024/08/26(月) 23:59:19.70ID:TniAJlSa unsafeなしに拘るならそもそもunsafeという仕様のない言語を使えば良いのでは
448デフォルトの名無しさん
2024/08/27(火) 00:09:57.79ID:ft2/OuFA unsafeはFFI部分と基盤ライブラリで必須
そのためにある
そのためにある
449デフォルトの名無しさん
2024/08/27(火) 01:18:15.13ID:meLOHly2 あんまり必死になると>>307が図星なのがバレるぞ
450あぼーん
NGNGあぼーん
451デフォルトの名無しさん
2024/08/27(火) 05:12:31.56ID:SWsi92BQ >>450
既に貰ってる
既に貰ってる
452デフォルトの名無しさん
2024/08/27(火) 14:18:24.38ID:oHcafaf7 unsafeって危険だから描くんじゃなくて
unsafeを描くことで危険を回避出来るんだ
だからunsafeが使われてるからって危険なコードじゃないんだ
unsafeを観たら危険だと脊髄反射する方が馬鹿の誤解
unsafeを描くことで危険を回避出来るんだ
だからunsafeが使われてるからって危険なコードじゃないんだ
unsafeを観たら危険だと脊髄反射する方が馬鹿の誤解
453デフォルトの名無しさん
2024/08/27(火) 14:18:59.31ID:oHcafaf7 だから >>445 はピンぼけ的外れ
454デフォルトの名無しさん
2024/08/27(火) 14:29:34.76ID:rXlpHGM8 RustかC++のどちらかなのかはRustで落ち着いたけど
unsafe RustかCかは結局どっちがいいんだい?
unsafe RustかCかは結局どっちがいいんだい?
455デフォルトの名無しさん
2024/08/27(火) 14:38:55.67ID:f/nerXJl >>454
え?いつの間に落ち着いたの?
え?いつの間に落ち着いたの?
456デフォルトの名無しさん
2024/08/27(火) 14:47:28.58ID:fKaZ1hCT457デフォルトの名無しさん
2024/08/27(火) 15:35:17.48ID:VmCaZkt1 >>452
おまえは何を言ってるんだw
おまえは何を言ってるんだw
458デフォルトの名無しさん
2024/08/27(火) 15:36:49.68ID:i930s1KJ >>456
1.0になってから来てくれ
1.0になってから来てくれ
459デフォルトの名無しさん
2024/08/27(火) 16:13:13.47ID:kbqekxQE460デフォルトの名無しさん
2024/08/28(水) 04:07:55.29ID:2ujtxZGB 最大サイズのマインスイーパーだと
プログラムに解かせるのに30分くらいかかるのか
それはメモリを積むと速くなったり
コア数を積むと速くなったり
未知のアルゴリズムで速くなったりする?
プログラムに解かせるのに30分くらいかかるのか
それはメモリを積むと速くなったり
コア数を積むと速くなったり
未知のアルゴリズムで速くなったりする?
461デフォルトの名無しさん
2024/08/28(水) 09:07:31.11ID:o9WnFihZ まあそうなるよなw
頭悪いたとえ話だから仕方がない
頭悪いたとえ話だから仕方がない
462デフォルトの名無しさん
2024/08/28(水) 09:16:54.18ID:YkYaTCgW でもプログラムに解かせるのに30分もかからないだろくらいの感覚は常識として持っておいて欲しいところ
463デフォルトの名無しさん
2024/08/28(水) 10:32:38.93ID:Uwy2gXCW マインスイーパーはNP完全であると証明されていてかなり難問
さらにそもそも常に論理的に解けるわけではないためリゾルバーは勝率100%ではなく問題難易度別に平均勝率が示される
具体的には論理的推論で開けられる場所がなくなった時に人間は運ゲーとなるが機雷のある場所の確率計算により勝率を高められる
その手法ならびに巨大サイズによっては計算時間30分はありうるのではないか
さらにそもそも常に論理的に解けるわけではないためリゾルバーは勝率100%ではなく問題難易度別に平均勝率が示される
具体的には論理的推論で開けられる場所がなくなった時に人間は運ゲーとなるが機雷のある場所の確率計算により勝率を高められる
その手法ならびに巨大サイズによっては計算時間30分はありうるのではないか
464デフォルトの名無しさん
2024/08/28(水) 11:57:33.04ID:t9eW5UMl465デフォルトの名無しさん
2024/08/28(水) 12:03:45.27ID:HLZOwn4a 例えば話悪すぎるのは理解するけど、プログラムにマインスイーパー解かせる話だっけ
466デフォルトの名無しさん
2024/08/28(水) 12:21:33.97ID:Bl8r2+HB >>464
なぜ0.1秒ではなく1秒ではなく100秒ではなく10秒なのか?
なぜ0.1秒ではなく1秒ではなく100秒ではなく10秒なのか?
467デフォルトの名無しさん
2024/08/28(水) 12:23:32.67ID:Bl8r2+HB >>465
プログラム板のプログラミング言語スレでそれ以外にどんな可能性があるか?
プログラム板のプログラミング言語スレでそれ以外にどんな可能性があるか?
468デフォルトの名無しさん
2024/08/28(水) 13:59:37.19ID:APdn6MV3 誤魔化せれば何でもいいから意味の無いレスを拾ってごちゃごちゃ書き込んでるんだろう
469デフォルトの名無しさん
2024/08/28(水) 16:33:13.07ID:iRpE4/QL いつのまにかAndroid公式ドキュメントにRustの章ができてた
470デフォルトの名無しさん
2024/08/28(水) 17:22:14.56ID:kssH4dJX AndroidはJNIをJavaとバイナリとの間に噛ませないといけないからほんとに面倒くさい
471デフォルトの名無しさん
2024/08/28(水) 19:34:23.32ID:njVvvVc1 >>459
君頭悪いのに無理に例えなんか使わないほうがいいよ
君頭悪いのに無理に例えなんか使わないほうがいいよ
472デフォルトの名無しさん
2024/08/28(水) 21:16:27.54ID:qM6sg2ID まさかマインスイーパーの例え自体が地雷になるとはw
Rustスレなのにunsafeだな
Rustスレなのにunsafeだな
473デフォルトの名無しさん
2024/08/28(水) 22:54:19.83ID:kssH4dJX さあみなさま、脱unsafeを心がけていきましょう!
474デフォルトの名無しさん
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/
長文すまん
Zig、エリアアローケーターがとても魅力的なんだけど、非同期まわりの仕様が白紙に戻っちゃったのがなあ
もちろんZigの求められている役割的に非同期はそこまで重要ではないのだけれどちょっと悲しさを感じる
なんでもZigに限らずLLVMとasync/awaitの相性がとてつもなく悪いらしい
https://www.reddit.com/r/Zig/comments/1d66gtp/state_of_async_in_zig/
長文すまん
475デフォルトの名無しさん
2024/08/28(水) 23:17:49.58ID:lG2WtYJn Swiftのasync/await良く出来てるけど?
476デフォルトの名無しさん
2024/08/28(水) 23:25:03.26ID:kssH4dJX477デフォルトの名無しさん
2024/08/28(水) 23:30:17.85ID:fP4MaCDa golangはasync/awaitじゃなくてCSPな?
478デフォルトの名無しさん
2024/08/28(水) 23:32:07.56ID:kssH4dJX >>477
すまん指摘助かる
すまん指摘助かる
479デフォルトの名無しさん
2024/08/28(水) 23:41:09.49ID:qM6sg2ID480デフォルトの名無しさん
2024/08/28(水) 23:41:42.12ID:lG2WtYJn GoもKotlinもLLVMバックエンドじゃないだろ
481デフォルトの名無しさん
2024/08/28(水) 23:46:05.67ID:LoAS9bQy >>474
読んでみたが登場人物たちが無知すぎるな
特にZigでのasync/awaitの経緯を解説しているmlugg0はRustについて不慣れで全くわからないと答えてる
>>Zigに限らずLLVMとasync/awaitの相性がとてつもなく悪いらしい
それは間違いでLLVM coroutineを使おうとすると重くなる
Rustはそれを使わずにスタックレスなステートマシンとして実現しているため軽く良く出来ている
読んでみたが登場人物たちが無知すぎるな
特にZigでのasync/awaitの経緯を解説しているmlugg0はRustについて不慣れで全くわからないと答えてる
>>Zigに限らずLLVMとasync/awaitの相性がとてつもなく悪いらしい
それは間違いでLLVM coroutineを使おうとすると重くなる
Rustはそれを使わずにスタックレスなステートマシンとして実現しているため軽く良く出来ている
482デフォルトの名無しさん
2024/08/29(木) 01:22:47.24ID:YXIyrRhD >>481
Rustは最強ってことでいいけどここにいてもお前がザコなのは変わらないからもう引っ込んでなよ
Rustは最強ってことでいいけどここにいてもお前がザコなのは変わらないからもう引っ込んでなよ
483デフォルトの名無しさん
2024/08/29(木) 06:12:15.98ID:1jszJs3n >>480
バカなAIが跋扈してる
バカなAIが跋扈してる
484デフォルトの名無しさん
2024/08/29(木) 06:26:17.95ID:CICE1rWP Zigは技術的な敗北でasync/awaitを削除しただけでなく思想的にも嫌悪や不要論が跋扈していて終わってるな
485デフォルトの名無しさん
2024/08/29(木) 07:28:11.89ID:rHptJtk5 >>474
スレッドプール作れるし問題なし
スレッドプール作れるし問題なし
486デフォルトの名無しさん
2024/08/29(木) 07:34:05.99ID:jXxTByd8 async awaitが何なのか理解していない人たちがZigに集まっている
487デフォルトの名無しさん
2024/08/29(木) 07:53:29.77ID:0glh1AR4 Zigは未使用変数がエラーになるのがな…
せめてデバッグビルド中はワーニングになってほしいが
作者の思想的に無理そうなんだよな
せめてデバッグビルド中はワーニングになってほしいが
作者の思想的に無理そうなんだよな
488デフォルトの名無しさん
2024/08/29(木) 08:06:23.91ID:7zduIY7i489デフォルトの名無しさん
2024/08/29(木) 08:08:24.23ID:K+MkDn8y zigはビルドツールのccとしてcmakeより使いやすくて好き
490デフォルトの名無しさん
2024/08/29(木) 08:10:24.41ID:0glh1AR4 >>488
いや、Rustと同じく変数名に_つければ通るからあんま関係ないかな
これのせいで実装中やデバッグ中に関数呼び出し一つコメントアウトするたびに
あちこちに_をつけてまわらないといけないからかなりつらい
いや、Rustと同じく変数名に_つければ通るからあんま関係ないかな
これのせいで実装中やデバッグ中に関数呼び出し一つコメントアウトするたびに
あちこちに_をつけてまわらないといけないからかなりつらい
491デフォルトの名無しさん
2024/08/29(木) 08:32:58.82ID:plL6TRoE Zigは未完成のまま終わりそうだな
492デフォルトの名無しさん
2024/08/29(木) 08:51:25.64ID:W3gDNWMh >>489
pkg-config 呼び出す機能がないんじゃない?
pkg-config 呼び出す機能がないんじゃない?
493デフォルトの名無しさん
2024/08/29(木) 09:33:53.27ID:1jszJs3n494デフォルトの名無しさん
2024/08/29(木) 12:29:33.60ID:CydvL0rR シャドウイングがない言語は不便すぎるから有るのは正しい
495デフォルトの名無しさん
2024/08/29(木) 12:50:47.36ID:OEtxKPAo >>486
async awaitをやさしく解説してください
async awaitをやさしく解説してください
496デフォルトの名無しさん
2024/08/29(木) 13:07:04.37ID:YXIyrRhD せんでええよ
497デフォルトの名無しさん
2024/08/29(木) 13:32:35.20ID:MmpSTGjT https://rust-lang.github.io/unsafe-code-guidelines/introduction.html
こんなのあるんだ、まだ中身スッカスカだけど
こんなのあるんだ、まだ中身スッカスカだけど
498デフォルトの名無しさん
2024/08/29(木) 14:09:44.24ID:G41Drf1I async (∩゚д゚)アーアー
await 聴こえなーいΩ\ζ°)チーン
await 聴こえなーいΩ\ζ°)チーン
499デフォルトの名無しさん
2024/08/29(木) 14:12:39.25ID:W3gDNWMh asyncの一番難しいとこは発音だな
間違えてる日本人が多い
間違えてる日本人が多い
500デフォルトの名無しさん
2024/08/29(木) 14:49:29.45ID:a4VXQbqA501デフォルトの名無しさん
2024/08/29(木) 19:49:23.69ID:dbGPGAjw Rustの非同期が非常に軽く上手くいってる理由は簡素であることかな
futureの構築とfutureの実行が明確に分離されている
構築で返されるのは単なる構造体の値でありヒープ利用を前提としない
実行はポーリングしないと何も進まない簡素さ
asyncタスクはステートマシンによるコルーチンとして実装されている
つまり個別のスタックを必要とせずに動くためメモリリソースの点でも有利となってるね
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に戻ったわ。
cmakeのバージョン変化に嫌気して素のgnu makeに戻ったわ。
504デフォルトの名無しさん
2024/08/29(木) 23:20:35.98ID:jTB6+YRF505デフォルトの名無しさん
2024/08/30(金) 01:16:51.32ID:1dn+3XQv https://en.wikipedia.org/wiki/Region-based_memory_management
region, zone, arena, areaと呼ばれると書いてあるし言うほど間違いじゃないんじゃね
むしろ”闘技場”に驚いたわ
region, zone, arena, areaと呼ばれると書いてあるし言うほど間違いじゃないんじゃね
むしろ”闘技場”に驚いたわ
506デフォルトの名無しさん
2024/08/30(金) 01:40:41.30ID:1MZVdBLH 両方あるんか
arenaは知ってたけどareaでも意味通じるから迷ってた
arenaは知ってたけどareaでも意味通じるから迷ってた
507デフォルトの名無しさん
2024/08/30(金) 02:21:05.28ID:71k4+v+4 areaだと一般用語の~エリアと曖昧になりやすいせいかarenaと呼ばれることが多いかな
特にRustではその手の各種クレートはxxx-arenaと名付けられているね
そのため「そこはアリーナ系を使おう」だけで話が通じると思う
特にRustではその手の各種クレートはxxx-arenaと名付けられているね
そのため「そこはアリーナ系を使おう」だけで話が通じると思う
508デフォルトの名無しさん
2024/08/30(金) 13:24:19.84ID:742oYIEC509デフォルトの名無しさん
2024/08/30(金) 14:03:33.10ID:00JO0I50 高階トレイト教会
510デフォルトの名無しさん
2024/08/30(金) 18:16:40.82ID:FuTFI1jb https://japan.zdnet.com/article/35223295/2/
> LinuxへのRust言語の導入の話になると、Torvalds氏は採用のペースが上がらないことに失望感を示した。
> 「更新が思ったほど速く進んでいないが、問題の一端は、昔からのカーネル開発者が『C』に慣れていて、Rustを知らないことにある。彼らは、ある面で大きく異なる新しい言語を学ばなければならないことを、あまり歓迎していない。そのため、Rustに関しては多少の反発がある」
> LinuxへのRust言語の導入の話になると、Torvalds氏は採用のペースが上がらないことに失望感を示した。
> 「更新が思ったほど速く進んでいないが、問題の一端は、昔からのカーネル開発者が『C』に慣れていて、Rustを知らないことにある。彼らは、ある面で大きく異なる新しい言語を学ばなければならないことを、あまり歓迎していない。そのため、Rustに関しては多少の反発がある」
511デフォルトの名無しさん
2024/08/30(金) 18:18:32.29ID:vU8F7vBm まあ既存のエンジニアにRust学ばせるんじゃなくRustやりたいってヤツが実績積んで参加すべきだわな
512デフォルトの名無しさん
2024/08/30(金) 18:22:28.02ID:JuI4pVFu 昔ながらのカーネル開発者は賢いからCで良いんだよな
新参のCまともに書けないバカがカーネルにいっちょ噛みするためにRust推してみたけど、本人はRustわかる程度の知能はあるがカーネル理解できる程の知能はないからカーネル周り書けず、他人にRust勉強しろと喚くことしか出来ない
新参のCまともに書けないバカがカーネルにいっちょ噛みするためにRust推してみたけど、本人はRustわかる程度の知能はあるがカーネル理解できる程の知能はないからカーネル周り書けず、他人にRust勉強しろと喚くことしか出来ない
513デフォルトの名無しさん
2024/08/30(金) 18:27:03.74ID:r5yUcnGF C++の苦痛を経験しないと有難みがわからないのがRustだからな。linuxカーネルがC++を採用していたらすんなり移行してたかも
514デフォルトの名無しさん
2024/08/30(金) 18:42:19.31ID:vU8F7vBm C++なんてバグの温床だから採用しないのは正解
515デフォルトの名無しさん
2024/08/30(金) 19:05:19.61ID:QrO3wi5D >昔ながらのカーネル開発者は賢いからCで良い
+1
+1
516デフォルトの名無しさん
2024/08/30(金) 19:08:04.69ID:QrO3wi5D >linuxカーネルがC++を採用していたらすんなり移行
これは絶対無い
むしろC**使われてるとRust化から遠ざかる
断言出来る
RustとC++の相性は最悪
これは絶対無い
むしろC**使われてるとRust化から遠ざかる
断言出来る
RustとC++の相性は最悪
517デフォルトの名無しさん
2024/08/30(金) 19:21:09.42ID:FuTFI1jb かつてC++をボロクソに叩いていたLinusが、何でRustを許したのかよくわからない
518デフォルトの名無しさん
2024/08/30(金) 19:35:01.93ID:00JO0I50 Rust for Linuxってout-of-treeカーネルモジュールをRustで書けるってだけでは?
それすらも思ったほど書く人がいなかったってことを言ってるんだろうか
それすらも思ったほど書く人がいなかったってことを言ってるんだろうか
519デフォルトの名無しさん
2024/08/30(金) 19:51:34.75ID:ePNDldoR いや書きたい人はたくさんいるし、実際書かれてるけどそれを本家に取り込む際にメンテナが拒否するって話
例えば
Rustドライバを書くための基盤となるユーティリティを追加したい → 実際のドライバで使われていないユーティリティは追加しない
ならドライバとユーティリティを一緒に追加したい → パッチが大きすぎるからレビューしない
みたいなのとか
この辺見ると実際にRustドライバの作者がカーネルメンテナの何に不満を持ってるかわかるよ
(この人はApple Silicon用のGPUドライバをRustで書いてる人)
https://vt.social/@lina/113045455229442533
例えば
Rustドライバを書くための基盤となるユーティリティを追加したい → 実際のドライバで使われていないユーティリティは追加しない
ならドライバとユーティリティを一緒に追加したい → パッチが大きすぎるからレビューしない
みたいなのとか
この辺見ると実際にRustドライバの作者がカーネルメンテナの何に不満を持ってるかわかるよ
(この人はApple Silicon用のGPUドライバをRustで書いてる人)
https://vt.social/@lina/113045455229442533
520デフォルトの名無しさん
2024/08/30(金) 20:29:51.47ID:J18stTwv >>510
糞言語ってことじゃねw
糞言語ってことじゃねw
521デフォルトの名無しさん
2024/08/30(金) 21:40:23.58ID:9WnxEAZW rustでファイルシステム扱うAPIを入れる活動に
メンテナから難癖つけられてうんざりしたので
下りるという人が出たらしいので
政治レイヤーで色々あるんだろうなあ
メンテナから難癖つけられてうんざりしたので
下りるという人が出たらしいので
政治レイヤーで色々あるんだろうなあ
522デフォルトの名無しさん
2024/08/30(金) 22:55:20.95ID:jcHw3qvA523デフォルトの名無しさん
2024/08/31(土) 03:26:17.69ID:bV8CK+h4 >>517
新しいものをなんでも否定していたら「老害」認定されるから、ここはちょっくら軟化しておこうかな、みたいな感じじゃね。
新しいものをなんでも否定していたら「老害」認定されるから、ここはちょっくら軟化しておこうかな、みたいな感じじゃね。
524デフォルトの名無しさん
2024/08/31(土) 04:29:19.80ID:TuWOabX/525デフォルトの名無しさん
2024/08/31(土) 06:58:45.77ID:sI0PgNnZ 信者が家主に対してやっている事はこれに近い
最近、水道企業団の職員や委託業者を装い、「水質や水道管の検査に来ました」などと言って高額な浄水器の購入や水道管の取替えなどをすすめられた、
水道管の調査と称して管が汚れているから水道水が危険と言って給水管清掃の契約をすすめられた。 などの事例もあります。
最近、水道企業団の職員や委託業者を装い、「水質や水道管の検査に来ました」などと言って高額な浄水器の購入や水道管の取替えなどをすすめられた、
水道管の調査と称して管が汚れているから水道水が危険と言って給水管清掃の契約をすすめられた。 などの事例もあります。
526デフォルトの名無しさん
2024/08/31(土) 08:04:20.66ID:/qocMB6l リーナス自身がRustで何か作って見せたら流れ変わるかもな
まあそんなことは無いんだろうけど
まあそんなことは無いんだろうけど
527デフォルトの名無しさん
2024/08/31(土) 08:34:49.06ID:RhJ/yuCQ Rust がどうこうというのを抜きにしてひとつのプロジェクトにいろんな言語が混在するのは面倒さが生じるというのはある。
Linux に乗ろうとするなら Linux の方針に従えというのは当然の判断だろう。
受け入れてしまったらメンテナンスしなきゃならんし、メンテナンスできないものを導入するのは問題だ。
あくまでも Rust の急進的導入をしたいというなら fork するくらいの気概を見せて欲しいところ。
Linux に乗ろうとするなら Linux の方針に従えというのは当然の判断だろう。
受け入れてしまったらメンテナンスしなきゃならんし、メンテナンスできないものを導入するのは問題だ。
あくまでも Rust の急進的導入をしたいというなら fork するくらいの気概を見せて欲しいところ。
528デフォルトの名無しさん
2024/08/31(土) 08:38:08.89ID:CwbqwO1Y >>527
既にRustのコードが入っている現実を無視して妄想が激しいな
既にRustのコードが入っている現実を無視して妄想が激しいな
529デフォルトの名無しさん
2024/08/31(土) 09:01:31.35ID:ppLeuuZs Rustのコード入れたくないまでならまだ分かるが
(Rustドライバ導入の前段階として)既存のサブシステムのバグを直したいと言ったら
今あるドライバではそのバグは踏んでないから直す必要なし、って言われたりしてるらしく
さすがに自分のCのコードのクオリティくらいちゃんと上げろよ、とは思う
(Rustドライバ導入の前段階として)既存のサブシステムのバグを直したいと言ったら
今あるドライバではそのバグは踏んでないから直す必要なし、って言われたりしてるらしく
さすがに自分のCのコードのクオリティくらいちゃんと上げろよ、とは思う
530デフォルトの名無しさん
2024/08/31(土) 09:13:30.90ID:TZjbwynp 考え方が違うんだよね
C/C++では現在のコードの使い方の範囲内では(ギリギリ)バグを回避できているので大丈夫と考える
そして後に機能追加や改修が入ったときにそのギリギリのところを踏んでしまって致命的バグが露呈する
このダメな考えな人がまだ多くいる
C/C++では現在のコードの使い方の範囲内では(ギリギリ)バグを回避できているので大丈夫と考える
そして後に機能追加や改修が入ったときにそのギリギリのところを踏んでしまって致命的バグが露呈する
このダメな考えな人がまだ多くいる
531デフォルトの名無しさん
2024/08/31(土) 09:22:22.01ID:oPSFGvVw RustほどC++と相性の悪い言語はないね。
C++との相性を考えるならNimの方が良い。
勘違いしないで欲しいんだがRustとCの相性はとても良い。
C++との相性を考えるならNimの方が良い。
勘違いしないで欲しいんだがRustとCの相性はとても良い。
532デフォルトの名無しさん
2024/08/31(土) 09:25:59.57ID:oPSFGvVw533デフォルトの名無しさん
2024/08/31(土) 09:27:58.78ID:oPSFGvVw534デフォルトの名無しさん
2024/08/31(土) 09:38:02.88ID:fX2PgVRG 各OSで脆弱性報告が無くならないのはなぜか?
思い込みの自信でプログラミングしていてバグを踏むからである
思い込みの自信でプログラミングしていてバグを踏むからである
535デフォルトの名無しさん
2024/08/31(土) 09:42:22.13ID:siamFKDm FFIがそもそもCのAPI以外が難しい
C#やGoでも他言語の呼び出しはCのAPIを通すのが一般的で、メソッドをもったクラスや構造体、抽象的なインタフェースなどを言語間で翻訳できるものはあまりない
(C++とPythonを連携させるpybind11や、RustとPythonを連携させるPyO3などはうまくやってる例)
そういう点でC++と相性の良いものってだいぶ限られると思う
C APIを通すならどの言語からでも呼べるけど、C++のAPIを翻訳するには言語あるいはライブラリによるサポートが必要
C#やGoでも他言語の呼び出しはCのAPIを通すのが一般的で、メソッドをもったクラスや構造体、抽象的なインタフェースなどを言語間で翻訳できるものはあまりない
(C++とPythonを連携させるpybind11や、RustとPythonを連携させるPyO3などはうまくやってる例)
そういう点でC++と相性の良いものってだいぶ限られると思う
C APIを通すならどの言語からでも呼べるけど、C++のAPIを翻訳するには言語あるいはライブラリによるサポートが必要
536デフォルトの名無しさん
2024/08/31(土) 09:57:33.39ID:siamFKDm 「RustとC++は相性が悪い」というよりも「C++と相性が良いのはNimなどに限られる」という感じじゃないかと思う
そういやC++の後継を目指してたCarbonってどうなってるんだろ
そういやC++の後継を目指してたCarbonってどうなってるんだろ
537デフォルトの名無しさん
2024/08/31(土) 10:01:46.87ID:gxBoDZic Nimのような弱小言語を使う人は今後も極少数に限られるから意味がないよな
538デフォルトの名無しさん
2024/08/31(土) 10:04:38.88ID:IaoAItNz C++のメモリ管理とNimのメモリ管理はは全く異なっている
相性がいいなんて話はまやかし
相性がいいなんて話はまやかし
539デフォルトの名無しさん
2024/08/31(土) 10:08:52.28ID:oPSFGvVw >RustとPythonを連携させるPyO3
これはC++要素無いだろ
これはC++要素無いだろ
540デフォルトの名無しさん
2024/08/31(土) 10:28:40.41ID:siamFKDm >>539
C++に限った話ではなく、クラスやメソッドといった概念を異なる言語間 (ここではRustとPython) でうまく翻訳できてる例として書いた
他だと、例えばC#とRustを連携させる csbindgen はFFIをしやすくはしてくれるけど、メソッド付きのクラスなどは作れずAPIはほぼCになるといった感じ
C++に限った話ではなく、クラスやメソッドといった概念を異なる言語間 (ここではRustとPython) でうまく翻訳できてる例として書いた
他だと、例えばC#とRustを連携させる csbindgen はFFIをしやすくはしてくれるけど、メソッド付きのクラスなどは作れずAPIはほぼCになるといった感じ
541デフォルトの名無しさん
2024/08/31(土) 10:40:19.97ID:lPS1m7oR >>530
まだ顕在化していないものに対してあれこれ考えるのは
難しいことができる「才能」とは違った「センス」が必要なんだよね
そして学校でも企業でも才能で判断することはやっているけど
センスに関しては無頓着というか、センスに気づくにもセンスが要るということで
そもそもそういうものがあることを分かっていない人が多い
まだ顕在化していないものに対してあれこれ考えるのは
難しいことができる「才能」とは違った「センス」が必要なんだよね
そして学校でも企業でも才能で判断することはやっているけど
センスに関しては無頓着というか、センスに気づくにもセンスが要るということで
そもそもそういうものがあることを分かっていない人が多い
542デフォルトの名無しさん
2024/08/31(土) 11:37:38.42ID:oPSFGvVw543デフォルトの名無しさん
2024/08/31(土) 12:39:33.76ID:e6lCluh3 カーネルメンテナーの中にはここにいるような
rust信者は死ねとか思ってる人いるんやろ
rust信者は死ねとか思ってる人いるんやろ
544デフォルトの名無しさん
2024/08/31(土) 12:42:56.23ID:oPSFGvVw RustがC++と相性が良いと思ってる(だけじゃなくてそう喚き散らしてる)Rust信者は死ねば良いよ
545デフォルトの名無しさん
2024/08/31(土) 13:15:38.97ID:siamFKDm >>542
中身のない否定じゃなくて役に立つこと書いて
PyO3も内部的にはPythonのC APIを通してFFIしてることは分かってる
それをライブラリ側で抽象化してRustのメソッド付きの型をPythonのオブジェクトに返還してるので、そこそこうまく翻訳できてると言って良いんじゃない?
中身のない否定じゃなくて役に立つこと書いて
PyO3も内部的にはPythonのC APIを通してFFIしてることは分かってる
それをライブラリ側で抽象化してRustのメソッド付きの型をPythonのオブジェクトに返還してるので、そこそこうまく翻訳できてると言って良いんじゃない?
546デフォルトの名無しさん
2024/08/31(土) 14:19:45.17ID:v65y/3af カーネルデベロッパはRustよりZigが好きだと思うよ
ZigこそCの置き換えを担う
RustはC++の置き換えとして役割を全うしてくれ
ZigこそCの置き換えを担う
RustはC++の置き換えとして役割を全うしてくれ
547デフォルトの名無しさん
2024/08/31(土) 14:34:53.19ID:69SUV3M5 企業や国防総省や各ソフトウェアプロジェクト等が解決したい、人間の手に依らない、様々な安全性の保証を、Zigは解決しないことが、企業スポンサーの量質や、政府による支持の差となっています。
548デフォルトの名無しさん
2024/08/31(土) 16:51:39.82ID:fbG74reB 言語一決定戦
549デフォルトの名無しさん
2024/08/31(土) 18:46:49.67ID:siamFKDm Rustのライブラリまわりの現況ってどう思ってる?
プロジェクトでライブラリを使うと、他の言語に比べて依存ライブラリが多くなりがち&1.0未満のライブラリが多いな気がしてるけど、みんな気にしないもの?
プロジェクトでライブラリを使うと、他の言語に比べて依存ライブラリが多くなりがち&1.0未満のライブラリが多いな気がしてるけど、みんな気にしないもの?
550デフォルトの名無しさん
2024/08/31(土) 19:46:25.63ID:E1cdB3xT >RustはC++の置き換えとして
まだこんなこと言ってる馬鹿がいるのか
まだこんなこと言ってる馬鹿がいるのか
551デフォルトの名無しさん
2024/08/31(土) 19:47:21.29ID:E1cdB3xT >>549
cratesは破綻してる
cratesは破綻してる
552デフォルトの名無しさん
2024/08/31(土) 20:11:59.68ID:Or5Sc8N3 >>549
考え方を180度変えるとわかりやすい
クレートは可能ならば小さければ小さいほど良い
並行してコンパイルできるメリットがあるだけでなく
重複コードもなるべく無くせるメリットもある
特にunsafeを含む基礎的な汎用な機能の場合に
大きなライブラリにその同じ機能を持つコードが各々に別々に入ると
unsafeの監視も各々で個別に無駄に重複して行う必要となってしまう
この点でも小さく分けたほうが望ましい
考え方を180度変えるとわかりやすい
クレートは可能ならば小さければ小さいほど良い
並行してコンパイルできるメリットがあるだけでなく
重複コードもなるべく無くせるメリットもある
特にunsafeを含む基礎的な汎用な機能の場合に
大きなライブラリにその同じ機能を持つコードが各々に別々に入ると
unsafeの監視も各々で個別に無駄に重複して行う必要となってしまう
この点でも小さく分けたほうが望ましい
553デフォルトの名無しさん
2024/08/31(土) 20:44:50.30ID:S/IPQmeQ メンテナンスコストは増えると思う
Outdatedになってないかチェックしたり、ライブラリ間の依存のせいでバージョン上げられなかったり
Outdatedになってないかチェックしたり、ライブラリ間の依存のせいでバージョン上げられなかったり
554デフォルトの名無しさん
2024/08/31(土) 20:53:33.20ID:LXO9pQJ0 え、ここそのレベルの方々だったんだ…
ドン引き
ドン引き
555デフォルトの名無しさん
2024/08/31(土) 21:35:41.49ID:aMsyxey6556デフォルトの名無しさん
2024/09/01(日) 10:01:28.26ID:ydrH9psJ 依存の数ならRustは多い方じゃない?
tokioあたりを入れるとそれだけで数十のライブラリに依存するし
Goは知らないけど、Pythonはそこまで多くならないと思う
JSも依存が多くなりがちで、依存パッケージに脆弱性やマルウェアが仕込まれることが時折問題になってるけど、Rust界隈だとその辺りの問題はどう認識されてるのかなと思った次第です
tokioあたりを入れるとそれだけで数十のライブラリに依存するし
Goは知らないけど、Pythonはそこまで多くならないと思う
JSも依存が多くなりがちで、依存パッケージに脆弱性やマルウェアが仕込まれることが時折問題になってるけど、Rust界隈だとその辺りの問題はどう認識されてるのかなと思った次第です
557デフォルトの名無しさん
2024/09/01(日) 10:17:26.39ID:zf7mJz3x breaking change と semver violation の話じゃないかなぁ < メンテナンスコスト
今はツールができて 少しはましとはいえ
メチャクチャ難しい
今はツールができて 少しはましとはいえ
メチャクチャ難しい
558デフォルトの名無しさん
2024/09/01(日) 10:30:23.05ID:kOiIMmbX 数個〜20個程度の依存と100〜200個の依存と同じわけないじゃん
それに鉄板ライブラリと考えられてたものでも2〜3年するとメンテ状況が怪しくなったり無駄な破壊的変更がされたりするのが結構あるから他の言語と比べるとはるかに手間がかかるよ
現段階ではRustの最大の弱点
弱点以上にメリットを見出せないなら本格的に使うのはお勧めしない
それに鉄板ライブラリと考えられてたものでも2〜3年するとメンテ状況が怪しくなったり無駄な破壊的変更がされたりするのが結構あるから他の言語と比べるとはるかに手間がかかるよ
現段階ではRustの最大の弱点
弱点以上にメリットを見出せないなら本格的に使うのはお勧めしない
559デフォルトの名無しさん
2024/09/01(日) 10:34:17.81ID:t3ZzK7/4 実体験として、PythonやDartでは依存関係地獄にハマって解決に苦労したことあるけど
Rustは今のところないな
Rustは今のところないな
560デフォルトの名無しさん
2024/09/01(日) 10:48:37.08ID:+SJIq2Go >>558
その説明だとnodejsなんか使い物にならないのでは
その説明だとnodejsなんか使い物にならないのでは
561デフォルトの名無しさん
2024/09/01(日) 10:50:08.09ID:F+GfMvv5 chronoなんかも未だに1.0未満だし2年ほどメンテナンス停止にしてたことがあるしな (今は再開してる)
時刻やタイムゾーンを扱いたい場面は多いだろうから、こういうのは安定化または標準ライブラリでサポートして欲しいとは思う
時刻やタイムゾーンを扱いたい場面は多いだろうから、こういうのは安定化または標準ライブラリでサポートして欲しいとは思う
562デフォルトの名無しさん
2024/09/01(日) 11:09:10.42ID:AB63LC10 別に致命的な脆弱性でもなければ無理に上げる必要もないしな
普段はdependabotに自動で上げさせといて、
破壊的変更があるやつは年1回くらいで追従する感じにしてるけど
特に手間と思ったこともないな
普段はdependabotに自動で上げさせといて、
破壊的変更があるやつは年1回くらいで追従する感じにしてるけど
特に手間と思ったこともないな
563デフォルトの名無しさん
2024/09/01(日) 11:20:43.92ID:JCWqhatm >>561
バージョン番号1.0未満かどうかという表面上のどうでもいい問題にこだわるのはおかしい
chronoのようなほとんどのプログラムで使われない機能を標準ライブラリに入れようという提案は感覚が変
あとRustで安定化とはstableかexperimentalかの区別でstableになることだよね
バージョン番号1.0未満かどうかという表面上のどうでもいい問題にこだわるのはおかしい
chronoのようなほとんどのプログラムで使われない機能を標準ライブラリに入れようという提案は感覚が変
あとRustで安定化とはstableかexperimentalかの区別でstableになることだよね
564デフォルトの名無しさん
2024/09/01(日) 11:30:01.13ID:mI2+lAFs 表面上って…
565デフォルトの名無しさん
2024/09/01(日) 11:33:21.84ID:F+GfMvv5 APIの破壊的変更を今後行う可能性があるかの表明にはなるだろ
1.0であれば、少なくともメジャーバージョンが変わらないうちは後方互換性を維持するという意思表示になる
仕組みで防いでるわけではないし、「共通認識としてそう受け取られる」という話には過ぎないけど
1.0であれば、少なくともメジャーバージョンが変わらないうちは後方互換性を維持するという意思表示になる
仕組みで防いでるわけではないし、「共通認識としてそう受け取られる」という話には過ぎないけど
566デフォルトの名無しさん
2024/09/01(日) 11:50:19.16ID:wKqEGZJE >chronoのようなほとんどのプログラムで使われない機能を
こんなこと書くやつは何書いても信用度ゼロ
”偽情報注意!”ってやつだな
こんなこと書くやつは何書いても信用度ゼロ
”偽情報注意!”ってやつだな
567デフォルトの名無しさん
2024/09/01(日) 12:08:43.54ID:cwes3csq chronoなんて日時を扱わない限り使うことないだろ
特定の分野だと必須だろうが
Rustが使われる分野は広いからね
特定の分野だと必須だろうが
Rustが使われる分野は広いからね
568デフォルトの名無しさん
2024/09/01(日) 12:21:28.53ID:Coh3zEx3 >>565
いや、ならんでしょ
結局破壊的変更があれば2.0になるわけで、実際5.0とか10.0みたいなのもあるし
まぁこの作者が1.0を宣言するんならもう十分安定してるんだろう、みたいなのはあるけどな
そういう背景情報なしなら1.0と0.1の違いは特にないと思うよ
いや、ならんでしょ
結局破壊的変更があれば2.0になるわけで、実際5.0とか10.0みたいなのもあるし
まぁこの作者が1.0を宣言するんならもう十分安定してるんだろう、みたいなのはあるけどな
そういう背景情報なしなら1.0と0.1の違いは特にないと思うよ
569デフォルトの名無しさん
2024/09/01(日) 12:26:37.18ID:ySw/MmvM バージョン0.x.yは cargo tree | grep v0 で確認できて
大量の基盤ライブラリが見つかるけどそれで困ったことはないな
>>565
そういう守るべきマナーとしては
0.x指定しておけば破壊的変更はないとされているので大丈夫
クレイトを作ってる側は破壊的変更があればx←x+1と上げるため
大量の基盤ライブラリが見つかるけどそれで困ったことはないな
>>565
そういう守るべきマナーとしては
0.x指定しておけば破壊的変更はないとされているので大丈夫
クレイトを作ってる側は破壊的変更があればx←x+1と上げるため
570デフォルトの名無しさん
2024/09/01(日) 12:51:19.19ID:wKqEGZJE >>567
chronoとtimeを合わせたダウンロード数見てみ
トップ10レベルだから
regexやserdeやrandやclapよりもずっと多い
君が書いた内容は
「regexなんて正規表現を扱わない限り使うことないだろ
特定の分野だと必須だろうが
Rustが使われる分野は広いからね」
とか
「serdeなんてシリアライズ/デシリアライズしない限り使うことないだろ
特定の分野だと必須だろうが
Rustが使われる分野は広いからね」
とかと同じレベル
どのくらい馬鹿なこと書いたかわかったかな?
chronoとtimeを合わせたダウンロード数見てみ
トップ10レベルだから
regexやserdeやrandやclapよりもずっと多い
君が書いた内容は
「regexなんて正規表現を扱わない限り使うことないだろ
特定の分野だと必須だろうが
Rustが使われる分野は広いからね」
とか
「serdeなんてシリアライズ/デシリアライズしない限り使うことないだろ
特定の分野だと必須だろうが
Rustが使われる分野は広いからね」
とかと同じレベル
どのくらい馬鹿なこと書いたかわかったかな?
571デフォルトの名無しさん
2024/09/01(日) 12:57:25.84ID:y1BosOiy Linusのリンク貼ってた人いたけどそこにも描いてある
バージョン番号に意味は無い
と
バージョン番号に意味は無い
と
572デフォルトの名無しさん
2024/09/01(日) 13:02:17.26ID:y1BosOiy573デフォルトの名無しさん
2024/09/01(日) 13:06:30.98ID:y1BosOiy574デフォルトの名無しさん
2024/09/01(日) 13:13:51.37ID:ydrH9psJ >>571
それは自分のプロジェクト (Linux) におけるバージョン番号の意味を述べてるもので、ソフトウェアライブラリ一般を指して言ったものではなくない?
それは自分のプロジェクト (Linux) におけるバージョン番号の意味を述べてるもので、ソフトウェアライブラリ一般を指して言ったものではなくない?
575デフォルトの名無しさん
2024/09/01(日) 13:26:50.54ID:t3ZzK7/4 v2.0が出た後も末永くv1.xブランチでメンテされ続けるなら意味あるけど
そんなの全く期待できないよね
そんなの全く期待できないよね
576デフォルトの名無しさん
2024/09/01(日) 13:29:19.13ID:ydrH9psJ 乱数生成ですら外部クレートが必要になるんだから、そういう言語なんだと割り切ってはいるけど
577デフォルトの名無しさん
2024/09/01(日) 13:34:18.52ID:NN/ZIFle >>573
インターフェイスの互換性はある程度は機械的検証が出来るかもしれないけど挙動の互換性まで検証するのは非現実的だろ。
バグで制約が緩かったのを修正した (ドキュメント通りに使っていれば問題ない) みたいなケースだと機械的には非互換に見えることもあるだろうし。
そこらへんは使う側でバージョンの固定をするしか仕方ない。
いや、もちろん仕組みを構築できるならそのほうがいいよ。 でも、出来ないだろ? って話でさ。
インターフェイスの互換性はある程度は機械的検証が出来るかもしれないけど挙動の互換性まで検証するのは非現実的だろ。
バグで制約が緩かったのを修正した (ドキュメント通りに使っていれば問題ない) みたいなケースだと機械的には非互換に見えることもあるだろうし。
そこらへんは使う側でバージョンの固定をするしか仕方ない。
いや、もちろん仕組みを構築できるならそのほうがいいよ。 でも、出来ないだろ? って話でさ。
578デフォルトの名無しさん
2024/09/01(日) 13:57:51.22ID:N2jhi4ch >>576
Rustの標準ライブラリにランダムあるよ
HashMapなどのデフォルトハッシュで使われてるのご存知でしょ
use std::hash::{BuildHasher, RandomState};
let random_seed = RandomState::new().hash_one(0_u64);
Rustの標準ライブラリにランダムあるよ
HashMapなどのデフォルトハッシュで使われてるのご存知でしょ
use std::hash::{BuildHasher, RandomState};
let random_seed = RandomState::new().hash_one(0_u64);
579デフォルトの名無しさん
2024/09/01(日) 14:22:12.72ID:MnUgJTxK >>576
playgorund とか paiza とかで use crate 出来ないのがあると面倒やね
playgorund とか paiza とかで use crate 出来ないのがあると面倒やね
580デフォルトの名無しさん
2024/09/01(日) 14:23:04.37ID:ydrH9psJ >>578
盲点だった
ハッシュマップが乱数を使うのは言われてみればその通りだ
けどこれってHashMapのための機能だし、「この方法でも乱数を得られる」であって、乱数をつくるために提供されてるものではなくない?
英語でも調べたけど、Rustで乱数を生成する方法を調べたらrandクレートの方が最初にヒットする
盲点だった
ハッシュマップが乱数を使うのは言われてみればその通りだ
けどこれってHashMapのための機能だし、「この方法でも乱数を得られる」であって、乱数をつくるために提供されてるものではなくない?
英語でも調べたけど、Rustで乱数を生成する方法を調べたらrandクレートの方が最初にヒットする
581デフォルトの名無しさん
2024/09/01(日) 14:49:06.86ID:N2jhi4ch >>580
いずれも環境に応じて最終的にはgetrandomシステムコールを呼んだり/dev/urandomを読んだりするだけだから機能としては同じだね
何度も使うならそれをシード値としてxorshiftなどするだけなのでstdだけで使えるメリットは大きいよ
いずれも環境に応じて最終的にはgetrandomシステムコールを呼んだり/dev/urandomを読んだりするだけだから機能としては同じだね
何度も使うならそれをシード値としてxorshiftなどするだけなのでstdだけで使えるメリットは大きいよ
582デフォルトの名無しさん
2024/09/01(日) 14:58:42.54ID:NN/ZIFle 必要な乱数の性質は状況によってかなり違うから安易に (ユーザの検討が不十分になりそうな形で) 特定の実装を使わせてしまうのはよくないと思う。
基本的な枠組みを定めたトレイトが標準にあると便利だろうとは思うし
そのトレイトの利用例としてひとつくらいの簡易実装は有っても良いかなとは思うけど
皆でひとつの標準を利用しようという性質のもんじゃないでしょ。
乱数は標準に入れるモチベーションはやや低いんじゃないかなぁ。
標準に入れるべきだと思うものだとなんかもっと他にあるでしょ。
基本的な枠組みを定めたトレイトが標準にあると便利だろうとは思うし
そのトレイトの利用例としてひとつくらいの簡易実装は有っても良いかなとは思うけど
皆でひとつの標準を利用しようという性質のもんじゃないでしょ。
乱数は標準に入れるモチベーションはやや低いんじゃないかなぁ。
標準に入れるべきだと思うものだとなんかもっと他にあるでしょ。
583デフォルトの名無しさん
2024/09/01(日) 16:10:10.29ID:f0nFMo6o >>54
RustがCより速くなるベンチマークは見たことがない
Nim2.0のORCは明示的にオブジェクトプールを使ったプログラミングが必要ですが
ベンチマークがCより2倍以上速くなって、特にハードなリアルタイムシステム向け
のチューニングもできるようになってるみたい
https://zenn.dev/dum...icles/af2b2b9f8fd890
Nim2.0がCより2倍以上速くなって、しかもORCでメモリ安全も担保されているなら
Rustを使う意味がなくなると思うのですが、このベンチマークは本当なのでしょうか?
RustがCより速くなるベンチマークは見たことがない
Nim2.0のORCは明示的にオブジェクトプールを使ったプログラミングが必要ですが
ベンチマークがCより2倍以上速くなって、特にハードなリアルタイムシステム向け
のチューニングもできるようになってるみたい
https://zenn.dev/dum...icles/af2b2b9f8fd890
Nim2.0がCより2倍以上速くなって、しかもORCでメモリ安全も担保されているなら
Rustを使う意味がなくなると思うのですが、このベンチマークは本当なのでしょうか?
584デフォルトの名無しさん
2024/09/01(日) 16:37:38.74ID:ViuTOdnl Cより何倍も速い詐欺の話は他のスレでやろう
Rustと関係ないので
Rustと関係ないので
585デフォルトの名無しさん
2024/09/01(日) 16:58:53.35ID:FX04qzI+ Zigは1.0になってから出直せ!
crateはpre-1.0でもそういうもんなのでヨシ!
はーくだらね
crateはpre-1.0でもそういうもんなのでヨシ!
はーくだらね
586デフォルトの名無しさん
2024/09/01(日) 17:07:22.02ID:ydrH9psJ 言語とライブラリは流石に違わないか
ライブラリは開発止まっても同分野の別のライブラリがあればそれに差し替えられる (最悪、元のライブラリをフォークしても良い) けど、言語仕様はそうもいかないだろ
ライブラリは開発止まっても同分野の別のライブラリがあればそれに差し替えられる (最悪、元のライブラリをフォークしても良い) けど、言語仕様はそうもいかないだろ
587デフォルトの名無しさん
2024/09/01(日) 17:08:31.34ID:ROff46JY 比較の対象にすらならない
Zigはasync awaitを断念して削除
Rustはasync awaitによりCPUコアをフル活用できて実際にクラウドやCDNなどネットインフラで使われている
Zigはasync awaitを断念して削除
Rustはasync awaitによりCPUコアをフル活用できて実際にクラウドやCDNなどネットインフラで使われている
588デフォルトの名無しさん
2024/09/01(日) 17:48:17.89ID:f0nFMo6o >>584
詐欺の証明ができないのであればRustはNim2.0より劣る言語と
理解してもよろしいでしょうか?
>Rustと関係ないので
ORCでメモリ安全を担保できてCより2倍以上速くなるのであれば、
メモリ安全がありCより遅いRustは言語選択時の比較対象として関係あるだろ
詐欺の証明ができないのであればRustはNim2.0より劣る言語と
理解してもよろしいでしょうか?
>Rustと関係ないので
ORCでメモリ安全を担保できてCより2倍以上速くなるのであれば、
メモリ安全がありCより遅いRustは言語選択時の比較対象として関係あるだろ
589デフォルトの名無しさん
2024/09/01(日) 18:02:28.26ID:YFaA0adv 何でもできるC言語より速いと主張しだしたらそれは変な宗教だから相手にしてはダメ
しかもNimはC言語へトランスパイルされるんだろw
しかもNimはC言語へトランスパイルされるんだろw
590デフォルトの名無しさん
2024/09/01(日) 18:08:55.61ID:NN/ZIFle 雑に書いて十分に速いかってのと専門家が気合いを入れてチューニングをすれば最強に速いかってのは違う指標だろうし、仮に速さを比べるにしても想定を合わせないと意味がないよ。
591デフォルトの名無しさん
2024/09/01(日) 18:09:09.43ID:B8TxC8Ku CへトランスパイルされるならCより速くなってても不思議じゃないな
592デフォルトの名無しさん
2024/09/01(日) 18:15:39.95ID:tFzE2nE4 Rustは特殊なケースを持ち出さなくても
実際の実用ケースのほとんどで、Cと同じ速さ、もしくは、ほぼ同じ速さで、凝ったことをせずとも書けるから
IT業界が挙ってRustを支持した
実際の実用ケースのほとんどで、Cと同じ速さ、もしくは、ほぼ同じ速さで、凝ったことをせずとも書けるから
IT業界が挙ってRustを支持した
593デフォルトの名無しさん
2024/09/01(日) 18:34:18.72ID:ydrH9psJ 知らないから純粋な質問なんだけどnimって並行処理の安全性に強みはあるの?
個人的にRustで助かる部分だと思ってるので
メモリ周りは問題なさそう&所有権はRustより楽そう (代わりに意図せぬコピーが起こりやすい?) に思う
個人的にRustで助かる部分だと思ってるので
メモリ周りは問題なさそう&所有権はRustより楽そう (代わりに意図せぬコピーが起こりやすい?) に思う
594デフォルトの名無しさん
2024/09/01(日) 18:40:58.89ID:ydrH9psJ それとエラーの扱いやすさ
595デフォルトの名無しさん
2024/09/01(日) 19:43:48.04ID:f0nFMo6o >>590
じゃあ想定を合わせるためにCでもRustでもどっちでもいいから、下記のNim2.0のORCで明示的にオブジェクトプールを使ったプログラミングのベンチマークより速くできなかったら、今度こそ本当にRustはNim2.0より劣る言語と理解してもよろしいでしょうか?
Memory management strategy Time Peak Memory
object pooling 2.4s 251.504MiB
オブジェクトプール(5)
proc main =
let maxDepth = parseInt(paramStr(1))
const minDepth = 4
let stretchDepth = maxDepth + 1
var longLived: Pool # 5行目
let stree = makeTree(longLived, maxDepth)
echo("stretch tree of depth ", stretchDepth, "\t check ",
checkTree(stree))
let longLivedTree = makeTree(longLived, maxDepth)
var iterators = 1 shl maxDepth
for depth in countup(minDepth, maxDepth, 2):
var check = 0
for i in 1..iterators:
var shortLived: Pool # 14行目
check += checkTree(makeTree(shortLived, depth))
echo iterators, "\t trees of depth ", depth
iterators = iterators div 4
main()
じゃあ想定を合わせるためにCでもRustでもどっちでもいいから、下記のNim2.0のORCで明示的にオブジェクトプールを使ったプログラミングのベンチマークより速くできなかったら、今度こそ本当にRustはNim2.0より劣る言語と理解してもよろしいでしょうか?
Memory management strategy Time Peak Memory
object pooling 2.4s 251.504MiB
オブジェクトプール(5)
proc main =
let maxDepth = parseInt(paramStr(1))
const minDepth = 4
let stretchDepth = maxDepth + 1
var longLived: Pool # 5行目
let stree = makeTree(longLived, maxDepth)
echo("stretch tree of depth ", stretchDepth, "\t check ",
checkTree(stree))
let longLivedTree = makeTree(longLived, maxDepth)
var iterators = 1 shl maxDepth
for depth in countup(minDepth, maxDepth, 2):
var check = 0
for i in 1..iterators:
var shortLived: Pool # 14行目
check += checkTree(makeTree(shortLived, depth))
echo iterators, "\t trees of depth ", depth
iterators = iterators div 4
main()
596デフォルトの名無しさん
2024/09/01(日) 20:00:37.37ID:9GOpEruV はいはい
C/C++/Rustに勝ってから出直してきてね
スレ荒らしはダメよ
C/C++/Rustに勝ってから出直してきてね
スレ荒らしはダメよ
597デフォルトの名無しさん
2024/09/01(日) 20:08:43.57ID:ZXrp9Cnz わざわざ他言語のスレに来て噛み付かなきゃいけない時点で負けていると宣言しているようなもの
その言語のスレを盛況にすればいいのに
その言語のスレを盛況にすればいいのに
599デフォルトの名無しさん
2024/09/01(日) 20:12:17.24ID:pPmOnqPH Cより速い言語が本当に出現したのならば世界的なニュースになるのでここを荒らす必要なし
600デフォルトの名無しさん
2024/09/01(日) 20:18:33.83ID:f0nFMo6o601デフォルトの名無しさん
2024/09/01(日) 20:34:03.89ID:J5FWiNml CスレやC++スレへ行ってくればいいんじゃね
相手にしてくれるかもよ
相手にしてくれるかもよ
602デフォルトの名無しさん
2024/09/01(日) 20:36:25.69ID:FX04qzI+ RustスレでRust宣伝とかいう意味のないことやり続けた報い
603デフォルトの名無しさん
2024/09/01(日) 20:42:24.60ID:ydrH9psJ604デフォルトの名無しさん
2024/09/01(日) 20:43:24.75ID:f0nFMo6o このスレはNim2.0のORCで明示的にオブジェクトプールを使ったプログラミングのベンチマークより速い事を証明できないカスばっかだな
605デフォルトの名無しさん
2024/09/01(日) 20:47:46.74ID:f0nFMo6o606デフォルトの名無しさん
2024/09/01(日) 20:49:35.02ID:/rP62rMk 検索してみたがNim 2.0がCより速いという記事が一つも見つからなかったのでガセっぽい
記事が出るまでこのお話はお預けってことで
記事が出るまでこのお話はお預けってことで
607デフォルトの名無しさん
2024/09/01(日) 20:51:46.74ID:f0nFMo6o608デフォルトの名無しさん
2024/09/01(日) 20:53:27.80ID:Coh3zEx3609デフォルトの名無しさん
2024/09/01(日) 21:03:34.87ID:ydrH9psJ Nimの過去のものより速くなったとしか読めないし
補足として貼ってるリンクもベンチマークじゃなくて言語自体の説明や公式ページだし
自分で手を動かさずにその記事だけ読んでCより速いと言うのは妄想レベルでは
補足として貼ってるリンクもベンチマークじゃなくて言語自体の説明や公式ページだし
自分で手を動かさずにその記事だけ読んでCより速いと言うのは妄想レベルでは
610デフォルトの名無しさん
2024/09/01(日) 21:14:25.35ID:f0nFMo6o >>608
NimはCのソースコード吐けるからから、Nimの手動メモリ管理はCの手動メモリ管理と同じとして、Nim2.0のORCで明示的にオブジェクトプールを使ったプログラミングと比較した場合のベンチマークが2倍以上速くなってるからCより速いと言ってる
それが間違ってると主張したいのであれば、想定を合わせるためにCでもRustでもどっちでもいいから、さっきから何度も言ってるように速いベンチマークで証明すればいいだけだろ
NimはCのソースコード吐けるからから、Nimの手動メモリ管理はCの手動メモリ管理と同じとして、Nim2.0のORCで明示的にオブジェクトプールを使ったプログラミングと比較した場合のベンチマークが2倍以上速くなってるからCより速いと言ってる
それが間違ってると主張したいのであれば、想定を合わせるためにCでもRustでもどっちでもいいから、さっきから何度も言ってるように速いベンチマークで証明すればいいだけだろ
611デフォルトの名無しさん
2024/09/01(日) 21:17:33.09ID:Coh3zEx3612デフォルトの名無しさん
2024/09/01(日) 21:24:18.89ID:MVARTL7s 言語の差でなくメモリ管理方式の差では
ライブラリにはなるけど同様のものはRustにもあるし大して変わらなさそう
ライブラリにはなるけど同様のものはRustにもあるし大して変わらなさそう
613デフォルトの名無しさん
2024/09/01(日) 21:27:22.64ID:0f8jKoK3 コーディングもベンチもせずに
NimはCより2倍速いと主張していて
心の病をうたがってしまう
NimはCより2倍速いと主張していて
心の病をうたがってしまう
614デフォルトの名無しさん
2024/09/01(日) 21:38:54.81ID:pUggxEL4 そもそもNimがCより速いっていうのが原理的におかしいんだよ…
Nimの最速実装には必ずそこから生成されたCが存在するわけで
それとも生成されたCはCとは認めない、みたいな話なんだろうか
Nimの最速実装には必ずそこから生成されたCが存在するわけで
それとも生成されたCはCとは認めない、みたいな話なんだろうか
615デフォルトの名無しさん
2024/09/01(日) 21:48:04.56ID:MVARTL7s 方式の違いを言語の差と思ってるなら
例えば誰かがコストの大きい計算をスレッドプールで高速化した実装をC++やRustで示せばそれでNimより速いと納得するんだろうか
例えば誰かがコストの大きい計算をスレッドプールで高速化した実装をC++やRustで示せばそれでNimより速いと納得するんだろうか
616デフォルトの名無しさん
2024/09/01(日) 21:52:21.87ID:f0nFMo6o >>611
>それはCでもオブジェクトプール使えば2倍速くなるのでは?
Cは手動メモリ管理しかできないオブジェクトプールの機能はないだろ
>オブジェクトプール版のNimから生成したCはまさにそういうコードだと思うけど
人間がCの手動メモリ管理したプログラムだと限界があるムーブセマンティクスの
アルゴリズムでメモリの最適化をしてるから、人間では到底太刀打ちできない事を
証明した論文があるオブジェクトプール版のNimから生成したCのコードは人間には書けない
Nim2.0のムーブセマンティクスの本当に優れた最適化とORCで明示的にオブジェクトプールでプログラミングすることによって、人間がCの手動メモリ管理したベンチマークより2倍以上速くできる
それが間違ってると主張したいのであれば、想定を合わせるためにCでもRustでもどっちでもいいから、速いベンチマークで証明すればいいだけだろ
>それはCでもオブジェクトプール使えば2倍速くなるのでは?
Cは手動メモリ管理しかできないオブジェクトプールの機能はないだろ
>オブジェクトプール版のNimから生成したCはまさにそういうコードだと思うけど
人間がCの手動メモリ管理したプログラムだと限界があるムーブセマンティクスの
アルゴリズムでメモリの最適化をしてるから、人間では到底太刀打ちできない事を
証明した論文があるオブジェクトプール版のNimから生成したCのコードは人間には書けない
Nim2.0のムーブセマンティクスの本当に優れた最適化とORCで明示的にオブジェクトプールでプログラミングすることによって、人間がCの手動メモリ管理したベンチマークより2倍以上速くできる
それが間違ってると主張したいのであれば、想定を合わせるためにCでもRustでもどっちでもいいから、速いベンチマークで証明すればいいだけだろ
617デフォルトの名無しさん
2024/09/01(日) 21:56:31.28ID:0f8jKoK3 NimはCより2倍速いと主張している人がまずはその比較コードとベンチ結果を示す義務がありますよ
618デフォルトの名無しさん
2024/09/01(日) 22:00:47.66ID:ydrH9psJ 主張するだけならどの言語でもできますがな
PythonはCよりも速い、違うというならお前らがコードを書いて証明しろ
みたいなのは面倒くさすぎて誰も相手にせんだろ
PythonはCよりも速い、違うというならお前らがコードを書いて証明しろ
みたいなのは面倒くさすぎて誰も相手にせんだろ
619デフォルトの名無しさん
2024/09/01(日) 22:04:17.16ID:f0nFMo6o620デフォルトの名無しさん
2024/09/01(日) 22:06:25.77ID:pUggxEL4 >>616
別にCでも自分でオブジェクトプール実装するなり既存のarena allocator使えばいいじゃん
まぁ言語組み込みであることで「初心者が何の最適化もしないコードを書いたときにNimが最速」となる可能性はあると思うけど、それならそのように主張してくれ
別にCでも自分でオブジェクトプール実装するなり既存のarena allocator使えばいいじゃん
まぁ言語組み込みであることで「初心者が何の最適化もしないコードを書いたときにNimが最速」となる可能性はあると思うけど、それならそのように主張してくれ
621デフォルトの名無しさん
2024/09/01(日) 22:14:20.69ID:2CzFvl+J622デフォルトの名無しさん
2024/09/01(日) 22:18:07.82ID:0f8jKoK3623デフォルトの名無しさん
2024/09/01(日) 22:19:40.68ID:B8TxC8Ku CとC++の違いも判らない人が主張してもな
624デフォルトの名無しさん
2024/09/02(月) 02:02:31.42ID:PjDKSqdJ 最近のやり取りでなんとなくここの層がわかってきたなぁ
625デフォルトの名無しさん
2024/09/02(月) 10:14:38.25ID:UFeMRrS3 MinifyされたJavaScriptのコードをChatGPTで読みやすい形式に戻すことに成功
https://gigazine.net...eering-with-chatgpt/
https://gigazine.net...eering-with-chatgpt/
626デフォルトの名無しさん
2024/09/02(月) 11:00:21.39ID:bCUpdzqg まあ確かに純粋なCとの置き換えなら別にCでええやんってなるわな
627デフォルトの名無しさん
2024/09/02(月) 12:43:05.01ID:wq6C4ZI5628デフォルトの名無しさん
2024/09/02(月) 12:57:03.37ID:o+5p2SR6 C++ に慣れてると後始末をデストラクタの中に隠蔽できてないのは抽象化の失敗だという感覚があるから defer には良い印象がない。
629デフォルトの名無しさん
2024/09/02(月) 16:42:30.80ID:ctZgLyfU RAIIがない欠陥言語たちはdeferとかwithとかusingとか毎回書かされて汚くなる
630デフォルトの名無しさん
2024/09/02(月) 16:51:36.63ID:FQfjCQIj 別にRAIIが絶対的な正解というわけではないので
そこに自由度を持たせるにはその自由度を制御するための一言が必要になるのは当然のこと
そこに自由度を持たせるにはその自由度を制御するための一言が必要になるのは当然のこと
631デフォルトの名無しさん
2024/09/02(月) 16:52:53.11ID:13HDFjot632デフォルトの名無しさん
2024/09/02(月) 17:01:06.29ID:C3j8rcv1 clang ccは最適化フラグが沢山あるし、色々やればNimと同程度の速度くらい出せるんじゃないの?知らんけど
633デフォルトの名無しさん
2024/09/02(月) 17:19:45.07ID:o+5p2SR6 >>631
defer は抽象化の失敗の表れだとは思うが抽象化をそれほど頑張らない方針を悪いと思ってるわけじゃないよ。
C++ が Better C としての用途でも超強力な選択肢として馴染みがあるからあらためて他の選択肢を使いたい気持ちがあまりないという程度の話。
defer は抽象化の失敗の表れだとは思うが抽象化をそれほど頑張らない方針を悪いと思ってるわけじゃないよ。
C++ が Better C としての用途でも超強力な選択肢として馴染みがあるからあらためて他の選択肢を使いたい気持ちがあまりないという程度の話。
634デフォルトの名無しさん
2024/09/02(月) 17:34:21.85ID:4iRl8tQB C++がBetter Cとして馴染みがあるから他の選択肢を使いたい気持ちがない人、弊社には来て欲しくねえな
馬鹿か、すごい賢くて賢い人としか働けないか、人と働いたことないかの三択だ
馬鹿か、すごい賢くて賢い人としか働けないか、人と働いたことないかの三択だ
635デフォルトの名無しさん
2024/09/02(月) 17:37:11.39ID:lNYL9rdL Zigは結局のところ個人開発止まりで終わるよ
636デフォルトの名無しさん
2024/09/02(月) 18:24:18.22ID:VEiLzJpt >>632
Nimはclangに対応してる
Nim言語開発者がCの手動メモリ管理ソースをclangで最適化コンパイルしてたら5.23sで変わらないんじゃない
Memory management strategy Time Peak Memory
manual 5.23s 244.563MiB
Nimはclangに対応してる
Nim言語開発者がCの手動メモリ管理ソースをclangで最適化コンパイルしてたら5.23sで変わらないんじゃない
Memory management strategy Time Peak Memory
manual 5.23s 244.563MiB
637デフォルトの名無しさん
2024/09/02(月) 18:32:02.91ID:VEiLzJpt 補足
NimはCのソースコード吐けるからから、Nimの手動メモリ管理はCの手動メモリ管理と同じとしてベンチマーク計測してる
https://github.com/Araq/fosdem2020
https://zenn.dev/dumblepy/articles/af2b2b9f8fd890
NimはCのソースコード吐けるからから、Nimの手動メモリ管理はCの手動メモリ管理と同じとしてベンチマーク計測してる
https://github.com/Araq/fosdem2020
https://zenn.dev/dumblepy/articles/af2b2b9f8fd890
638デフォルトの名無しさん
2024/09/02(月) 18:41:55.01ID:VEiLzJpt 補足2
人間がCの手動メモリ管理したプログラムだと限界がある
Nim2.0のムーブセマンティクスの本当に優れたアルゴリズムでメモリの最適化をしてるから、人間では到底太刀打ちできない事を証明した論文がある
オブジェクトプール版のNimから生成したCのコードは人間には書けない
Nim2.0のムーブセマンティクスの本当に優れた最適化とORCで明示的にオブジェクトプールでプログラミングすることによって、人間がCの手動メモリ管理したベンチマークより2倍以上速くできる
人間がCの手動メモリ管理したプログラムだと限界がある
Nim2.0のムーブセマンティクスの本当に優れたアルゴリズムでメモリの最適化をしてるから、人間では到底太刀打ちできない事を証明した論文がある
オブジェクトプール版のNimから生成したCのコードは人間には書けない
Nim2.0のムーブセマンティクスの本当に優れた最適化とORCで明示的にオブジェクトプールでプログラミングすることによって、人間がCの手動メモリ管理したベンチマークより2倍以上速くできる
639デフォルトの名無しさん
2024/09/02(月) 18:51:06.06ID:x+sFU8Hh640デフォルトの名無しさん
2024/09/02(月) 19:04:49.90ID:VEiLzJpt >>639
Nim言語開発者のORCで明示的にオブジェクトプールを使ったプログラミングのベンチマークがガセだと思うなら、それよりも速いベンチマークで証明すればいいだけだろ
Nim言語開発者のORCで明示的にオブジェクトプールを使ったプログラミングのベンチマークがガセだと思うなら、それよりも速いベンチマークで証明すればいいだけだろ
641デフォルトの名無しさん
2024/09/02(月) 19:17:59.50ID:CQW1lAEf Nimの方が速いというコード比較ベンチが一つも存在しないから
現状ではNimが速いは嘘と判断するしかないね
現状ではNimが速いは嘘と判断するしかないね
642デフォルトの名無しさん
2024/09/02(月) 23:35:39.51ID:Azu0Ww0Z よく見たらNimのコードも別に言語の機能としてオブジェクトプールがあるわけではなさそうだな
コード例の中で定義してるし、記事はあくまでオブジェクトプールのNimでの実装例を示しているだけだと思う
GCアルゴリズムの改善 (ORC) もあるけど、それとオブジェクトプールは別の話
元の記事も言語間の比較なんてそもそもしてないし、メモリ戦略による効率化の例を示してるだけだから、
他の言語 (C/C++/Rustに限らずC#やJavaでも) で同じことをすれば同様に「プール戦略は効率が良い」という結果は得られそう
スレで暴れてる子はそれをNimだけができる特別な方法だと思ってるのかな
コード例の中で定義してるし、記事はあくまでオブジェクトプールのNimでの実装例を示しているだけだと思う
GCアルゴリズムの改善 (ORC) もあるけど、それとオブジェクトプールは別の話
元の記事も言語間の比較なんてそもそもしてないし、メモリ戦略による効率化の例を示してるだけだから、
他の言語 (C/C++/Rustに限らずC#やJavaでも) で同じことをすれば同様に「プール戦略は効率が良い」という結果は得られそう
スレで暴れてる子はそれをNimだけができる特別な方法だと思ってるのかな
643デフォルトの名無しさん
2024/09/02(月) 23:47:47.09ID:LcFbNhg2 周回遅れだなw
Nim言語開発者が論文で示されてたプール戦略をオブジェクトプールとして導入した
論文で示されてるから他の言語 (C/C++/Rustに限らずC#やJavaでも) で同じことをすれば同様に
「プール戦略は効率が良い」という結果は当然出るに決まってる
でも現時点で論文で示されてるプール戦略を導入してるのはNim2.0だけ
Nim言語開発者が論文で示されてたプール戦略をオブジェクトプールとして導入した
論文で示されてるから他の言語 (C/C++/Rustに限らずC#やJavaでも) で同じことをすれば同様に
「プール戦略は効率が良い」という結果は当然出るに決まってる
でも現時点で論文で示されてるプール戦略を導入してるのはNim2.0だけ
644デフォルトの名無しさん
2024/09/03(火) 00:13:59.39ID:kXSWNX4e 人間がCの手動メモリ管理したベンチマークより、Nim2.0は循環参照が大量に使用されていればいればいるほどムーブセマンティクスとオブジェクトプールでベンチマークが速くなる
だからNim2.0は循環参照が大量に使用されていない通常の短いコードの言語間ベンチマーク比較だとÇと変わらなくなる
だからNim2.0は循環参照が大量に使用されていない通常の短いコードの言語間ベンチマーク比較だとÇと変わらなくなる
645デフォルトの名無しさん
2024/09/03(火) 00:22:16.43ID:SddP/phw646デフォルトの名無しさん
2024/09/03(火) 01:11:48.95ID:1HHGF7Zl ここ何のスレでしたっけ?
647デフォルトの名無しさん
2024/09/03(火) 01:53:59.18ID:Dbzwi48i 次世代言語スレじゃない?
648デフォルトの名無しさん
2024/09/03(火) 06:26:51.96ID:q/sgL6ap 最強言語を決めようスレ
649デフォルトの名無しさん
2024/09/03(火) 07:16:54.59ID:1bP400Ev オブジェクトプールって要はキャッシュのことでいいの?
650デフォルトの名無しさん
2024/09/03(火) 07:43:29.24ID:kXSWNX4e >>645
訂正
アリーナ方式(=オブジェクトプール方式)はC++とNim2.0だけに導入されてるわけではないと
じゃあNim言語開発者が、RustやC++、そしてSwiftがどのようにメモリ管理を行っているかを調べ、良い部分を再組み合わせたオブジェクトプールは他の言語にあるの?
無いなら、現時点でRustやC++、そしてSwiftがどのようにメモリ管理を行っているかを調べ、良い部分を再組み合わせたオブジェクトプールはを導入してるのはNim2.0だけって事で異論はない?
訂正
アリーナ方式(=オブジェクトプール方式)はC++とNim2.0だけに導入されてるわけではないと
じゃあNim言語開発者が、RustやC++、そしてSwiftがどのようにメモリ管理を行っているかを調べ、良い部分を再組み合わせたオブジェクトプールは他の言語にあるの?
無いなら、現時点でRustやC++、そしてSwiftがどのようにメモリ管理を行っているかを調べ、良い部分を再組み合わせたオブジェクトプールはを導入してるのはNim2.0だけって事で異論はない?
651デフォルトの名無しさん
2024/09/03(火) 07:47:47.67ID:kXSWNX4e 訂正(オブジェクトプール → ムーブセマンティクス)
じゃあNim言語開発者が、RustやC++、そしてSwiftがどのようにメモリ管理を行っているかを調べ、良い部分を再組み合わせたムーブセマンティクスは他の言語にあるの?
無いなら、現時点でRustやC++、そしてSwiftがどのようにメモリ管理を行っているかを調べ、良い部分を再組み合わせたムーブセマンティクスはを導入してるのはNim2.0だけって事で異論はない?
じゃあNim言語開発者が、RustやC++、そしてSwiftがどのようにメモリ管理を行っているかを調べ、良い部分を再組み合わせたムーブセマンティクスは他の言語にあるの?
無いなら、現時点でRustやC++、そしてSwiftがどのようにメモリ管理を行っているかを調べ、良い部分を再組み合わせたムーブセマンティクスはを導入してるのはNim2.0だけって事で異論はない?
652デフォルトの名無しさん
2024/09/03(火) 07:52:41.59ID:e/LVUItZ アロケータを細かく制御したいなら断然Zigだろ
Arena Allocatorももちろん用意されてるし、他にも選択肢がある
Arena Allocatorももちろん用意されてるし、他にも選択肢がある
653デフォルトの名無しさん
2024/09/03(火) 07:59:06.62ID:32lfd5Tu >>649
普通オブジェクトプールをキャッシュとは言わないと思うけど
まぁ挙動としてはメモリ領域のキャッシュみたいなイメージでいいかもしれない
小領域の確保と解放が繰り返されるときにキャッシュすることで実際のmalloc/free(あるいはGC)呼び出し回数を減らすためのもの
普通オブジェクトプールをキャッシュとは言わないと思うけど
まぁ挙動としてはメモリ領域のキャッシュみたいなイメージでいいかもしれない
小領域の確保と解放が繰り返されるときにキャッシュすることで実際のmalloc/free(あるいはGC)呼び出し回数を減らすためのもの
654デフォルトの名無しさん
2024/09/03(火) 08:03:36.62ID:LULqlZCj 来年にはZigがメジャーバージョン1到達見込みみたいだし期待
655デフォルトの名無しさん
2024/09/03(火) 08:04:09.12ID:UM5ITwja Zigはこのまま未完成に終わって極少数の趣味人にしか使われないでしょう
656デフォルトの名無しさん
2024/09/03(火) 10:06:28.79ID:+fPFl5kU なんかZigファン多いみたいだから、単独スレ立てて議論したら?
ここはRustスレだから、ただ単にZigはすごいんだあって宣伝するだけなのはつまらんぞ
ここはRustスレだから、ただ単にZigはすごいんだあって宣伝するだけなのはつまらんぞ
657デフォルトの名無しさん
2024/09/03(火) 10:17:54.29ID:Dbzwi48i C++とかGoとかNimとかの他所様のスレにRustの宣伝を書き散らしてたカスもいたわけだし
今更そんなこと言っても誰も相手にせんだろう
今更そんなこと言っても誰も相手にせんだろう
658デフォルトの名無しさん
2024/09/03(火) 10:20:47.01ID:e/LVUItZ アロケータ周りの不自由さはRustの代表的なウィークポイントだから
Zigと比較するのは有意義だと思うよ
Rust for Linuxで不備を指摘されて、unstable featuresとして整備し始めてるのが現状でしょ?
Zigと比較するのは有意義だと思うよ
Rust for Linuxで不備を指摘されて、unstable featuresとして整備し始めてるのが現状でしょ?
659デフォルトの名無しさん
2024/09/03(火) 10:30:58.77ID:oCyo/VGZ 入院が安定化されればクリアする話だから年内か年明けにでも解決
660デフォルトの名無しさん
2024/09/03(火) 13:17:35.66ID:q/sgL6ap スレ違いなのに書き込んでるやつは頭悪そう
661デフォルトの名無しさん
2024/09/03(火) 16:24:34.66ID:/Ve5otW6662デフォルトの名無しさん
2024/09/03(火) 16:46:40.15ID:/Ve5otW6663デフォルトの名無しさん
2024/09/03(火) 20:18:41.62ID:70res71t >>589
Nim2.0は循環参照が大量に使用されていればいるほどオブジェクトプールとムーブセマンティクスのメモリ最適化アルゴリズムで、人間がCの手動メモリ管理したベンチマークより速くなる
だからNim2.0は循環参照が大量に使用されていない通常の短いコードの言語間ベンチマーク比較だとÇと変わらなくなる
>しかもNimはC言語へトランスパイルされるんだろw
人間がCの手動メモリ管理したプログラムだとメモリの最適化に限界がある
Nim2.0はオブジェクトプールとムーブセマンティクスのアルゴリズムでメモリの最適化をしてるから、オブジェクトプール版のNimから生成したCのコードは人間には書けない
Nim2.0のムーブセマンティクスの本当に優れたメモリ最適化アルゴリズムと明示的にオブジェクトプールでプログラミングすることによって、人間がCの手動メモリ管理したベンチマークより2倍以上速くできる
Nim2.0は循環参照が大量に使用されていればいるほどオブジェクトプールとムーブセマンティクスのメモリ最適化アルゴリズムで、人間がCの手動メモリ管理したベンチマークより速くなる
だからNim2.0は循環参照が大量に使用されていない通常の短いコードの言語間ベンチマーク比較だとÇと変わらなくなる
>しかもNimはC言語へトランスパイルされるんだろw
人間がCの手動メモリ管理したプログラムだとメモリの最適化に限界がある
Nim2.0はオブジェクトプールとムーブセマンティクスのアルゴリズムでメモリの最適化をしてるから、オブジェクトプール版のNimから生成したCのコードは人間には書けない
Nim2.0のムーブセマンティクスの本当に優れたメモリ最適化アルゴリズムと明示的にオブジェクトプールでプログラミングすることによって、人間がCの手動メモリ管理したベンチマークより2倍以上速くできる
664デフォルトの名無しさん
2024/09/03(火) 20:29:12.43ID:70res71t 補足
NimはCのソースコード吐けるからから、Nimの手動メモリ管理はCの手動メモリ管理と同じとしてベンチマーク計測してる
https://github.com/Araq/fosdem2020
https://zenn.dev/dum...icles/af2b2b9f8fd890
NimはCのソースコード吐けるからから、Nimの手動メモリ管理はCの手動メモリ管理と同じとしてベンチマーク計測してる
https://github.com/Araq/fosdem2020
https://zenn.dev/dum...icles/af2b2b9f8fd890
665デフォルトの名無しさん
2024/09/03(火) 20:30:56.39ID:65xXv9p+ 比較コードとベンチ結果すら示せない嘘つきがまた来てるのか
666デフォルトの名無しさん
2024/09/03(火) 20:49:25.51ID:70res71t >>665
https://github.com/Araq/fosdem2020
ベンチマーク:処理能力
Memory management strategy Time Peak Memory
mark&sweep GC 17s 588.047MiB
deferred refcounting GC 16s 304.074MiB
Boehm GC 12s N/A
ARC 6.75s 472.098MiB(379.074MiB)
manual 5.23s 244.563MiB
manual(with RC) 6.244s 379.074MiB
object pooling 2.4s 251.504MiB
パフォーマンスはどうでしょうか?結果ははるかに速く、パフォーマンスが2倍以上向上し、メモリ消費もほぼ同じです。
https://github.com/Araq/fosdem2020
ベンチマーク:処理能力
Memory management strategy Time Peak Memory
mark&sweep GC 17s 588.047MiB
deferred refcounting GC 16s 304.074MiB
Boehm GC 12s N/A
ARC 6.75s 472.098MiB(379.074MiB)
manual 5.23s 244.563MiB
manual(with RC) 6.244s 379.074MiB
object pooling 2.4s 251.504MiB
パフォーマンスはどうでしょうか?結果ははるかに速く、パフォーマンスが2倍以上向上し、メモリ消費もほぼ同じです。
667デフォルトの名無しさん
2024/09/03(火) 20:59:57.60ID:vYs0R68S それはNim同士の別方式の比較
他の言語と比較しないと意味がないね
もちろん他の言語で書いてもobject pooling (= arena allocation)方式が一番速くなることが昔から知られている
他の言語と比較しないと意味がないね
もちろん他の言語で書いてもobject pooling (= arena allocation)方式が一番速くなることが昔から知られている
668デフォルトの名無しさん
2024/09/03(火) 21:00:53.22ID:FoNe+zrO そもそもGCを使わない方法での比較はしてるの?
669デフォルトの名無しさん
2024/09/03(火) 21:03:35.60ID:WuK8CTt/ V8とRustをベースとしたJavaScript/TypeScriptランタイム環境「Deno」v1.46.2
https://forest.watch.impress.co.jp/docs/digest/1620908.html
https://forest.watch.impress.co.jp/docs/digest/1620908.html
670デフォルトの名無しさん
2024/09/03(火) 21:22:39.41ID:Duh4gTgK Poolの概念
tps://boostjp.github.io/archive/boost_docs/libs/pool/concepts.html
他の実装
Pool 割り当て機構は多くのプログラミング言語に見ることができ、多くのバリエーションが存在する。
多くの実装の端緒は、ごく普通のプログラミングに関する文献に求めることができる。
いくつかを以下に示す。これらの何れも完全な実装ではない。
多くは実装のある局面を読者への練習問題としている。
しかしながら、これらの例はどれも、ある局面が欠落しているとはいえ、
このドキュメントで述べている単純分離記憶域と同じ基底概念を使用している。
"The C++ Programming Language", 3rd ed., by Bjarne Stroustrup, Section 19.4.2.
(略)
"MicroC/OS-II: The Real-Time Kernel", by Jean J. Labrosse, Chapter 7 and Appendix B.04.
(略)
"Efficient C++: Performance Programming Techniques", by Dov Bulka and David Mayhew, Chapters 6 and 7.
(略)
"Advanced C++: Programming Styles and Idioms", by James O. Coplien, Section 3.6.
(略)
tps://boostjp.github.io/archive/boost_docs/libs/pool/concepts.html
他の実装
Pool 割り当て機構は多くのプログラミング言語に見ることができ、多くのバリエーションが存在する。
多くの実装の端緒は、ごく普通のプログラミングに関する文献に求めることができる。
いくつかを以下に示す。これらの何れも完全な実装ではない。
多くは実装のある局面を読者への練習問題としている。
しかしながら、これらの例はどれも、ある局面が欠落しているとはいえ、
このドキュメントで述べている単純分離記憶域と同じ基底概念を使用している。
"The C++ Programming Language", 3rd ed., by Bjarne Stroustrup, Section 19.4.2.
(略)
"MicroC/OS-II: The Real-Time Kernel", by Jean J. Labrosse, Chapter 7 and Appendix B.04.
(略)
"Efficient C++: Performance Programming Techniques", by Dov Bulka and David Mayhew, Chapters 6 and 7.
(略)
"Advanced C++: Programming Styles and Idioms", by James O. Coplien, Section 3.6.
(略)
671デフォルトの名無しさん
2024/09/04(水) 00:24:08.00ID:WSrhyWiD なんでstdで公開してるんだか知らんが、rustc開発陣には面白いこと考えて実装してしまう人がいるもんだね
https://doc.rust-lang.org/std/intrinsics/mir/index.html
https://doc.rust-lang.org/std/intrinsics/mir/index.html
672デフォルトの名無しさん
2024/09/04(水) 06:25:46.42ID:L9jt2Atz673デフォルトの名無しさん
2024/09/04(水) 06:51:22.28ID:jUst+7wI674デフォルトの名無しさん
2024/09/04(水) 08:21:33.86ID:YIdoJmrM こっちのが各種負荷が分かりやすい
youtu.be/2hWfLiRGaNM
youtu.be/2hWfLiRGaNM
675デフォルトの名無しさん
2024/09/04(水) 13:53:11.19ID:gtSSINdp どっちのロゴもださい
676デフォルトの名無しさん
2024/09/04(水) 18:38:20.03ID:LischCmo いくつか記事出てるけど、Rust for Linuxは失敗に終わったみたいだね
677デフォルトの名無しさん
2024/09/04(水) 18:53:43.06ID:kEJZEp+0678デフォルトの名無しさん
2024/09/04(水) 20:38:51.07ID:WSrhyWiD 具体的にLinuxの何がRustで書かれてるんだっけか
679デフォルトの名無しさん
2024/09/04(水) 20:51:35.06ID:pD6zdA4Y680デフォルトの名無しさん
2024/09/04(水) 21:35:17.87ID:WSrhyWiD だよね
知ってた
知ってた
681デフォルトの名無しさん
2024/09/04(水) 21:39:00.59ID:DkGnoe2A 抵抗勢力のクズを一掃できないとLinuxの敗北の始まりになるかもな
682デフォルトの名無しさん
2024/09/04(水) 22:30:46.44ID:kVp+OLCr 何に敗北するんだろうか
Rust製でもっと高信頼性かつ高機能なOSをどこかが作ってたりするの?
Rust製でもっと高信頼性かつ高機能なOSをどこかが作ってたりするの?
683デフォルトの名無しさん
2024/09/05(木) 00:00:09.27ID:zViJFvGA linux はバイナリ互換性を大事にする。
(Windows ほどではないけど。)
ドキュメントに書いてない仕様外の挙動であってもそれを変更して動かなくなるアプリケーションがあってはならないというのが基本指針。
コンパイラの挙動とも協調して細部をコントロールしてる工芸品だ。
この状態を維持したまま Rust を導入するのは無理だよ。
比較的疎結合な一部のモジュールはなんとかなるかもしれんがあえてやるには時期尚早。
(Windows ほどではないけど。)
ドキュメントに書いてない仕様外の挙動であってもそれを変更して動かなくなるアプリケーションがあってはならないというのが基本指針。
コンパイラの挙動とも協調して細部をコントロールしてる工芸品だ。
この状態を維持したまま Rust を導入するのは無理だよ。
比較的疎結合な一部のモジュールはなんとかなるかもしれんがあえてやるには時期尚早。
684デフォルトの名無しさん
2024/09/05(木) 00:04:52.28ID:clMGp1Hb それバイナリ互換と関係ない話
685デフォルトの名無しさん
2024/09/05(木) 00:33:15.38ID:9Qm4YGNu >>683
それはカーネル外と際の話
さして言語は関係ない
実行バイナリファイル形式は同じだからRustで書かれたものも動いているしCで書かれたものと混在リンクしても動いてる
バイナリインタフェースのうちシステムコールについてはlibcそのまま用いている
そのためためRustでもレジスタの使用方法積み方全て同じ
実行バイナリへの混在リンクの関数呼び出しについてもCと同じくレジスタ割り当てや退避を行うためこれも同じ
それはカーネル外と際の話
さして言語は関係ない
実行バイナリファイル形式は同じだからRustで書かれたものも動いているしCで書かれたものと混在リンクしても動いてる
バイナリインタフェースのうちシステムコールについてはlibcそのまま用いている
そのためためRustでもレジスタの使用方法積み方全て同じ
実行バイナリへの混在リンクの関数呼び出しについてもCと同じくレジスタ割り当てや退避を行うためこれも同じ
686デフォルトの名無しさん
2024/09/05(木) 01:05:51.55ID:hShQUNIv カーネルとモジュールの間ではバイナリ互換性の問題は発生しないとでも言うつもりなんだろうか
687デフォルトの名無しさん
2024/09/05(木) 01:54:33.69ID:3g7CnUji688デフォルトの名無しさん
2024/09/05(木) 05:13:44.23ID:e3jYYrt5 >>679
unsafeを使うときには必ずそのすぐ上に // SAFETY: コメントで説明を書かないといけない
ってコーディングルールなんだね
Documentation/rust/coding-guidelines.rst
unsafeを使うときには必ずそのすぐ上に // SAFETY: コメントで説明を書かないといけない
ってコーディングルールなんだね
Documentation/rust/coding-guidelines.rst
689デフォルトの名無しさん
2024/09/05(木) 07:32:51.81ID:YoL+MCk6 >>682
なぜかそれはしない
なぜかそれはしない
690デフォルトの名無しさん
2024/09/05(木) 08:27:51.37ID:2XHFyhSG 小さいものはある
しかし巨大なものを置き換えるにはコストがかかる
特に安定している部分はメリットがない
一方でデバイスドライバなど次々と新たなコードが実装されていってる部分はメリットがある
そのためカーネル本体ではなく新たなモジュールからRust化されつつある
しかし巨大なものを置き換えるにはコストがかかる
特に安定している部分はメリットがない
一方でデバイスドライバなど次々と新たなコードが実装されていってる部分はメリットがある
そのためカーネル本体ではなく新たなモジュールからRust化されつつある
691デフォルトの名無しさん
2024/09/05(木) 09:24:04.12ID:NUwXZfpl692デフォルトの名無しさん
2024/09/05(木) 09:29:32.76ID:NUwXZfpl >ドキュメントに書いてない仕様外の挙動であってもそれを変更して動かなくなる
>アプリケーションがあってはならないというのが基本指針。
そういう規定されていない挙動がセキュリティホールになるんじゃないの
アプリじゃなくてウィルスやワームなら動かなくなっても良いという考えは感心しない
(いいけどさ)
>アプリケーションがあってはならないというのが基本指針。
そういう規定されていない挙動がセキュリティホールになるんじゃないの
アプリじゃなくてウィルスやワームなら動かなくなっても良いという考えは感心しない
(いいけどさ)
693デフォルトの名無しさん
2024/09/05(木) 09:53:36.80ID:4TgHYLLA Windowsアーキテクチャを捨てる時rustでスクラッチから書き直すんじゃね?
もう誰かが実験的に始めてるかも知れないけど
もう誰かが実験的に始めてるかも知れないけど
694デフォルトの名無しさん
2024/09/05(木) 10:28:42.83ID:e3jYYrt5 Windowsカーネルにはもう既にRustで書かれたモジュールが入ってるぞ
695デフォルトの名無しさん
2024/09/05(木) 11:26:57.99ID:MrUlEodS696デフォルトの名無しさん
2024/09/05(木) 11:28:29.71ID:ucx37QCe linuxについてもリーナスはrust導入に期待してるからね。
少しずつだけど前進はしてる。けどrust推進者がメンタルやられて後退もしてる。
リーナスも老害には釘さしてる。
少しずつだけど前進はしてる。けどrust推進者がメンタルやられて後退もしてる。
リーナスも老害には釘さしてる。
697デフォルトの名無しさん
2024/09/05(木) 11:43:44.01ID:KbFebBvQ rust製OSといえばRedox
https://redox-os.org/
https://redox-os.org/
698デフォルトの名無しさん
2024/09/05(木) 12:01:55.65ID:FfD21zGl RedoxはMITライセンスだから、Redox開発者&コントリビュータはLinuxのGNUソースを一切見ることが出来ないね
699デフォルトの名無しさん
2024/09/05(木) 12:03:41.73ID:zViJFvGA たとえばヌル終端した文字列を Rust に持ってくるのが面倒くさい (かといって素のポインタで扱うのは Rust の良さが活きない) とかそういう些細な不整合の積み重ねがある。
よく分離されたモジュールの間で通信する分にはたいした話じゃないが一体の塊の中で内容が同じ異なるオブジェクトがあって頻繁に変換するなんてのは論外だ。
カーネルが Rust に配慮するよりは libc みたいなポジションの Rust 版みたいなやつがあればいいんでないの。
よく分離されたモジュールの間で通信する分にはたいした話じゃないが一体の塊の中で内容が同じ異なるオブジェクトがあって頻繁に変換するなんてのは論外だ。
カーネルが Rust に配慮するよりは libc みたいなポジションの Rust 版みたいなやつがあればいいんでないの。
700デフォルトの名無しさん
2024/09/05(木) 12:11:34.88ID:ucx37QCe >>698
?何で見ることできない?
?何で見ることできない?
701デフォルトの名無しさん
2024/09/05(木) 12:11:54.33ID:kbcpGSLl そう、それもGPLな
Redoxに流用すなると、RedoxもGPL
Redoxソースを見たらそれもGPL
Redoxに流用すなると、RedoxもGPL
Redoxソースを見たらそれもGPL
702デフォルトの名無しさん
2024/09/05(木) 12:14:00.92ID:kbcpGSLl >>700
GPL/GPLAライセンスを舐めたら痛い目に遭う
GPL/GPLAライセンスを舐めたら痛い目に遭う
703デフォルトの名無しさん
2024/09/05(木) 14:03:52.89ID:8gaPnIRW ライセンスはApache-2.0 licenseしか信じてないわ
704デフォルトの名無しさん
2024/09/05(木) 15:24:16.99ID:ucx37QCe >>702
それは 見ることできない とは別問題だよ
それは 見ることできない とは別問題だよ
705デフォルトの名無しさん
2024/09/05(木) 15:28:43.04ID:QwnqngeR >>699
ヌル終端文字列の一部を切り取ったヌル終端文字列はたいていヒープに割り当てられ
たいていリファレンスカウントまたはマークアンドスイープの対象になる
ヌル終端しない自由があればヒープがいらなくなる
ヌル終端文字列の一部を切り取ったヌル終端文字列はたいていヒープに割り当てられ
たいていリファレンスカウントまたはマークアンドスイープの対象になる
ヌル終端しない自由があればヒープがいらなくなる
706デフォルトの名無しさん
2024/09/05(木) 15:38:39.94ID:Vdc38OeX やばい、やばい、別言語に書き換えたらGPLロンダリング出来ると本気で思ってそうだな
会社ぐるみで参考とか調査と称してGPLコード内の処理内容をパクってそう
新興OSがLinuxコードをパクって無いと主張するのはダウト
会社ぐるみで参考とか調査と称してGPLコード内の処理内容をパクってそう
新興OSがLinuxコードをパクって無いと主張するのはダウト
707デフォルトの名無しさん
2024/09/05(木) 16:03:51.09ID:eP4hkN3V GPLの力をそこまで拡大するのはカスなんだよな
そこまでやるなら裁判でもなんでもしてGPLごと破壊していくべき
そこまでやるなら裁判でもなんでもしてGPLごと破壊していくべき
708デフォルトの名無しさん
2024/09/05(木) 16:10:43.66ID:clMGp1Hb そこまで気にするならGPLに限らず他人の
著作物見ると危険だから
著作物見ると危険だから
709デフォルトの名無しさん
2024/09/05(木) 16:22:33.75ID:CfpHO291 「GPLのソースをコピーして使ったソースは、ソース公開の義務が生じ、それもGPLになる」
というものだから、目で見て脳で記憶してそっくりに真似た場合はコピーしたわけではないから
GPL感染しないかも。
そもそも、目で見たものを再現したら、駄目、なんて理屈、特許も取れてないのに主張できる
ものなのかいな。絵とか文章をそのままコピーするのは著作権違反だけども、目で見て真似た
だけでは著作権違反ではなかろう。ミッキーマウスみたいなのは駄目なんだろうけども。
GPLは、ライセンス自体が法解釈的に「無効」かも知れない。
というものだから、目で見て脳で記憶してそっくりに真似た場合はコピーしたわけではないから
GPL感染しないかも。
そもそも、目で見たものを再現したら、駄目、なんて理屈、特許も取れてないのに主張できる
ものなのかいな。絵とか文章をそのままコピーするのは著作権違反だけども、目で見て真似た
だけでは著作権違反ではなかろう。ミッキーマウスみたいなのは駄目なんだろうけども。
GPLは、ライセンス自体が法解釈的に「無効」かも知れない。
710デフォルトの名無しさん
2024/09/05(木) 16:26:01.06ID:CfpHO291 memcpyのx86用のアセンブリコードがあったとして、それ以上ほぼ高速化できない場合が有るから、
それを真似てはいけないと言うのは、技術の進歩を阻害してしまうだろう。
それとは異なるが速度は同じ、というようなものを考え出す苦労がGPLのせいで生まれる
ことになり、それに時間をとられて人類は損失を被ることになる。
それを真似てはいけないと言うのは、技術の進歩を阻害してしまうだろう。
それとは異なるが速度は同じ、というようなものを考え出す苦労がGPLのせいで生まれる
ことになり、それに時間をとられて人類は損失を被ることになる。
711デフォルトの名無しさん
2024/09/05(木) 16:29:22.37ID:CfpHO291 そもそも、人類は技術を少しずつ改良している。memcpyに関しても基本的にそう。
しかも、ハーバード、スタンフォード、MITなどの最高レベルに優秀な人が研究目的
だからライセンスを気にせずにGPLのものを改良を重ね、最良に近いものを作り出して
いることがある。しかし、それを真似てはいけないと言うのは、GPL以外のものは、
人類の英知を利用してはいけない、ということになってしまう。研究費が国から出るような
立場の人はそれでよくても、民間企業はそれではとても困る。
しかも、ハーバード、スタンフォード、MITなどの最高レベルに優秀な人が研究目的
だからライセンスを気にせずにGPLのものを改良を重ね、最良に近いものを作り出して
いることがある。しかし、それを真似てはいけないと言うのは、GPL以外のものは、
人類の英知を利用してはいけない、ということになってしまう。研究費が国から出るような
立場の人はそれでよくても、民間企業はそれではとても困る。
712デフォルトの名無しさん
2024/09/05(木) 17:03:49.47ID:ehhJfJsl GPLじゃないOSSなんていくらでもあるのに「GPLロンダリング」をどうしても正当化したい勢が結構いる事に驚いた今日この頃
713デフォルトの名無しさん
2024/09/05(木) 17:05:55.92ID:QwnqngeR 誰が作っても同じ物ができる部分は遵法精神があろうがなかろうが同じ物ができるから
法律は関係ない
関係あるのは、ふつうと違う物を作ったらボーナスがもらえるような奴だけだろう
法律は関係ない
関係あるのは、ふつうと違う物を作ったらボーナスがもらえるような奴だけだろう
714デフォルトの名無しさん
2024/09/05(木) 17:14:02.07ID:CfpHO291 >>712
例えば、多倍長計算ライブラリは、GPL以外のものに良いものがない。
例えば、多倍長計算ライブラリは、GPL以外のものに良いものがない。
715デフォルトの名無しさん
2024/09/05(木) 17:19:12.62ID:zViJFvGA >>711
> GPL以外のものは、人類の英知を利用してはいけない、ということになってしまう。
そうだよ。 真似しなければ滅びるというなら滅びるべきであるのに
どうして生き延びるために真似していいと思うんだ?
GPL の感染を許したくないなら「お前が」適当なライセンスで作ればいい。
お前が作れなければ出来る人に金を払って作らせろよ。
それがオープンソースの理念だろ。
> GPL以外のものは、人類の英知を利用してはいけない、ということになってしまう。
そうだよ。 真似しなければ滅びるというなら滅びるべきであるのに
どうして生き延びるために真似していいと思うんだ?
GPL の感染を許したくないなら「お前が」適当なライセンスで作ればいい。
お前が作れなければ出来る人に金を払って作らせろよ。
それがオープンソースの理念だろ。
716デフォルトの名無しさん
2024/09/05(木) 17:28:10.99ID:CfpHO291 >>715
>GPL の感染を許したくないなら「お前が」適当なライセンスで作ればいい。
memcpy や多倍長計算は、世界最高レベルのものが、GPLで出来てしまえば、
異なるアルゴリズムや書き方で、それと同じか、または、超える効率のものは作りえない。
>GPL の感染を許したくないなら「お前が」適当なライセンスで作ればいい。
memcpy や多倍長計算は、世界最高レベルのものが、GPLで出来てしまえば、
異なるアルゴリズムや書き方で、それと同じか、または、超える効率のものは作りえない。
717デフォルトの名無しさん
2024/09/05(木) 17:33:36.15ID:zViJFvGA718デフォルトの名無しさん
2024/09/05(木) 17:46:49.89ID:9d7Gx9oD アイデア・ノウハウ・情報などは著作物ではなく保護の対象ではない
だから考え方やアルゴリズムを真似たところで著作権違反にはならない
逆に言語を変えていてもコードを丸コピしてれば違反に問われる可能性はある
コードに「創作性」が認められる場合のみだけど
ただCを例えばHaskellで書き換えたら
基本ルールが違いすぎて異なる表現にしかならないので
複製にあたる可能性は限りなくゼロ
だから考え方やアルゴリズムを真似たところで著作権違反にはならない
逆に言語を変えていてもコードを丸コピしてれば違反に問われる可能性はある
コードに「創作性」が認められる場合のみだけど
ただCを例えばHaskellで書き換えたら
基本ルールが違いすぎて異なる表現にしかならないので
複製にあたる可能性は限りなくゼロ
719デフォルトの名無しさん
2024/09/05(木) 17:51:37.45ID:CfpHO291 >>718
>アイデア・ノウハウ・情報などは著作物ではなく保護の対象ではない
>だから考え方やアルゴリズムを真似たところで著作権違反にはならない
だとすれば、GPLで書かれた数値計算ライブラリやmemcpyのアイデア・ノウハウ・アルゴリズム
と完全に同じものを使ったプログラムを作っても、著作権の保護にならないと言うことか。
>アイデア・ノウハウ・情報などは著作物ではなく保護の対象ではない
>だから考え方やアルゴリズムを真似たところで著作権違反にはならない
だとすれば、GPLで書かれた数値計算ライブラリやmemcpyのアイデア・ノウハウ・アルゴリズム
と完全に同じものを使ったプログラムを作っても、著作権の保護にならないと言うことか。
720デフォルトの名無しさん
2024/09/05(木) 18:02:59.65ID:k9PbGgWS721デフォルトの名無しさん
2024/09/05(木) 18:13:46.19ID:zViJFvGA 著作権は表現を守る権利だよ。
どこまで表現でどこからアイデアなのか知財関連は素人には判断できないが、 memcpy レベルの基礎的なやつは CPU のドキュメントとかに書いてあるのが元だったりするからどうしても GPL なソフトウェアを真似しないといけないってことはあまりない。
GPL に知恵が集約されてるなんてことはない。
どこまで表現でどこからアイデアなのか知財関連は素人には判断できないが、 memcpy レベルの基礎的なやつは CPU のドキュメントとかに書いてあるのが元だったりするからどうしても GPL なソフトウェアを真似しないといけないってことはあまりない。
GPL に知恵が集約されてるなんてことはない。
722デフォルトの名無しさん
2024/09/05(木) 19:53:46.83ID:eP4hkN3V 企業が収めた税で食ってる立場の人間が企業の邪魔するようになっちゃ終わりよな
そういう資金がなくなるような政党に投票していこうな
そういう資金がなくなるような政党に投票していこうな
723デフォルトの名無しさん
2024/09/05(木) 20:22:43.47ID:MKUftFeD724デフォルトの名無しさん
2024/09/05(木) 20:36:21.56ID:MKUftFeD >>720
>アルゴリズム論文みてHaskell実装するならOK、好きなライセンス形態を選べる
>GPL CコードみてHaskell実装するならGPL感染する
「アルゴリズム」というけれど、memcpyみたいなものは高速化のためにCではなく、
アセンブラレベルにする。だから、レジスタや細かい命令の使い方まで含めてアイデア。
レジスタは、完全には自由には選べないので、個人の自由で選べる範囲は狭い。
だから、効率を落とさずに変更できる余地は少ない。
>アルゴリズム論文みてHaskell実装するならOK、好きなライセンス形態を選べる
>GPL CコードみてHaskell実装するならGPL感染する
「アルゴリズム」というけれど、memcpyみたいなものは高速化のためにCではなく、
アセンブラレベルにする。だから、レジスタや細かい命令の使い方まで含めてアイデア。
レジスタは、完全には自由には選べないので、個人の自由で選べる範囲は狭い。
だから、効率を落とさずに変更できる余地は少ない。
725デフォルトの名無しさん
2024/09/05(木) 20:36:22.59ID:MKUftFeD >>720
>アルゴリズム論文みてHaskell実装するならOK、好きなライセンス形態を選べる
>GPL CコードみてHaskell実装するならGPL感染する
「アルゴリズム」というけれど、memcpyみたいなものは高速化のためにCではなく、
アセンブラレベルにする。だから、レジスタや細かい命令の使い方まで含めてアイデア。
レジスタは、完全には自由には選べないので、個人の自由で選べる範囲は狭い。
だから、効率を落とさずに変更できる余地は少ない。
>アルゴリズム論文みてHaskell実装するならOK、好きなライセンス形態を選べる
>GPL CコードみてHaskell実装するならGPL感染する
「アルゴリズム」というけれど、memcpyみたいなものは高速化のためにCではなく、
アセンブラレベルにする。だから、レジスタや細かい命令の使い方まで含めてアイデア。
レジスタは、完全には自由には選べないので、個人の自由で選べる範囲は狭い。
だから、効率を落とさずに変更できる余地は少ない。
726デフォルトの名無しさん
2024/09/05(木) 20:49:43.99ID:uJyBKCNl727デフォルトの名無しさん
2024/09/05(木) 22:10:14.25ID:QwnqngeR 多倍長整数は、整数もObjectクラスを継承している系の言語と相性が良かったが
そういう言語とアセンブラの相性は良くないからアセンブラにこだわる意味は昔はなかった
今は知らんけど
そういう言語とアセンブラの相性は良くないからアセンブラにこだわる意味は昔はなかった
今は知らんけど
728デフォルトの名無しさん
2024/09/05(木) 22:17:29.12ID:/+8Jbbe1 民業圧迫ωωω
729デフォルトの名無しさん
2024/09/05(木) 22:41:12.21ID:mB2Npkme730デフォルトの名無しさん
2024/09/05(木) 22:47:40.53ID:MKUftFeD memcpy(のアセンブリコード)だと、たまたま良く似たコードになる可能性も有る。
絶対に真似したかどうかの判定は難しい。
また、そんなことで裁判起こされても困る。
絶対に真似したかどうかの判定は難しい。
また、そんなことで裁判起こされても困る。
731デフォルトの名無しさん
2024/09/05(木) 22:47:40.53ID:MKUftFeD memcpy(のアセンブリコード)だと、たまたま良く似たコードになる可能性も有る。
絶対に真似したかどうかの判定は難しい。
また、そんなことで裁判起こされても困る。
絶対に真似したかどうかの判定は難しい。
また、そんなことで裁判起こされても困る。
732デフォルトの名無しさん
2024/09/05(木) 22:51:02.28ID:zViJFvGA ヌル終端の文字列が不利かどうかは知らんが C で書かれたプログラムは原則としてそうなっていて、
OS レベルに互換性が重要なものはいまさら変更することもできない (から Rust と相性が悪い要素のひとつ) って文脈の話ね。
どちらが良いとかじゃなくて混ぜるのはしんどいという話。
OS レベルに互換性が重要なものはいまさら変更することもできない (から Rust と相性が悪い要素のひとつ) って文脈の話ね。
どちらが良いとかじゃなくて混ぜるのはしんどいという話。
733デフォルトの名無しさん
2024/09/05(木) 23:25:02.06ID:/+8Jbbe1 let hoge: &str = "hoge\0";
で解決
で解決
734デフォルトの名無しさん
2024/09/05(木) 23:28:42.24ID:krot3bvf Rustに std::ffi::CStr が出来たから大丈夫
735デフォルトの名無しさん
2024/09/06(金) 07:46:48.97ID:BoX7C6E+736デフォルトの名無しさん
2024/09/06(金) 08:16:00.50ID:EpQXEMSG737デフォルトの名無しさん
2024/09/06(金) 08:41:14.19ID:EpQXEMSG738デフォルトの名無しさん
2024/09/06(金) 09:22:28.52ID:mKGFkZT8 >>737
GPLのプログラムソース中のアルゴリズムを別の言語で書いてGPL違反になった判例ある?
GPLのプログラムソース中のアルゴリズムを別の言語で書いてGPL違反になった判例ある?
739デフォルトの名無しさん
2024/09/06(金) 09:23:43.25ID:zzPaKLb6 >>736
Rustは清書用(キリっ
Rustは清書用(キリっ
740デフォルトの名無しさん
2024/09/06(金) 09:25:11.78ID:zzPaKLb6741デフォルトの名無しさん
2024/09/06(金) 10:11:20.75ID:KHdVu5nS >>740
インターフェースに著作権は無いよ
インターフェースに著作権は無いよ
742デフォルトの名無しさん
2024/09/06(金) 10:16:26.58ID:n4+9uRqg マネージャとコーダーとか多重請負SIer文化で
linuxカーネル開発を語るなよ…
linuxカーネル開発を語るなよ…
743デフォルトの名無しさん
2024/09/06(金) 11:01:47.89ID:7lTmc6Nm じゃあメンテナーとコミッターで
744デフォルトの名無しさん
2024/09/06(金) 11:05:42.46ID:P1Lpy4RD linuxで余計なことをやろうとしたのはコーダーではなく
継承とか仮想関数とか設計を語る人達だよね
継承とか仮想関数とかを使わない方針が固まるまでC++コードを書かなかった情強がRustを書き始めた
継承とか仮想関数とか設計を語る人達だよね
継承とか仮想関数とかを使わない方針が固まるまでC++コードを書かなかった情強がRustを書き始めた
745デフォルトの名無しさん
2024/09/06(金) 12:04:11.30ID:zzPaKLb6 C++でOS造ろうとした●●ぽんとかいう人は情弱か
746デフォルトの名無しさん
2024/09/06(金) 12:19:00.64ID:onD85wsi linuxカーネルのソース読んだことないのか
c言語とは言え実質的に継承、仮想関数で実装されているところ数多あるから
このあたりはもしオブジェクト指向言語であれば非常にすっきり書けたはずだ
c++の問題はそれ以外の落とし穴が多すぎる
c言語とは言え実質的に継承、仮想関数で実装されているところ数多あるから
このあたりはもしオブジェクト指向言語であれば非常にすっきり書けたはずだ
c++の問題はそれ以外の落とし穴が多すぎる
747デフォルトの名無しさん
2024/09/06(金) 12:20:47.23ID:EpQXEMSG >>738
GPLに限定した話は知らんけど、ソースコード->機械語のコンパイルは翻訳として扱われるんだから同じじゃね?
GPLに限定した話は知らんけど、ソースコード->機械語のコンパイルは翻訳として扱われるんだから同じじゃね?
748デフォルトの名無しさん
2024/09/06(金) 12:30:31.40ID:P1Lpy4RD カーネルが清書だ
何言語だろうがカーネルを書いた者は清書おじさんだ
何言語だろうがカーネルを書いた者は清書おじさんだ
749デフォルトの名無しさん
2024/09/06(金) 13:03:06.23ID:zzPaKLb6 ここでRust持ち上げてC++叩いてる人は
C++のこと全然判ってないね
C++のこと全然判ってないね
750デフォルトの名無しさん
2024/09/06(金) 14:21:47.18ID:P1Lpy4RD751デフォルトの名無しさん
2024/09/06(金) 16:17:28.15ID:mKGFkZT8 >>747
判例出してよ
判例出してよ
752デフォルトの名無しさん
2024/09/06(金) 16:37:13.89ID:/YnY9On7 >>749
分かります。
分かります。
753デフォルトの名無しさん
2024/09/06(金) 16:38:41.24ID:/YnY9On7754デフォルトの名無しさん
2024/09/06(金) 18:30:21.35ID:z6D1HraO C++のこと、全然わかんないや
わかってる人に会ったこともない
わかってる人に会ったこともない
755デフォルトの名無しさん
2024/09/06(金) 19:25:43.95ID:YdMd7Cxd C++のメタプログラミングがすべてを理解しようとしたら頭おかしくなる
756デフォルトの名無しさん
2024/09/06(金) 20:38:27.30ID:EpQXEMSG757デフォルトの名無しさん
2024/09/07(土) 07:53:51.62ID:FsPkWUQG758デフォルトの名無しさん
2024/09/07(土) 08:03:00.66ID:vlbXq7x5 そろそろGPLスレでやった方がいい
759デフォルトの名無しさん
2024/09/07(土) 08:24:32.13ID:bjSDu3Ht このスレにRustでGPLロンダリングしている輩が一定数居そうだからおk
760デフォルトの名無しさん
2024/09/07(土) 09:16:43.75ID:vmkw4WWt unsafeを使えばCを呼べるのに一体なぜCをRustに書き直すんだ
761デフォルトの名無しさん
2024/09/07(土) 10:03:49.93ID:Gu5ULvaE チューニングするなら結局境界検査とかオフにすることになるしなぁ
762デフォルトの名無しさん
2024/09/07(土) 10:22:43.32ID:sqLgjcFz 低レイヤ、ベアメタルってのも何故か一連のRust関連スレで見かける印象
763デフォルトの名無しさん
2024/09/07(土) 10:37:53.70ID:aLQz+qVq >>757
レスバトラーなら絶対言うだろうなと思ったら案の定で笑っちゃった
レスバトラーなら絶対言うだろうなと思ったら案の定で笑っちゃった
764デフォルトの名無しさん
2024/09/07(土) 11:14:10.87ID:s8y/n5qE765デフォルトの名無しさん
2024/09/07(土) 11:33:41.32ID:wkpoJM1A ランダムアクセスは思ったより少ないけど必要なところでは性能的に割とシビアなことも多いぞ。
766デフォルトの名無しさん
2024/09/07(土) 11:44:43.13ID:UFsx2JaR >>757
その反論するならまず
「著作物のGPL配布には『著作権上コンパイルは翻訳として扱われる』ことを否定する要因がある」
ことを明らかにしなきゃ話にならんわな。
そもそも>747で「GPLに限定した話は知らんけど」と言っているのにその反論は無能すぎるかと。
その反論するならまず
「著作物のGPL配布には『著作権上コンパイルは翻訳として扱われる』ことを否定する要因がある」
ことを明らかにしなきゃ話にならんわな。
そもそも>747で「GPLに限定した話は知らんけど」と言っているのにその反論は無能すぎるかと。
767デフォルトの名無しさん
2024/09/07(土) 11:58:50.25ID:LaGZ4PBX >>760
unsafeだからですよ
unsafeだからですよ
768デフォルトの名無しさん
2024/09/07(土) 12:14:44.55ID:i403o9eP769デフォルトの名無しさん
2024/09/07(土) 13:21:00.20ID:vmkw4WWt C++とCがまるで嫁と姑のように同居する設計はLinuxに採用されなかった
Rustなら同居にはならない
本来の目的はそんな感じだろう
Rustなら同居にはならない
本来の目的はそんな感じだろう
770デフォルトの名無しさん
2024/09/07(土) 13:41:30.42ID:EaB+sfRT LinusがC++を嫌ってるのはCとの関係性でなくC++独自の部分だと思うぞ
「レベルの低い開発者がクラスとかオブジェクトを使ってどうしようもない壊れたコードを容易に作れる」といった感じだったと思う
これはC++ 11すら登場してない時代の批判だから、今も同じように思うかどうかは分からないけど
あと「C++の例外機構はカーネル開発に向かない」というのもあって、これは今も同じだと思う
「レベルの低い開発者がクラスとかオブジェクトを使ってどうしようもない壊れたコードを容易に作れる」といった感じだったと思う
これはC++ 11すら登場してない時代の批判だから、今も同じように思うかどうかは分からないけど
あと「C++の例外機構はカーネル開発に向かない」というのもあって、これは今も同じだと思う
771デフォルトの名無しさん
2024/09/07(土) 13:45:37.17ID:D6q2gEim RustやGoなどの例外ではなくエラー値を返していくやり方いいね
772デフォルトの名無しさん
2024/09/07(土) 14:09:35.09ID:YJSeDDN1 返されたエラー値をスルーする事例が多発したから例外が作られたと思う
Rustはmust_useがあるけどGoはよく分からん(特に戻り値がエラーだけの関数)
Rustはmust_useがあるけどGoはよく分からん(特に戻り値がエラーだけの関数)
773デフォルトの名無しさん
2024/09/07(土) 14:10:48.96ID:aLQz+qVq ハイプ期に流行った言説をいつまでも言い続けていくこの感じ
774デフォルトの名無しさん
2024/09/07(土) 14:34:40.97ID:vmkw4WWt 東京オリンピック、大阪万博、不動産バブル
775デフォルトの名無しさん
2024/09/07(土) 15:19:49.13ID:FsPkWUQG >>763>>766
スレ違うだし判例無いならもういいよ
スレ違うだし判例無いならもういいよ
776デフォルトの名無しさん
2024/09/07(土) 16:51:05.14ID:vlbXq7x5 ゲームサーバーもRustで書く時代か
> 業務内容
> 経験・志向に応じて、以下のような分野でお仕事をしていただきます。
> ・ゲームサーバー構築およびバックエンド開発(Rust、C++、etc)
> ・運用補助のためのフロントエンドおよびバックエンド開発(Rust、React、TypeScript、etc)
> 今までゲームサーバーの開発ではC++がメインでしたが、近年少しずつRustに移行しつつあります。
> 実績としてARMORED COREⅥのゲームサーバーはRustで作られ、稼働しています。
> Rust、C++のいずれかの経験者を歓迎していますが、他の言語経験者でRust、C++に興味ある方も歓迎しております。
> 業務内容
> 経験・志向に応じて、以下のような分野でお仕事をしていただきます。
> ・ゲームサーバー構築およびバックエンド開発(Rust、C++、etc)
> ・運用補助のためのフロントエンドおよびバックエンド開発(Rust、React、TypeScript、etc)
> 今までゲームサーバーの開発ではC++がメインでしたが、近年少しずつRustに移行しつつあります。
> 実績としてARMORED COREⅥのゲームサーバーはRustで作られ、稼働しています。
> Rust、C++のいずれかの経験者を歓迎していますが、他の言語経験者でRust、C++に興味ある方も歓迎しております。
777デフォルトの名無しさん
2024/09/07(土) 17:01:27.84ID:kS2tnPiY ゲームサーバーは低レイヤRustプロジェクトじゃないから
Linux等からのGPLロンダリングは関係なさそうだね
低レイヤ、ベアメタル、Rustがポイントなのかな?
Linux等からのGPLロンダリングは関係なさそうだね
低レイヤ、ベアメタル、Rustがポイントなのかな?
778デフォルトの名無しさん
2024/09/07(土) 18:01:33.85ID:Xs/MSaVq >>775
判例という難しそうな言葉を使いたいお年頃なのね
判例という難しそうな言葉を使いたいお年頃なのね
779デフォルトの名無しさん
2024/09/07(土) 18:16:42.45ID:FsPkWUQG >>778
お前のお気持ち表明に何の意味も無いのよ
お前のお気持ち表明に何の意味も無いのよ
780デフォルトの名無しさん
2024/09/07(土) 18:41:33.85ID:vmkw4WWt 表明されたエラーを無視されない確実な方法はプロセス全体を終了すること
終了を回避する方法があれば無視される可能性がある
終了を回避する方法があれば無視される可能性がある
781デフォルトの名無しさん
2024/09/07(土) 18:57:47.65ID:UFsx2JaR782デフォルトの名無しさん
2024/09/07(土) 21:31:00.16ID:PLAeIm6B 逆コンパイルとGPLプログラム見たことがある人がプログラム書く行為が同じってマジ?
783デフォルトの名無しさん
2024/09/07(土) 22:24:15.60ID:aLQz+qVq 違うと思うならその辺の適当なGPLソフトウェアをパクり移植して著作権記載全部消してAll rights reservedって書いて公開して自分でFSFに通報すれば
784デフォルトの名無しさん
2024/09/07(土) 22:53:24.95ID:vmkw4WWt なぜ実験すればいいと思った
自分は科学的だと思ってるのかな
科学って暴走するんだな
自分は科学的だと思ってるのかな
科学って暴走するんだな
785デフォルトの名無しさん
2024/09/07(土) 23:03:30.32ID:gaaFAzxX786デフォルトの名無しさん
2024/09/07(土) 23:14:34.54ID:oYZzSe8a 当たり前だが「見た == パクった」とはならない
ただ万が一の訴訟リスクも避けたいなら
GPLのソースを見て仕様を起こす組織/人間と
GPLのソースを見ず起こされた仕様をもとに
コードを書く組織/人間を完全に分けておけばよい
これで完全にパクリを否定できる
ただ万が一の訴訟リスクも避けたいなら
GPLのソースを見て仕様を起こす組織/人間と
GPLのソースを見ず起こされた仕様をもとに
コードを書く組織/人間を完全に分けておけばよい
これで完全にパクリを否定できる
787デフォルトの名無しさん
2024/09/08(日) 00:01:36.02ID:uWZDJFuJ そもそも、特許取れてないものをパクることは、歴史的には許されてきた。
また、著作権法も契約も、作家や著作権者が作品を売って暮らしていけることを目的と
していたものであり、GPLのように社会全体を構造的に変化させることを目的としたものでは
なく、法令の目的外使用と言える。
また、著作権法も契約も、作家や著作権者が作品を売って暮らしていけることを目的と
していたものであり、GPLのように社会全体を構造的に変化させることを目的としたものでは
なく、法令の目的外使用と言える。
788デフォルトの名無しさん
2024/09/08(日) 02:29:49.31ID:/oFDgQbn パソコンのキーボードでフリック入力できるものはありますか?
789デフォルトの名無しさん
2024/09/08(日) 07:57:18.94ID:4KkAMey9 相場が乱高下することは許される
ということは昨日は無罪だったものが今日は有罪になっても
相場が間違っていることにならない
ということは昨日は無罪だったものが今日は有罪になっても
相場が間違っていることにならない
790デフォルトの名無しさん
2024/09/08(日) 21:59:24.16ID:YTIPNyDo shared_ptrはRustではArcだと思うけどこれ本当?
447 デフォルトの名無しさん 2024/09/07(土) 20:17
むしろshared_ptr<T>でスレッド間共有オブジェクトを保持するのは
生ポに対するshared_ptr<T>のメリットが無い……
可能な限りスレッド間共有なんてことはやめてconstオブジェクトのコピーにするのが正義……
447 デフォルトの名無しさん 2024/09/07(土) 20:17
むしろshared_ptr<T>でスレッド間共有オブジェクトを保持するのは
生ポに対するshared_ptr<T>のメリットが無い……
可能な限りスレッド間共有なんてことはやめてconstオブジェクトのコピーにするのが正義……
791デフォルトの名無しさん
2024/09/08(日) 22:20:14.30ID:vegiTRtO C++スレでやれって感じだけど、自分ははその説明は適切でないと思う
shared_ptrを使う理由はちゃんとある
寿命を適切に管理してるなら片方がunique_ptr等で所有して他方に生ポインタ渡すのも駄目ではない
可能ならデータ共有よりもスレッドごとに所有させる方が安全というのは分かるけど、共有が必要な場面って普通にあるはず
shared_ptrを使う理由はちゃんとある
寿命を適切に管理してるなら片方がunique_ptr等で所有して他方に生ポインタ渡すのも駄目ではない
可能ならデータ共有よりもスレッドごとに所有させる方が安全というのは分かるけど、共有が必要な場面って普通にあるはず
792デフォルトの名無しさん
2024/09/08(日) 23:25:28.71ID:KupGOfGa >>791
スレッドの寿命に依存するからunique_ptr使用でポインタ渡しはリスキーだね
Rustならthread::scopeで安全に参照を渡せる
もちろんArcを使うのもよくて
追加コストはclone時と終える時の加減算
スレッド内での参照にコストはかからないからArcを避ける必要はない
スレッドの寿命に依存するからunique_ptr使用でポインタ渡しはリスキーだね
Rustならthread::scopeで安全に参照を渡せる
もちろんArcを使うのもよくて
追加コストはclone時と終える時の加減算
スレッド内での参照にコストはかからないからArcを避ける必要はない
793デフォルトの名無しさん
2024/09/08(日) 23:59:54.41ID:vegiTRtO 自分も推奨とまでは思ってなくて、「寿命の問題がないことが明らかであれば許容する」くらいの感じで書いた
クラスのコンストラクタでスレッド立ち上げて、デストラクタの中でjoinするような作り (よくあると思う) ならスレッドの寿命 < 参照先のデータの寿命 は明らかだし
shared_ptrの方が意図は分かりやすいとは思うけど、必須までとは思わない
クラスのコンストラクタでスレッド立ち上げて、デストラクタの中でjoinするような作り (よくあると思う) ならスレッドの寿命 < 参照先のデータの寿命 は明らかだし
shared_ptrの方が意図は分かりやすいとは思うけど、必須までとは思わない
794デフォルトの名無しさん
2024/09/09(月) 00:11:01.40ID:tO4U/3Ox std::thread::scope()は必然的にそういう挙動になるな
終了時のjoinが保証されるからスレッドの寿命 < 参照先のデータの寿命になる
実際の例は
https://doc.rust-lang.org/stable/std/thread/fn.scope.html
のExample参照
終了時のjoinが保証されるからスレッドの寿命 < 参照先のデータの寿命になる
実際の例は
https://doc.rust-lang.org/stable/std/thread/fn.scope.html
のExample参照
795デフォルトの名無しさん
2024/09/09(月) 05:07:18.49ID:cTuZnVfu796デフォルトの名無しさん
2024/09/09(月) 07:01:55.53ID:p2Jj+0Ux >>795
その考え方が既に詰んでいる
もし寿命を適切に管理できるならunique_ptrもRustも不要
しかし人間が100%適切に管理することは不可能だからC++でunique_ptr等が導入された
そしてさらにRust言語が導入された
その考え方が既に詰んでいる
もし寿命を適切に管理できるならunique_ptrもRustも不要
しかし人間が100%適切に管理することは不可能だからC++でunique_ptr等が導入された
そしてさらにRust言語が導入された
797デフォルトの名無しさん
2024/09/09(月) 08:08:18.92ID:eGfGA388 寿命を適切に管理できる時はあるんだけど、そうであるかそうでないかの境界くらいなコードをうっかり受け入れてしまうとその後ずっと負債になるんだよな
798デフォルトの名無しさん
2024/09/09(月) 08:13:24.94ID:X0IwgyVa でもここでRustを持ち上げている一定数は
RustでGPLロンダリングしていると吹聴しているレベル
低レイヤ、ベアメタル、Rustってのがポイントみたい
RustでGPLロンダリングしていると吹聴しているレベル
低レイヤ、ベアメタル、Rustってのがポイントみたい
799デフォルトの名無しさん
2024/09/09(月) 08:59:39.68ID:XH4OT6yj どうあっても完璧にはならないという前提で、ちょいちょいリファクタリングするくらいの運用ができればいいんだけどな。
ワヤになることがあっても戻せば少なくとも動きはするし。
ワヤになることがあっても戻せば少なくとも動きはするし。
800デフォルトの名無しさん
2024/09/09(月) 11:37:01.61ID:CQiqzRbc またC++知らん人が出て来たでおじゃる
801デフォルトの名無しさん
2024/09/09(月) 13:49:10.25ID:eftneq+I C++のスマートポインタは分かってる分かってないもあるがTの型や使われ方によって考えること多すぎて元々キツイやろ
Rustは継承無くしたり所有権複雑にしたことでスマートポインタの様々な機能が可能な限り単一責任に分散されててスッキリしてる
考えた奴の努力凄えと思う
Rustは継承無くしたり所有権複雑にしたことでスマートポインタの様々な機能が可能な限り単一責任に分散されててスッキリしてる
考えた奴の努力凄えと思う
802デフォルトの名無しさん
2024/09/09(月) 13:56:14.25ID:ZyHHM8VJ あっちのスレワッチョイ付いてるからわざわざこっちに持ってきたの?
803デフォルトの名無しさん
2024/09/09(月) 20:31:43.26ID:6U3TxPzT Rust プログラミング 1 (全 5 回)
watch?v=6AiU6ncdUdk
出演
低レイヤーガール 1: 自作 OS を Rust で書いている
低レイヤーガール 2: 自作 browser を Rust で書いている
watch?v=6AiU6ncdUdk
出演
低レイヤーガール 1: 自作 OS を Rust で書いている
低レイヤーガール 2: 自作 browser を Rust で書いている
804デフォルトの名無しさん
2024/09/09(月) 21:35:49.10ID:+SItvs3R805デフォルトの名無しさん
2024/09/09(月) 23:09:27.92ID:4O0n94uD806デフォルトの名無しさん
2024/09/09(月) 23:57:57.19ID:q4jDNuIo Rc/Arcは確保したヒープの解放責任者数だけをカウントしている
解放責任者数がゼロになると解放する
参照している人の数はカウントしていない
参照がいくつ増えようがRc/Arcの内部のカウンターは変化しない
まずこの区別ができているかどうかが基礎かな
解放責任者数がゼロになると解放する
参照している人の数はカウントしていない
参照がいくつ増えようがRc/Arcの内部のカウンターは変化しない
まずこの区別ができているかどうかが基礎かな
807デフォルトの名無しさん
2024/09/10(火) 00:00:07.29ID:30cMByxj そしてスタック上のTであろうがヒープに確保したBox<T>やRc<T>であろうが
そのT部分への参照は同じ&T型となりその値は(スライスなどを除いて)アドレス値のみで構成される
そこでスタック領域かヒープ領域かの区別はない
そしてそこには参照のカウント値は当然なくてライフタイム値も存在しない
参照の有無やライフタイムの妥当性はコンパイル時のみ把握されて問題があればコンパイル時にエラーとなる
そのT部分への参照は同じ&T型となりその値は(スライスなどを除いて)アドレス値のみで構成される
そこでスタック領域かヒープ領域かの区別はない
そしてそこには参照のカウント値は当然なくてライフタイム値も存在しない
参照の有無やライフタイムの妥当性はコンパイル時のみ把握されて問題があればコンパイル時にエラーとなる
808デフォルトの名無しさん
2024/09/10(火) 11:45:49.01ID:oGuW1rX8809デフォルトの名無しさん
2024/09/10(火) 13:35:20.41ID:KGjTz1X0 >そこでスタック領域かヒープ領域かの区別はない
これもコンパイル時のみの話では
これもコンパイル時のみの話では
810デフォルトの名無しさん
2024/09/10(火) 18:55:33.96ID:q3P6j0bc 参照があるかないかライフタイムを満たしているかといった情報はコンパイルの時しか持たないけど
参照のアドレス値は実行時にも当然ある
ただしそれがヒープを指すかスタックを指すかは把握できないから区別しない
そして区別しなくてもよい方法をRustは導入した
参照のアドレス値は実行時にも当然ある
ただしそれがヒープを指すかスタックを指すかは把握できないから区別しない
そして区別しなくてもよい方法をRustは導入した
811デフォルトの名無しさん
2024/09/10(火) 18:58:00.79ID:q3P6j0bc なぜどちらを指しているか把握できないのか?
それは次のようなコードも書けるため
fn bigger<'a: 'c, 'b: 'c, 'c, T: PartialOrd + ?Sized>(x: &'a T, y: &'b T) -> &'c T {
if x > y { x } else { y }
}
二つの引数にヒープを指す参照とスタックを指す参照を渡した場合
関数から返ってくる参照がどちらなのかは各実行毎のデータが揃うまでわからない
そして実は参照が指す領域がどちらなのかを把握する必要がないのが結論
ライフタイムさえ満たしていれば区別する必要がなくなった
それは次のようなコードも書けるため
fn bigger<'a: 'c, 'b: 'c, 'c, T: PartialOrd + ?Sized>(x: &'a T, y: &'b T) -> &'c T {
if x > y { x } else { y }
}
二つの引数にヒープを指す参照とスタックを指す参照を渡した場合
関数から返ってくる参照がどちらなのかは各実行毎のデータが揃うまでわからない
そして実は参照が指す領域がどちらなのかを把握する必要がないのが結論
ライフタイムさえ満たしていれば区別する必要がなくなった
812デフォルトの名無しさん
2024/09/10(火) 20:21:44.39ID:5FTvOJ5k なるほど
813デフォルトの名無しさん
2024/09/10(火) 21:08:40.00ID:3nGnNoH6 >>805の疑問とは何の関係もないよね
騙されてるやつが訳1名いるみたいでご愁傷様だけど
騙されてるやつが訳1名いるみたいでご愁傷様だけど
814デフォルトの名無しさん
2024/09/10(火) 21:31:43.71ID:7V29flyi Rcは参照の数を管理するものではない
Rcはヒープ領域を確実に解放するためにその所有者の数を管理する
当然Rcはヒープ領域だけを扱う
スタック領域はRAIIで確実に解放される
Rcはヒープ領域を確実に解放するためにその所有者の数を管理する
当然Rcはヒープ領域だけを扱う
スタック領域はRAIIで確実に解放される
815デフォルトの名無しさん
2024/09/10(火) 22:01:22.00ID:yy/y1+XI 誰かがArc/Rcはborrowの数を管理してると言ってる?
文脈によって意味が変わる「参照」とか「reference」という言葉を勘違いしてるだけじゃない?
Arc/Rcはreference counting pointerなんだから当然参照の数は管理してる
同じアロケーションを参照してるowning pointerの数を管理してる
文脈によって意味が変わる「参照」とか「reference」という言葉を勘違いしてるだけじゃない?
Arc/Rcはreference counting pointerなんだから当然参照の数は管理してる
同じアロケーションを参照してるowning pointerの数を管理してる
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ではなぜかアリーナが使われていない
その差が速度差となっている
前にもこのアリーナ利用の有無で速度が全く異なる話がこのスレで出ていたような
916デフォルトの名無しさん
2024/09/19(木) 03:23:22.25ID:NqtXmLsQ >>915
GoはアリーナアロケータなしでRustより速い
GoはアリーナアロケータなしでRustより速い
917デフォルトの名無しさん
2024/09/19(木) 03:57:37.37ID:kiFDdu85 そもそも Rust のアリーナアロケータってなんで全部独自コンテナみたいな感じで実装されてんの?
allocator_api がまだ unstable だから?
allocator_api がまだ unstable だから?
918デフォルトの名無しさん
2024/09/19(木) 04:11:09.43ID:kiFDdu85 真面目に改善しようと思うなら、プロファイル取った上で alloc/dealloc が本当にボトルネックだったのか、そこから検証しなきゃ
919デフォルトの名無しさん
2024/09/19(木) 04:44:55.41ID:99kJCx26 >>916
Goはガベージコレクタ依存言語だから
アリーナを使用するか否かでそれほど大きくは変わらない
特に今回はGCが起きる前に終わるため影響は限りなく小さい
アリーナを使用するか否かで非常に大きく影響を受けるのはGCを前提としない言語
Goはガベージコレクタ依存言語だから
アリーナを使用するか否かでそれほど大きくは変わらない
特に今回はGCが起きる前に終わるため影響は限りなく小さい
アリーナを使用するか否かで非常に大きく影響を受けるのはGCを前提としない言語
920デフォルトの名無しさん
2024/09/19(木) 07:08:15.45ID:+8pHe+Yd 一般にガベコレ言語はalloc/freeが速い
特にfreeが速い
さらに小さなプログラムでは、遅延させたfreeを結局実行しないまま終わるのでさらに速い
特にfreeが速い
さらに小さなプログラムでは、遅延させたfreeを結局実行しないまま終わるのでさらに速い
921デフォルトの名無しさん
2024/09/19(木) 09:38:22.33ID:10l+f26H > アリーナ利用の有無
×
> アリーナを使用するか否か
×
○ Rustはアリーナアロケーターなトライ木をポンと書ける程に整備されてない
×
> アリーナを使用するか否か
×
○ Rustはアリーナアロケーターなトライ木をポンと書ける程に整備されてない
922デフォルトの名無しさん
2024/09/19(木) 10:26:52.55ID:v0DA15Jd Sorena
923デフォルトの名無しさん
2024/09/19(木) 12:34:03.58ID:bzcz+C1u アリーナ関係ない前段のsieve部分もrustが遅い
programming-language-benchmarks.vercel.app/problem/nsieve
前まで最適化に熱心だった信者がZigに移ったんかな
programming-language-benchmarks.vercel.app/problem/nsieve
前まで最適化に熱心だった信者がZigに移ったんかな
924デフォルトの名無しさん
2024/09/19(木) 12:48:12.80ID:kiFDdu85925デフォルトの名無しさん
2024/09/19(木) 13:03:22.18ID:FghkJ/1s >>923
BunでZigが始まった感ある
BunでZigが始まった感ある
926デフォルトの名無しさん
2024/09/19(木) 16:25:47.59ID:ZuBUnHjP >>925
1.0に達してから出直してくれ
1.0に達してから出直してくれ
927デフォルトの名無しさん
2024/09/19(木) 17:04:35.08ID:W7Rw00sD いい加減ベンチでHashMap使うのやめてくれんかな
928デフォルトの名無しさん
2024/09/19(木) 17:04:45.88ID:AQ9Jto0I929デフォルトの名無しさん
2024/09/19(木) 17:18:19.21ID:kiFDdu85 Zig 1.0 は 2025 年にリリース予定らしいので、その後はどうなるかね
930デフォルトの名無しさん
2024/09/19(木) 18:00:30.55ID:5zXjGsxJ931デフォルトの名無しさん
2024/09/19(木) 18:00:52.16ID:99kJCx26 Zigはasync/awaitなどの非同期対応を捨てたまま狭い領域でやっていくのかな
932デフォルトの名無しさん
2024/09/19(木) 18:04:31.95ID:5zXjGsxJ Zigはstd.DynamicBitSet
C++はvector<bool>
を使っている
C++はvector<bool>
を使っている
933デフォルトの名無しさん
2024/09/19(木) 21:18:23.55ID:js953yg3934デフォルトの名無しさん
2024/09/19(木) 21:23:20.81ID:js953yg3 それと一番最初Zigはコンパイルエラーだったので>>909の段階でstd.TailQueueはstd.DoublyLinkedListにした
935デフォルトの名無しさん
2024/09/19(木) 22:39:32.91ID:Ar0pN/Hy >>115
Zigはそんな安全性無視なことをして速さを得ているの?
Zigはそんな安全性無視なことをして速さを得ているの?
936デフォルトの名無しさん
2024/09/19(木) 23:08:32.65ID:O+mD9PcY 範囲外チェックに突っ込むならC/C++もそうですがな
RustはC/C++ほどには速さを優先してなくて、安全性の方を重視してる
HashMapがデフォルトで「遅いけど安全」なハッシュアルゴリズムを使うのもそう
Rustが良いのは安全性や型による表現力の高さが提供されてて、その上で十分に速いところ
純粋な速さだけであれば、よりCに近いZigの方が上というのも妥当といえば妥当
RustはC/C++ほどには速さを優先してなくて、安全性の方を重視してる
HashMapがデフォルトで「遅いけど安全」なハッシュアルゴリズムを使うのもそう
Rustが良いのは安全性や型による表現力の高さが提供されてて、その上で十分に速いところ
純粋な速さだけであれば、よりCに近いZigの方が上というのも妥当といえば妥当
937デフォルトの名無しさん
2024/09/19(木) 23:24:05.93ID:a7Zco7ef そういう方針のZigを採用する企業は極少数になりそう
アメリカ政府が安全な言語に置き換えよう!と言ってるけどZigはNG側だね
アメリカ政府が安全な言語に置き換えよう!と言ってるけどZigはNG側だね
938デフォルトの名無しさん
2024/09/19(木) 23:46:52.22ID:AQ9Jto0I 「言語が」というだけでなく「デフォルトでは」という前提が付く。
広く使われるようになるとカスい判断をする人も出てくるし、比較的マシなほうをデフォルトにしておくのは合理的な判断だ。
Zig はまだ言語をよく理解しようとする好事家 (いわゆるアーリーアダプタ) のものであってしょうもないユーザは参加してない段階 (なので低能なユーザを考慮してない) というだけかもしれない。
状況や用途によって判断は違ってくるので単純な良し悪しでは測れない。
広く使われるようになるとカスい判断をする人も出てくるし、比較的マシなほうをデフォルトにしておくのは合理的な判断だ。
Zig はまだ言語をよく理解しようとする好事家 (いわゆるアーリーアダプタ) のものであってしょうもないユーザは参加してない段階 (なので低能なユーザを考慮してない) というだけかもしれない。
状況や用途によって判断は違ってくるので単純な良し悪しでは測れない。
939デフォルトの名無しさん
2024/09/19(木) 23:56:50.81ID:H7B6P1++ ホワイトハウスの意向で今は安全な言語への移行を推奨という状況だけど近いうちにもっと厳しくなる
その時にZigの立場はない
その時にZigの立場はない
940デフォルトの名無しさん
2024/09/19(木) 23:57:18.58ID:O+mD9PcY unsafe Rustを使う分野だとRustも安全だと言い切れなくない?
RustほどではないけどZigもCに比べれば安全なコードを書きやすいし、Better Cとしての価値は十分にあると思う
将来的に採用が増えるかは分からないけど、C開発者にとって移植しやすい・学習コストが小さいという理由でZigを選ぶケースはありそう
RustほどではないけどZigもCに比べれば安全なコードを書きやすいし、Better Cとしての価値は十分にあると思う
将来的に採用が増えるかは分からないけど、C開発者にとって移植しやすい・学習コストが小さいという理由でZigを選ぶケースはありそう
941デフォルトの名無しさん
2024/09/20(金) 00:04:52.33ID:/FW0+jsA いくら悪いと主張したところで低レイヤは C が支配している (OS やデバイスドライバは大抵の場合に C で書かれている) という現実があるのは変わらんからな。
過渡的な措置として (充分に安全ではなくても) C から移植しやすい言語に出番がありうるというのはわかる。
過渡的な措置として (充分に安全ではなくても) C から移植しやすい言語に出番がありうるというのはわかる。
942デフォルトの名無しさん
2024/09/20(金) 00:12:09.61ID:nStvhCnF とはいえ最近のLinuxカーネルメンテナの話とか見るに彼ら(の一部)はC以外に移行する気は一切なさそうだよね
あと組み込み系でC使っている人は多いけど、あっちはあっちでコンパイラ認証必須だったりして
Zigが使い物になるにはまだ10年とかかかりそう
そこまでZigがちゃんと生きているかというと結構難しいところなんでは…
あと組み込み系でC使っている人は多いけど、あっちはあっちでコンパイラ認証必須だったりして
Zigが使い物になるにはまだ10年とかかかりそう
そこまでZigがちゃんと生きているかというと結構難しいところなんでは…
943デフォルトの名無しさん
2024/09/20(金) 00:20:40.07ID:zHznArWB >>940
そのスレにいるならそろそろ学習しようよ
「unsafe Rustを使う分野」というものは存在しない
標準ライブラリがunsafeで作られているためどんな分野であろうとunsafeのお世話になる
しかしunsafeは特定の関数やモジュールに閉じ込められていてそれ以外の部分の安全性をRust(コンパイラ)が保証してくれる
新たな分野であろうとこの原理は同じ
プログラムのほとんどの部分は自動的に安全性が保証される
どうしても必要な極一部のunsafe部分のみに人間の監視リソースを集中できる
この原理によりRustは安全であるとされて選ばれている
そのスレにいるならそろそろ学習しようよ
「unsafe Rustを使う分野」というものは存在しない
標準ライブラリがunsafeで作られているためどんな分野であろうとunsafeのお世話になる
しかしunsafeは特定の関数やモジュールに閉じ込められていてそれ以外の部分の安全性をRust(コンパイラ)が保証してくれる
新たな分野であろうとこの原理は同じ
プログラムのほとんどの部分は自動的に安全性が保証される
どうしても必要な極一部のunsafe部分のみに人間の監視リソースを集中できる
この原理によりRustは安全であるとされて選ばれている
944デフォルトの名無しさん
2024/09/20(金) 02:06:23.53ID:hHX3CUd7946デフォルトの名無しさん
2024/09/20(金) 08:14:15.43ID:ombgsYO5 走行中に連結器が外れたら
そのまま走り続けるのがC言語
緊急停止がabort
そもそも外れないのがRust
でFA?
そのまま走り続けるのがC言語
緊急停止がabort
そもそも外れないのがRust
でFA?
947デフォルトの名無しさん
2024/09/20(金) 08:19:24.68ID:ombgsYO5 >>940
unsafe Rust は安全だ
unsafe Rust は安全だ
948デフォルトの名無しさん
2024/09/20(金) 08:22:06.57ID:ombgsYO5949デフォルトの名無しさん
2024/09/20(金) 08:26:57.74ID:+urgn5Bc Cから移植するのはZig
C++から移植するのはRust
明快だ
C++から移植するのはRust
明快だ
950デフォルトの名無しさん
2024/09/20(金) 08:36:43.29ID:0kwaWsQC というより充分に安全でないならわざわざCから移植する必要がないんだよな
Rustは安全というメリットがあるから移植コストを払える(人もいる)けど
Zigがbetter Cであるのはわかるけど、現実にはCを使い続ける人がほとんどじゃないかと思う
Rustは安全というメリットがあるから移植コストを払える(人もいる)けど
Zigがbetter Cであるのはわかるけど、現実にはCを使い続ける人がほとんどじゃないかと思う
951デフォルトの名無しさん
2024/09/20(金) 08:41:47.73ID:0kwaWsQC ZigはDとかNimと同じ匂いがするんだよね
確かに便利になってる部分はいろいろあるんだけど、すでに慣れ親しんだ言語から移行するだけの強力なモチベーションがないというか
確かに便利になってる部分はいろいろあるんだけど、すでに慣れ親しんだ言語から移行するだけの強力なモチベーションがないというか
952デフォルトの名無しさん
2024/09/20(金) 09:54:00.87ID:ZOd0SPdk C/C++より安全でC/++から移植し易いのはNim
953デフォルトの名無しさん
2024/09/20(金) 09:57:45.63ID:ZOd0SPdk954デフォルトの名無しさん
2024/09/20(金) 10:26:50.19ID:U1w7xIBY Rustは管理者・経営者という強力な味方がいるから、コーダーに強制するのは簡単だな。
かつてのJavaの流れになれるかどうか。
かつてのJavaの流れになれるかどうか。
955デフォルトの名無しさん
2024/09/20(金) 10:47:55.86ID:SuyVRk3R956デフォルトの名無しさん
2024/09/20(金) 11:17:57.80ID:/FW0+jsA 問題は想定しないところから出てくる。
想定されるところは対処済みだから。
想定漏れを潰すには実際に運用して、出てきた問題を潰してというループを繰り返すしかない。
実務者の考えはそういうものだ。
運用実績があることが保証の裏付けなんだよ。
Rust の保証が C に比べて強力なのはメモリアクセスまわりの違反検出くらいなので
Rust で書きなおすなら他の要素は検証しなおしになる。
OS が保証しなけりゃならないのはメモリアクセス違反がないことだけじゃないんだぞ。
想定されるところは対処済みだから。
想定漏れを潰すには実際に運用して、出てきた問題を潰してというループを繰り返すしかない。
実務者の考えはそういうものだ。
運用実績があることが保証の裏付けなんだよ。
Rust の保証が C に比べて強力なのはメモリアクセスまわりの違反検出くらいなので
Rust で書きなおすなら他の要素は検証しなおしになる。
OS が保証しなけりゃならないのはメモリアクセス違反がないことだけじゃないんだぞ。
957デフォルトの名無しさん
2024/09/20(金) 11:24:36.15ID:ZOd0SPdk Rustは清書用(キリっ
958デフォルトの名無しさん
2024/09/20(金) 11:35:22.91ID:Z+QjUDB+ 組み込み系はMISRA Cとかあるがお作法レイヤーだからな。
rustの場合は言語レベルの層で対応できるのがメリットでかい。
rustの場合は言語レベルの層で対応できるのがメリットでかい。
959デフォルトの名無しさん
2024/09/20(金) 11:36:34.54ID:iYhQa7Jy960デフォルトの名無しさん
2024/09/20(金) 11:48:11.57ID:KtEON28z >>956
モダンな言語を使ったことがない時代遅れの人から見るとそういう間違った勘違いをしてしまいがちだけど
C言語と比較するとモダンな言語はいずれも驚くほど様々なことを保証してくれていたりミスが減ったりするよ
Rustはさらにメモリ競合なども防止してくれて強力だよ
モダンな言語を使ったことがない時代遅れの人から見るとそういう間違った勘違いをしてしまいがちだけど
C言語と比較するとモダンな言語はいずれも驚くほど様々なことを保証してくれていたりミスが減ったりするよ
Rustはさらにメモリ競合なども防止してくれて強力だよ
962デフォルトの名無しさん
2024/09/20(金) 13:06:37.11ID:/FW0+jsA963デフォルトの名無しさん
2024/09/20(金) 13:13:40.32ID:/FW0+jsA964デフォルトの名無しさん
2024/09/20(金) 13:22:45.84ID:ihDm1oNN965デフォルトの名無しさん
2024/09/20(金) 13:38:51.47ID:hHX3CUd7 >>963
全体の文意を読まないで「デバイスドライバは大抵の場合に C で書かれている」の部分だけ拾って反応しちゃったんだと思う
全体の文意を読まないで「デバイスドライバは大抵の場合に C で書かれている」の部分だけ拾って反応しちゃったんだと思う
966デフォルトの名無しさん
2024/09/20(金) 13:47:00.37ID:F4gFpM7i >>827
C++はそのようなデータ競合を見逃すけど
Rustはコンパイルエラーにしてくれる
let mut v = vec![0, 1, 2, 3, 4, 5, 6, 7];
let p5 = &v[5];
v.push(8);
assert!(*p5 == 5);
error[E0502]: cannot borrow `v` as mutable because it is also borrowed as immutable
| let p5 = &v[5];
| - immutable borrow occurs here
| v.push(8);
| ^^^^^^^^^ mutable borrow occurs here
| assert!(*p5 == 5);
| --- immutable borrow later used here
C++はそのようなデータ競合を見逃すけど
Rustはコンパイルエラーにしてくれる
let mut v = vec![0, 1, 2, 3, 4, 5, 6, 7];
let p5 = &v[5];
v.push(8);
assert!(*p5 == 5);
error[E0502]: cannot borrow `v` as mutable because it is also borrowed as immutable
| let p5 = &v[5];
| - immutable borrow occurs here
| v.push(8);
| ^^^^^^^^^ mutable borrow occurs here
| assert!(*p5 == 5);
| --- immutable borrow later used here
967デフォルトの名無しさん
2024/09/20(金) 14:22:18.97ID:ZOd0SPdk968デフォルトの名無しさん
2024/09/20(金) 14:47:29.30ID:hHX3CUd7 >>966
シングルスレッド上で同一アドレスに読み書きが発生することをデータ競合とは言わない
https://en.cppreference.com/w/cpp/language/multithread#Data_races
https://doc.rust-lang.org/nomicon/races.html
シングルスレッド上で同一アドレスに読み書きが発生することをデータ競合とは言わない
https://en.cppreference.com/w/cpp/language/multithread#Data_races
https://doc.rust-lang.org/nomicon/races.html
969デフォルトの名無しさん
2024/09/20(金) 15:06:48.25ID:F4gFpM7i970デフォルトの名無しさん
2024/09/20(金) 15:27:19.87ID:cjvM7FOS >>969
>>827のASAN実行結果
AddressSanitizer: heap-use-after-free
$ clang++ -O1 -g -fsanitize=undefined,address -fno-omit-frame-pointer main.cpp -o main
$ ./main
=================================================================
==26132==ERROR: AddressSanitizer: heap-use-after-free on address 0x...
WRITE of size 4 at 0x... thread T0
#0 0x7ff62e7716d4 in main ~/main.cpp:15:9
...
0x... is located 20 bytes inside of 32-byte region [0x...,0x...)
freed by thread T0 here:
...
#9 0x... in main ~/main.cpp:13:7
...
previously allocated by thread T0 here:
...
#7 0x... in main ~/main.cpp:5:22
...
...
>>827のASAN実行結果
AddressSanitizer: heap-use-after-free
$ clang++ -O1 -g -fsanitize=undefined,address -fno-omit-frame-pointer main.cpp -o main
$ ./main
=================================================================
==26132==ERROR: AddressSanitizer: heap-use-after-free on address 0x...
WRITE of size 4 at 0x... thread T0
#0 0x7ff62e7716d4 in main ~/main.cpp:15:9
...
0x... is located 20 bytes inside of 32-byte region [0x...,0x...)
freed by thread T0 here:
...
#9 0x... in main ~/main.cpp:13:7
...
previously allocated by thread T0 here:
...
#7 0x... in main ~/main.cpp:5:22
...
...
971デフォルトの名無しさん
2024/09/20(金) 15:35:56.11ID:YCHSHi4r このようにC++だとサニタイザーで実行するまでわからない
レアケースで発生するものだと実行しても何日間も見つからないこともある
そして本番へ投入してレアケースが発生して大惨事となる
つまりサニタイザーでは本質的な解決にならないのだ
Rustのように実行せずともコンパイル時に確実に判明することが正しい解決策だ
レアケースで発生するものだと実行しても何日間も見つからないこともある
そして本番へ投入してレアケースが発生して大惨事となる
つまりサニタイザーでは本質的な解決にならないのだ
Rustのように実行せずともコンパイル時に確実に判明することが正しい解決策だ
972デフォルトの名無しさん
2024/09/20(金) 15:36:26.98ID:DKDJjDvH >>827のような操作がバグかどうかは状況による
Rustがやってるのはバグと見做されるような挙動を生みやすいパターンを弾く安全側のアプローチ
言語によっちゃ同名変数の宣言によるシャドウイングを禁止してたりするが、それと似たようなもんだ
Rustがやってるのはバグと見做されるような挙動を生みやすいパターンを弾く安全側のアプローチ
言語によっちゃ同名変数の宣言によるシャドウイングを禁止してたりするが、それと似たようなもんだ
973デフォルトの名無しさん
2024/09/20(金) 15:41:33.93ID:F4gFpM7i974デフォルトの名無しさん
2024/09/20(金) 15:51:51.16ID:DKDJjDvH >>973
それはpush_backの実装がたまたま領域を解放しうるから結果的にバグなだけで、
Rustのチェックがそこまで考慮してこのエラーを出しているわけじゃないでしょ
安全側に倒した結果としてたまたまバグを検出できた例と考えるのが適切
それはpush_backの実装がたまたま領域を解放しうるから結果的にバグなだけで、
Rustのチェックがそこまで考慮してこのエラーを出しているわけじゃないでしょ
安全側に倒した結果としてたまたまバグを検出できた例と考えるのが適切
975デフォルトの名無しさん
2024/09/20(金) 15:51:55.07ID:+urgn5Bc >>959
政治的な理由でマージされないなら、それは記述されているとは言えない
政治的な理由でマージされないなら、それは記述されているとは言えない
976デフォルトの名無しさん
2024/09/20(金) 16:13:04.26ID:YKBLs+L3 >>966,971が裏でJS/TS書いてると思うとほっこりする
977デフォルトの名無しさん
2024/09/20(金) 17:24:13.84ID:Z+QjUDB+978デフォルトの名無しさん
2024/09/20(金) 18:37:17.32ID:fL6HDpBx979デフォルトの名無しさん
2024/09/20(金) 18:46:47.16ID:be7Y0ISI 今rustでグラフィックスプログラミングって実用的?
dx12とかvulkanとか
いい加減c++捨てたいと思ってるけどrustで性能でないなら使えない
dx12とかvulkanとか
いい加減c++捨てたいと思ってるけどrustで性能でないなら使えない
980デフォルトの名無しさん
2024/09/20(金) 18:57:32.01ID:DxeYxJuZ >>974
一般的に参照を保持したままそのデータへの別の可変参照が用いられる(=データが書き換わる)と
意味論的に最初の参照が期待していたものと異なるデータ状態になっている可能性があるためバグの発生要因となる
その例のうち最も極端なものがデータがメモリ開放されてしまっているベクタ伸長による自動メモリ移動の例
もちろんメモリ開放を伴わなくてもデータの状態が変わってしまって意味論的に食い違いが起きることでのバグが生じる
特に複雑な状況だとその食い違いが起きていることを人間が把握しきれなくなり見落としてしまう
Rustではそのようなデータ参照の競合を検出してコンパイルエラーにしてくれるため安全である
一般的に参照を保持したままそのデータへの別の可変参照が用いられる(=データが書き換わる)と
意味論的に最初の参照が期待していたものと異なるデータ状態になっている可能性があるためバグの発生要因となる
その例のうち最も極端なものがデータがメモリ開放されてしまっているベクタ伸長による自動メモリ移動の例
もちろんメモリ開放を伴わなくてもデータの状態が変わってしまって意味論的に食い違いが起きることでのバグが生じる
特に複雑な状況だとその食い違いが起きていることを人間が把握しきれなくなり見落としてしまう
Rustではそのようなデータ参照の競合を検出してコンパイルエラーにしてくれるため安全である
981デフォルトの名無しさん
2024/09/20(金) 19:02:50.08ID:h3rsYutP >>977,980
Rustはコンパイルが超遅いから、Rustがコンパイルエラーを吐くより先に、C++がコンパイルとサニタイザー検出を終えてるだろ
Rustはコンパイルが超遅いから、Rustがコンパイルエラーを吐くより先に、C++がコンパイルとサニタイザー検出を終えてるだろ
982デフォルトの名無しさん
2024/09/20(金) 19:28:29.22ID:DxeYxJuZ >>981
サニタイズはプログラムを実行しなければならず更に問題が発生する条件がたまたま揃うまで無限に待たなければいけない
したがって必ずしも問題が検出できるとは限らない非常に劣った方法
しかも対象領域がメモリ問題などいくつかに限られた項目のみ
Rustはデータ参照競合を一般的にコンパイル時点で確実に検出できる
サニタイズはプログラムを実行しなければならず更に問題が発生する条件がたまたま揃うまで無限に待たなければいけない
したがって必ずしも問題が検出できるとは限らない非常に劣った方法
しかも対象領域がメモリ問題などいくつかに限られた項目のみ
Rustはデータ参照競合を一般的にコンパイル時点で確実に検出できる
983デフォルトの名無しさん
2024/09/20(金) 19:54:50.23ID:d/Vr9ark >>982
データ競合の間違い指摘でデータ参照競合と言い出す奴
データ競合の間違い指摘でデータ参照競合と言い出す奴
984デフォルトの名無しさん
2024/09/20(金) 20:22:52.87ID:eBsokoVK985デフォルトの名無しさん
2024/09/20(金) 20:25:25.31ID:eBsokoVK986デフォルトの名無しさん
2024/09/20(金) 20:32:05.98ID:eBsokoVK987デフォルトの名無しさん
2024/09/20(金) 20:37:14.78ID:hHX3CUd7 >>982
> Rustはデータ参照競合を一般的にコンパイル時点で確実に検出できる
「データ競合」の誤用はさておき、このたった一文のために unsafe Rust は決して健全性を破壊しないように書かれなくてならないのですが
safe Rust の健全性保証を一切受けられないその開発者たちは、一体どうやって検証していると思っているんですか?
unsafe ライブラリ開発者のこと、ちゃんとリスペクトしてますか?
> Rustはデータ参照競合を一般的にコンパイル時点で確実に検出できる
「データ競合」の誤用はさておき、このたった一文のために unsafe Rust は決して健全性を破壊しないように書かれなくてならないのですが
safe Rust の健全性保証を一切受けられないその開発者たちは、一体どうやって検証していると思っているんですか?
unsafe ライブラリ開発者のこと、ちゃんとリスペクトしてますか?
988デフォルトの名無しさん
2024/09/20(金) 21:14:33.29ID:YCHSHi4r >>987
unsafeブロック内でも借用(参照)関係のルールは同じ
unsafeブロック内でも借用(参照)関係のルールは同じ
989デフォルトの名無しさん
2024/09/20(金) 21:23:28.17ID:AH7W/bFk >>979
WGPU
WGPU
990デフォルトの名無しさん
2024/09/20(金) 21:28:48.15ID:AH7W/bFk 次スレよろ
991デフォルトの名無しさん
2024/09/20(金) 22:02:42.38ID:hHX3CUd7992デフォルトの名無しさん
2024/09/20(金) 22:22:54.89ID:c48cFuZJ993デフォルトの名無しさん
2024/09/20(金) 22:27:40.78ID:TuwTNvNc994デフォルトの名無しさん
2024/09/21(土) 06:57:11.60ID:Wickqrt+ >>993
マージされてないって聞いたんだが?
マージされてないって聞いたんだが?
995デフォルトの名無しさん
2024/09/21(土) 07:19:00.02ID:yZmm+XDT rust for linuxのトップメンテナーが一抜けしたよな
いわくnontechnical nonsenseなことに飽きただと
言語変えても何か新しい機能が作れるわけじゃないからな
熱量は下がってる
いわくnontechnical nonsenseなことに飽きただと
言語変えても何か新しい機能が作れるわけじゃないからな
熱量は下がってる
996デフォルトの名無しさん
2024/09/21(土) 08:01:00.78ID:1xZtzolN997デフォルトの名無しさん
2024/09/21(土) 09:01:51.68ID:tGswm/a3 Linuxの新たな機能やデバイスドライバが次々とRustで書かれるようになってきたね
998デフォルトの名無しさん
2024/09/21(土) 09:23:20.76ID:MXmAIymZ 安全性には新しさがないと?
敵に危害を加えると新しさを感じて熱量が上がる理由がそれなのか
敵に危害を加えると新しさを感じて熱量が上がる理由がそれなのか
999デフォルトの名無しさん
2024/09/21(土) 09:51:32.91ID:7V9P6+h8 RustはCVE出している時点で安全性の新しさはないな
1000デフォルトの名無しさん
2024/09/21(土) 09:52:42.78ID:7V9P6+h8 しかもRust製のTauriがCVE出してるのが安全性の新しさがない証明になっている
10011001
Over 1000Thread このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 52日 9時間 6分 17秒
新しいスレッドを立ててください。
life time: 52日 9時間 6分 17秒
10021002
Over 1000Thread 5ちゃんねるの運営はUPLIFT会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《UPLIFT会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
4 USD/mon. から匿名でご購入いただけます。
▼ UPLIFT会員登録はこちら ▼
https://uplift.5ch.net/
▼ UPLIFTログインはこちら ▼
https://uplift.5ch.net/login
運営にご協力お願いいたします。
───────────────────
《UPLIFT会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
4 USD/mon. から匿名でご購入いただけます。
▼ UPLIFT会員登録はこちら ▼
https://uplift.5ch.net/
▼ UPLIFTログインはこちら ▼
https://uplift.5ch.net/login
レス数が1000を超えています。これ以上書き込みはできません。
