Rust part25

レス数が1000を超えています。これ以上書き込みはできません。
2024/07/31(水) 00:46:26.17ID:DBMWY2QT
公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust

公式ドキュメント
https://www.rust-lang.org/learn

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

※Rustを学びたい人はまず最初に公式のThe Bookを読むこと
https://doc.rust-lang.org/book/

※Rustを学ぶ際に犯しがちな12の過ち
https://dystroy.org/blog/how-not-to-learn-rust

※Rustのasyncについて知りたければ「async-book」は必読
https://rust-lang.github.io/async-book/

※次スレは原則>>980が立てること

前スレ
Rust part24
https://mevius.5ch.net/test/read.cgi/tech/1716759686/

ワッチョイスレ
プログラミング言語 Rust 4【ワッチョイ】
https://mevius.5ch.net/test/read.cgi/tech/1514107621/
2024/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/
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/
2024/08/01(木) 16:24:10.41ID:x8y3t2qM
>>1
2024/08/01(木) 18:56:40.59ID:pdiRiMAP
https://prcdn.freetls.fastly.net/release_image/22017/53/22017-53-0b7b835a46293a3a03b057104ef0d96b-2440x1394.png
2024/08/01(木) 23:55:38.74ID:GRWphbaC
「The Rust Foundation」は、人命や財産に関わるような安全性が決定的に重要になるシステムのために、
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はメモリ大目に使いがちかも
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().
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倍の消費をせずにその後ベクタを使用した長さ分だけに限られること
2024/08/04(日) 12:30:08.75ID:65IaeFum
んなわけあるかい
いつのまにか勝手に他に割り当てられたらキャパシティの意味ないでしょ
2024/08/04(日) 12:37:16.12ID:gacpQS9v
>>12
実メモリ割り当てと仮想メモリ割り当ての違いを学ぼう
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倍よりも小さい値ずつにしている」とでも言いたいのか?
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以下の間はお引っ越しコピーを避けることができるので見積もれる時は推奨だよ
18デフォルトの名無しさん
垢版 |
2024/08/04(日) 17:23:30.18ID:ku/HSe0h
reallocationなんてパフォーマンス落ちるだけだし
with_capacityで自分でコントロールした方が良いと思う
19デフォルトの名無しさん
垢版 |
2024/08/04(日) 17:51:55.81ID:tbuKemgK
>>17
仮想メモリは消費しないのか?
32bit OSだと何もしなければ仮想メモリ4GBくらいしか無い気がするが。
2024/08/04(日) 18:11:52.52ID:mDDM97lI
大きなサイズに育っていくならコピー回数が少なくなる毎回2倍が有利
仮想メモリが足りるか足りないかの限界状況で用いるならwith_capacity()やreserve()を最初から用いる
2024/08/04(日) 18:28:12.58ID:mhkxn3lF
フラグメンテーションの問題とかもあるから教科書通りの2倍固定よりも
Goのようにサイズが大きくなるにつれGrowth Factorも小さくしていくモデルのほうが一般的には良さそうだね
2024/08/04(日) 18:43:06.42ID:YKxthOUq
gccでもclangでもC++のvectorは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の有無とかの話に比べればずっと些細な話でしかないし
マジでなにいってるんだこいつとしか思えない
2024/08/04(日) 19:48:10.28ID:S53R2Qhs
>>25
Javaなんかはもともと組み込みをターゲットに開発された言語だね。
GCの有無と仮想メモリには何の関係もない。
2024/08/04(日) 20:16:30.17ID:5nFDNjd2
この議論
元々メモリ無駄食いのGC依存言語は無視してよくて、
Rustと同じジャンルのC++で長年議論されてきて2倍という結論が出ている。
どうしても2倍を批判したいならまずはgccやclangのC++に対して行なうとよいかと。
30デフォルトの名無しさん
垢版 |
2024/08/04(日) 20:31:51.43ID:ao1w9dwD
2倍に対して突っ込んでるんじゃなくて延々と的外れなことを書いてることに対して突っ込まれてるだけでは?
平均的なコピー回数が少ない点で2倍は妥当ではあるけど、それも「よく使われる方法」くらいの意味しかない
C++でもMSVCだと1.5倍だったと思うし (今のバージョンでもそうかは未確認)
2024/08/04(日) 21:44:51.68ID:Y/6iljEI
先生!チャンクアロケーター沼への入水希望者がこんなに
2024/08/04(日) 22:06:56.31ID:H9q8xh4E
>>21
Goがなぜそんなやり方をしているのか
実行しながら実メモリ使用量の変化を傍らでウォッチして見た
Goの大きなsliceでcapacityが増える時に実メモリ使用量が急激に増える
C++やRustではcapacityが増えてもそんな変動は起きない
つまりGoはこの問題のため2倍ではなく1.25倍にせざるをえないと思われる
2024/08/05(月) 00:28:29.24ID:vHNgTuSQ
>>16の主張が間違っていた可能性があるな
例えば世代別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
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弱残るという話が現実と合っていない
2024/08/05(月) 07:22:04.78ID:Fnw9TU7n
mmap/munmapでOSにメモリを返却できるから古い抜け殻は残らない
さらにmremapで実コピーをせずに利用可能サイズを増やすことができる
それらを呼び出すコストがかかるためその頻度が1.x倍より少なくなる2倍が好ましい
37デフォルトの名無しさん
垢版 |
2024/08/05(月) 12:04:08.00ID:3XGRFYoN
話が難しいから何を言っているかじゃなくて誰が言ってるかでしか判断出来ねえ
そして5chをソースにfollyのreadmeを否定する意見を信じることも出来ねえ
2024/08/05(月) 12:25:55.60ID:GBSMEVUI
話は聞かせてもらった
最適な比率は2でも1.5でもなく黄金比1.618だな
こういう問題は大体フィボナッチ数列が正解になる
僕は数学に詳しいんだ
2024/08/05(月) 12:37:42.98ID:KD4qg6Wm
>>37
わかる
もうちょいライトなユーザ向けのスレも欲しいかも
2024/08/05(月) 12:46:25.51ID:oUc4bjr3
>>37
むしろ彼しか問題にしてないだろ
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 を極端に伸ばしたり縮めたりするなら話は別だが、
徐々に伸びていって最後に捨てる一般的なユースケースなら
倍率はテキトーでも理論的な効率はそんなに差はない。
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に報告すれば採用されるかもよ
2024/08/05(月) 15:01:05.36ID:zvBpOjwN
>>44
rustcがベンチマークのネタに適してないんじゃないの?
2024/08/05(月) 15:14:32.99ID:Ha+1Ci4D
>>45
そう思うならrustc以外のアプリでベンチ取って提示してみれば?
少なくともパフォーマンス低下するアプリが一つ示されたんだからそれ以上のデータ出さないと話進まないでしょ
2024/08/05(月) 15:48:02.67ID:dNRQyEIb
もっと歴史の長いGCCのC++もClangのC++もvectorの再割り当ての長さ2倍を採用している
そしてGCを用いてメモリ管理する言語は各々で諸事情があるようだから参考にできない
2024/08/05(月) 16:04:04.60ID:trHMLJ8c
fbvectorの話はアロケータが確保する単位に合わせて無駄を無くすということと
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倍固定じゃなくて真似したやつで試してみたらいいのにね
2024/08/05(月) 19:15:50.62ID:YtHc3yqJ
>>50
ソース見てみたけど恣意的に10倍ずつ異なる長さで順にアロケーションを汚染していき
vectorは単発使い捨てで毎回残らないからその前の残骸の空きエリアにたまたま上手くマッチするかの勝負になっていて
現実とはかけ離れたテストになっていると思った
52デフォルトの名無しさん
垢版 |
2024/08/05(月) 23:13:48.63ID:SkPCtOW0
>>49
速度vsメモリ効率なんかもあるしね
2024/08/05(月) 23:56:18.02ID:pmuFbIFu
>>50
こんなに違いが出るのか
2024/08/06(火) 00:27:44.41ID:XznSKINw
>>44を読んでると
1.5倍にすると実用なプログラムでは遅くなるのに対し
>>50の特殊なベンチな時だけ1.5倍がとても速い理由は
他のメモリ割り当てに邪魔されずに1つのベクタだけがどんどん成長していくからで
1+1.5+1.5^2+1.5^3 < 1.5^4 であるため
自分が過去に用いたところを結合してそのまま使えるため速いらしい
しかし現実のプログラムは他のヒープ利用も間に起きるためその再利用はうまく行かずメリットが起こらないと
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
(以降略)
2024/08/06(火) 18:25:14.08ID:XznSKINw
もちろんVecは2倍伸長をアロケータにリクエストするだけなので
実際に処理しているのは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標準をそのまま用いるのが最適となる
2024/08/06(火) 20:54:39.49ID:wYh3ia3o
そういや一昔前、jemallocを採用してるから
Rustは良いんだよ、って主張があったよね
2024/08/06(火) 21:01:13.77ID:6BvweKuM
jemallocは色々と問題もあるため5年半前の2019年1月のRust1.32で標準採用しなくなった
もちろんjemallocが好ましいケースもあるのでその時は各自で簡単に使えるようにもなってる
2024/08/07(水) 00:45:04.42ID:9wVUhjvG
未だに Vec::new_in() が安定化しないRustとは対照的に
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マクロが定義されていると確保したメモリに未初期化を表すバイトを書き込むとかもあった

条件はいくらでも付け加えられそうやね
2024/08/07(水) 01:28:00.75ID:bHbc7bDV
サイズの大きなベクタは
キャパシティ拡張してもコピーが発生しないmremap利用のアロケータが有利という結論だな
サーバなどで一般的に使われるLinux環境ならRust標準でその条件を満たすから大丈夫
2024/08/07(水) 08:32:07.19ID:PoJHP1fy
>>63
Zigはまぁ1.0にならないと検討の俎上にもあげられないし
Cと比べてそれほど強い保証が得られるわけでもないから
あまり導入するモチベーションもなさそう
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/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になるまで出来なさそう
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`


これはどうやって解決するのが普通?
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))
}
}
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 のエラーで止まります
78デフォルトの名無しさん
垢版 |
2024/08/09(金) 17:22:16.81ID:k9SqobKt
呼ぶ方は
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);
中身
}
としたときは正常にコンパイルも動作もできました
2024/08/09(金) 18:10:20.58ID:KcU/iUYV
>>77
全体が見えないのでなんとも言えないが
>>75のエラーを解決するなら
例えば
fn moge<T>(a: &str, b: &str) -> i64 where T: for<'a> From<&'a Hoge>

fn moge<'a, T: 'a>(a: &str, b: &str) -> i64 where T: From<&'a Hoge>
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
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
>>83
https://github.com/tauri-apps/awesome-tauri
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/
2024/08/10(土) 10:02:51.23ID:KZxV9Wds
>>86
Windowsやマイクロソフトは何も悪くなかったのか
2024/08/10(土) 11:11:45.08ID:ymCXtc/f
>>86
Rustを使っていれば防げたな
スライスイテレータが個別のインデックスチェックコスト無しで境界チェックできるから
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を書いているのかは不明)
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
>>93
うっかりテストコードが抜けていても
Rustならコンパイラが撥ねてくれるからいいね

>>94
こういう参照バグやメモリ競合バグは確実に減るね
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で書かれていること」にお金を払うわけじゃない
既存プロジェクトを置き換えたところで顧客から追加のお金を貰えるわけではないし、置き換えをメインに作業してる間は機能追加などの開発は止まるわけだし
新規開発での採用は進んでると思うぞ
2024/08/10(土) 16:01:23.31ID:7leusf5/
以前からのは対策が遅れるの仕方ないよな
ただし新規案件でC++はアウトで言い訳できない
十分に学習とお試しする時間があったのだから
2024/08/10(土) 16:03:24.43ID:AQDKnTti
もともとC++を使う案件自体が少ないんで

シビアなところは互換性を考慮してC++のまんまだし
2024/08/10(土) 16:16:28.94ID:hldat476
>>99
お前は何様なんだよw
2024/08/10(土) 16:19:11.72ID:uMi6lmBr
チンパンジーのあいちゃん
103デフォルトの名無しさん
垢版 |
2024/08/10(土) 16:58:24.77ID:dQTVCz1X
>>82
trait 使うのやめて

>>77 の関数を
fn moge<F>(a: &str, b: &str, f: F) -> i64
where F: for<'a> Fn(&'a Hoge) -> Fuga<'_> {
中身
let m = f(hoge);
中身
}
にかえて

>>78 の呼ぶ側を
let x = moge(2, 5, |hoge| Fuga::from(hoge));
にしたらうまくいきました
ほんとうにありがとうございました
2024/08/10(土) 17:14:57.10ID:WA5EFoZj
多分>>76の戻り値をFuga<'a>に直すのが根本的解決だけどうまくいったならもういっか
2024/08/10(土) 22:48:05.26ID:ogPlSB6Z
タウリン好き
WinMacで動くクライアントアプリ書きたかってん
106デフォルトの名無しさん
垢版 |
2024/08/10(土) 23:49:33.16ID:oQf4NdPP
>>104
私の記憶ではそこはやってみたのですが治りませんでしたね
107デフォルトの名無しさん
垢版 |
2024/08/11(日) 08:59:52.85ID:aVi0ITMX
>>86 >>93 ほんそれ
こんなんテストしてれば見つかる話で恥ずかしいレベルの大チョンボ
マイクロソフトはもちろんクラウドストライクを訴えれば良いし
デルタ航空はマイクロソフトとクラウドストライクに5億ドル請求って言ってるけど
マイクロソフトを訴えるのは筋違いなので
デルタ航空以外の被害受けた各社はみんなでクラウドストライクを訴えれば良い
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については自分も詳しくないので誰か書いてくれ
2024/08/11(日) 12:55:28.88ID:GcC/Tgf1
>>108
Rustでは20個の領域を作った時点で
そこをその先頭アドレス=ポインタで指すのではなく
連続体(スライス)を抽象的な参照で指す
もちろんそのスライスへの参照は内部では先頭アドレスと長さになるが抽象的なスライス参照&[T]として扱う
そこからイテレータは20個の個別参照&Tを連続的に返したりインデックス指定によりget(index)でOption<&T>を得たりできる
21個目のアドレスを得たりその中身を見たりすることはsafeの範囲ではできない
2024/08/11(日) 14:07:38.05ID:LL4gnA2q
それはどんなアセンブルコードに落ちているの?
2024/08/11(日) 14:30:38.38ID:GcC/Tgf1
抽象的なレベルで安全を確保してしまえばその後にそのコードは最適化し放題
生成アセンブルコードはcargo asmでその場で確認できる
2024/08/11(日) 15:19:18.37ID:1MlIj3rk
>>111
範囲内かどうか比較する処理は入る。
ただし、静的に絶対安全と分かる状況なら最適化で消えることもある。
そうでなくても現代的 CPU だと分岐予測によって速度的ペナルティは小さいことが多い。
ゼロコストというわけではないが、 C 風のポインタがあまりにも素朴でミスしやすいことに対する解決法としては十分以上に小さいコストだと考えられている。
今では C++ にもスライス的な、範囲を表すクラスが標準に追加されていて再編成が進んでるのでやっぱりそのほうがよいという時代の潮流があるんだと思う。
2024/08/11(日) 15:21:08.97ID:aeJBanf7
またいつもの嘘吐きが
2024/08/11(日) 16:17:49.13ID:x9x8amRR
zigはリリースビルドだと範囲チェックをオフにしちゃうらしい
やっぱゼロコストじゃないよね
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箇所のみで同じ動作になる
117デフォルトの名無しさん
垢版 |
2024/08/11(日) 17:01:54.96ID:Vk240t5v
ベアメタル環境でもRustってCより有用なものなの?
安全性は保証しやすくなるとして、書きやすさ (あるいは面倒臭さ) がどれほどのものか
実際経験ある人いる?
2024/08/11(日) 18:11:06.27ID:1MlIj3rk
>>117
内部的には unsafe が必要だけど外に対しては安全性を保障している基礎的な語彙が標準ライブラリにはいっぱいあるじゃん。
ああいう感じの基礎的なものを環境に合わせて作るというのがスタートラインで、それが適切に出来てればベアメタル環境だからといって特別な違いはない。

unsafe を適切に下層レイヤに押し込めれていないと全体に unsafe が頻出して Rust の安全性の恩恵を受けにくいし、
安全性の恩恵を受けられないのに Rust の面倒くさい部分はあるという状況になって嬉しくない。

最初の整備をまじめにやるのがすごく大事。
2024/08/11(日) 20:48:33.63ID:LL4gnA2q
>>116
thx
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
2024/08/12(月) 13:11:33.58ID:XQ/hRBSk
>>117
保守には良いと思う
リファクタリングには向いていない
2024/08/12(月) 13:21:38.56ID:XQ/hRBSk
>>120
ベアメタルって元々そういうもんでそ
2024/08/12(月) 14:00:36.88ID:zYUAXUFL
>>121
ちゃんとトレイトベースで作っていれば
Rustはリファクタリングもしやすくミスも防げる
2024/08/12(月) 14:04:58.34ID:s7amXorj
>>123
「ちゃんとトレイトベースで作っていれば」
というのが難物という罠。
2024/08/12(月) 14:12:42.26ID:zYUAXUFL
トレイトを使いこなせば便利で快適なのに
難しいと思い込んで使いこなさない人が困るだけ
2024/08/12(月) 14:53:33.48ID:1PYqSgWq
複オジに餌を与えないでください!
みんなが迷惑しています!
2024/08/12(月) 15:10:33.91ID:CLy07uUA
事前に理想的な設計が出来るなら苦労はないんだが現実はそうではないという話だわな
2024/08/12(月) 15:15:42.43ID:YiYv/cy+
新たにtraitを導入する時やリファクタリングで構成を変える時も新たなtrait境界を満たしていけばよくて使い勝手がいいね
2024/08/12(月) 15:16:59.31ID:KoHKVvuj
リファクタリングができない難しいという
人が定期的に出るけど他の言語とも比較して
コード例出してくれ
130デフォルトの名無しさん
垢版 |
2024/08/12(月) 15:32:17.85ID:c1LudIob
リファクタリングしやすいしにくいの違いの定義がそもそもわからん
そういう意味でも例を頼む
2024/08/12(月) 16:20:20.18ID:IbEOTvl2
自分的には「リファクタリングしやすい」=「書き換えミスがコンパイルエラーとして検出されやすい」なので
型強めの静的型(Rust)>型弱めの静的型(C系)>動的型
って感じ
ただ「書き換え時にコンパイルエラーに煩わされない」を重視してて動的型がリファクタリングしやすい派もいるっぽい
(個人的にはエラーにならなくてもいつのまにか動作変わってたら意味なくない?と思うけど…)
2024/08/12(月) 17:02:05.11ID:Hka8sI98
ああ,書き換え中にエラーなり警告なりが出るのが煩わしいってことか
大抵の言語でそれはありそうだから,エディタの設定で最後にタイプしてから何秒後にアナライザのチェックを入れるかとかいじればいいのでは
2024/08/12(月) 17:13:40.85ID:rd9pnszR
JetBrainsがリファクタリング機能の出来具合で比べてみると一目瞭然
静的型付け言語の中では最弱
2024/08/12(月) 17:14:55.12ID:s11pSEyp
前スレでもリファクタリングの話出てたけど
無かったことにしてまた同じ話するの
2024/08/12(月) 17:16:15.95ID:CLy07uUA
プログラマの中には剛腕タイプというか、脳のメモリが大きくて広い範囲の見通しを付けられる人はいる。
そういう人にとっては抽象レイヤも静的型も邪魔になる。

でもまあそういうのはほんまもんの超人なので普通の人は静的型のほうがいいと思う
2024/08/12(月) 17:23:31.41ID:s11pSEyp
他言語との比較もネタ切れ感無理矢理感が激しくていい加減飽きてきた
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ってそういうデメリットはあるよねって感じるだろうし
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つもあるのなら
リファクタリングを検討したほうがいいと思ってる
2024/08/12(月) 21:06:34.61ID:P+uhzEsZ
>>138
その人も「Once you get good at Rust all of these problems will go away」と書いているように
Rust流のやり方を身に着ければ消える問題ばかり
2024/08/12(月) 21:13:39.00ID:s11pSEyp
https://github.com/rust-lang/rust/issues/91639

デフォルトでwarnにもdenyにもなってないけど最重要級のlint見つけたぞい
前スレのライフタイムリファクタの話題が出た時点で教えて欲しかったな……
142デフォルトの名無しさん
垢版 |
2024/08/12(月) 21:19:15.69ID:+jMHtzbv
>>140
内容読んでるか?
その反応こそ批判対象の一部だぞ
Rustの根本的な部分で困難が生じていても、Rustコミュニティは「それはあなたがRustのやり方を知らないだけだ」としか言わない、というのを批判してるチャプターだ
2024/08/12(月) 21:32:50.85ID:eisITTDv
複オジをRustコミュニティの代表者として扱うなよ
2024/08/12(月) 21:42:37.55ID:3Ibpt2aV
>>141
それよりも簡単な解決方法として
ライフタイム'1と'2の相違エラーが出た時点で
その部分の省略ライフタイムを自分で明示的に補ってやればいい
そうすると何が問題だったのかが視覚化される
2024/08/12(月) 22:04:56.11ID:AOmsGFzU
>>139
Pythonでも普通に出来るぞw
論点そこじゃないだろww
2024/08/12(月) 22:12:53.72ID:s11pSEyp
他言語と比較して優位を示したい向きがメインになってしまうとどうも Rust の問題の存在を否定する方向に向かいがちで良くないな
そう考えるとオナニーコードでレスバやってたほうがいくらかマシだったのかもしれん
2024/08/12(月) 23:01:06.12ID:ksJqJtTC
リファクタリングの件でも他の件でもいいけど、
他の言語と比較してRustで何が難しくて困っているのかを具体的なコード例で出してくれないと、
話が進まずに個人の感想か空想に終わってしまう。
2024/08/13(火) 12:11:44.59ID:Nsck/Z03
>>131
ミスをコンパイルエラーにしてくれることがプログラム書いて色々試してる時もリファクタリングしてる時も一番重要だもんな
他の言語だと実行時のエラーや実行時のデバッグに依存せざるを得なかったことがRustでは実行前に解決することが多くて開発効率が良くて助かる
149デフォルトの名無しさん
垢版 |
2024/08/13(火) 12:58:50.63ID:qGcIneKd
設計を変更する際に必要な変更が多いのはありそう
例えば既存のコードをasyncに対応させようとすると、必要なデータを Arc, Mutex で包んだり、参照のせいでSendできないものをOwnedな型に置き換えたり、トレイト境界に Sync + Send を付けてまわったりといった手間が要る
「設計を変更する」と決めたのでなく、「変更するとどうなるか試したい」といった場合でもこういった作業が必要で、その点は面倒かもしれない
必要な変更をコンパイラが教えてくれるのがありがたいというのは自分も同意する
2024/08/13(火) 13:12:20.55ID:J7fCsAWj
>>149
シングルスレッドの言語以外は
メモリを共有するならそれら排他制御が必要となる点で言語に関係なく同じ
メモリを直接共有しない(例えばチャネル使用)ならRustでもそれらは必要ない
つまりRust特有の話ではない
2024/08/13(火) 13:12:37.07ID:iXbJ0ifY
動的言語に比べて静的言語がリファクタリングしやすいのは当たり前
モダンな言語の中でRustは所有権とライフタイムのせいで他に比べて明らかにリファクタリングが面倒

火を見るより明らかなことなのになぜ必死に否定したがるのか意味がわからない
2024/08/13(火) 13:14:54.05ID:6c4LDvBa
>>149
asyncはリファクタリングとはまた別のRustの弱点
2024/08/13(火) 13:23:07.46ID:MGOQRx4E
>>152
Rustのasyncはスタックレスでリソース消費も少なく高速で動作して使い勝手もいいよ
何を根拠に弱点と?
2024/08/13(火) 13:28:41.46ID:+eZNFqL6
>>151
所有権とライフタイムは慣れの問題であり大した問題ではない。
それが出来ない人はGCに依存して遅くメモリ喰いの言語を使っていなさい。
155デフォルトの名無しさん
垢版 |
2024/08/13(火) 13:46:36.22ID:qGcIneKd
非同期による排他は別にしても参照まわりの面倒さはある
&str にするか String にするか、Rc<String> なのか Arc<Mutex<String>> なのかといったものを考える必要があるし、リファクタ/設計変更の際にこれらの置き換え作業が必要になることはある
細かな最適化はできなくても、GC有りの言語がシンプルに1つString型だけ提供しているのは楽といえば楽

なぜエラーになるのかはコンパイラが教えてくれるし、慣れれば分かるものだけど、必要な変更が他の静的言語に比べて多くて面倒というのは否めないでしょ
自分はRustは好きだし良い言語だと思ってるけど、不便が無いとは思わないし、それが分からないのは現実の開発経験が無いんじゃないかとすら思う
2024/08/13(火) 13:51:51.56ID:FRB3Y3s9
Rustはわかってないとそもそも型チェックに通るコードが書けない
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
2024/08/13(火) 14:04:43.72ID:SFyZa65C
Rustの問題じゃないね
チーム適用や実要件に当てはめて見る実務マと趣味マの違い
2024/08/13(火) 16:05:15.51ID:d5oxWZvl
>>157
それは詭弁
例えばその「5) コンパイルされたならライフタイムの記述は正しい」
まずこれは参照の安全性を保証するRustとしては常に正しい

もちろん複数の参照が登場する時は色んな組み合わせのライフタイムの付け方がある
それらのうち参照の安全性を保証できる組み合わせのみをコンパイラは通す
コンパイルが通る組み合わせのうちどれが自分の意図なのかは各自の問題となる

もし自分の意図と異なっていた場合はそれが利用されるところで参照が切れてコンパイルエラーとなる
そのため間違っていたことに気づくことができる
そして修正してコンパイルが通れば記述は正しい
その記事の例でもこの流れで正しい記述にたどり着けている
160デフォルトの名無しさん
垢版 |
2024/08/13(火) 17:41:07.28ID:3jlS4CIE
「Rustで作るプログラミング言語」
この本おすすめですか?
2024/08/13(火) 17:55:28.98ID:vwwzn05u
>>159
利用の仕方が変わると、それに引っ張られて宣言側が正しかったかどうかが変わる、と言いたいの?
2024/08/13(火) 18:03:57.04ID:d5oxWZvl
>>161
一般的にそうなる
例えば二つの参照を引数にとる関数で二つに異なるライフタイムを持たせるかどうかは利用の前提や方針でどちらもありうる
利用する側(やそれを全て想定したtest)でコンパイルが通るならばそのコードは正しい
163デフォルトの名無しさん
垢版 |
2024/08/13(火) 18:21:49.94ID:qGcIneKd
「参照を扱う際は適切なライフタイム注釈を書く必要がある」は他の静的言語より面倒という指摘そのものでは?
「適切なライフタイム注釈を書けばコンパイルは通るし、それで安全性が保障される」のは分かってるけど、問題はそこではなくて
2024/08/13(火) 18:23:56.90ID:vwwzn05u
>>162
なるほどね、「正しいコード」の定義に齟齬があるのね

「5) コンパイルされたならライフタイムの記述は正しい」の「正しい」は「プログラマの意図通りである」の意味だと思って
それを念頭にもう一回読み直してみて
2024/08/13(火) 18:27:02.24ID:6FUbHmIE
>>163
それはRustの問題じゃないよ
GC言語か否かの問題だね
GC言語は参照の有効性を気にしなくてもよい代わりに遅くてメモリを消費するペナルティ
2024/08/13(火) 18:33:34.80ID:d5oxWZvl
>>164
想定する利用ケースでコンパイルが通ればプログラマの意図通りで正しい
>>157の(5)の例もプログラマの意図通りでなかったためコンパイルエラーとなった
そしてコードを修正してコンパイルを通すことで意図通りの正しいコードになった
2024/08/13(火) 18:35:53.44ID:G2fhNxh+
「正しい」という言葉を多用する技術者にまともなやつはいない
168デフォルトの名無しさん
垢版 |
2024/08/13(火) 18:48:09.58ID:qGcIneKd
>>165
C/C++に比べても面倒では?
設計で防げる問題/考慮が要らない問題に対して必要以上のガードを書かされる感じ

例えばグローバルな変数 (一度だけ初期化され、以降は不変) に対して Sync が要るのも、初期化が複数スレッドから呼ばれた場合の安全性を保証しないとコンパイルが通らないからだけど、設計上それは要らないって場面はある
シングルスレッドなアプリだったり、マルチスレッドだけどスレッド生成は初期化の後であるいった場合

参照も同じで、設計上無効なデータを指すことがないといえるケースでも、コンパイラを納得させるために手動でライフタイム注釈を書く必要があるといった感じ
2024/08/13(火) 18:49:04.65ID:d5oxWZvl
>>167
>>157の「5) コンパイルされたならライフタイムの記述は正しい」が合っているかどうかの話が行われている
想定した使い方でコンパイルが通ったならば記述は正しい
何をどう想定するかでコードは変わりうる
2024/08/13(火) 18:59:01.23ID:6FUbHmIE
>>168
スレッド内でしか用いないならばthread_localにより!Syncでも使えるよ
「設計上それは要らない」「設計上無効なデータを指すことがない」という思い込みは絶対にダメ
例えば無効なデータを指さないが&'staticの意味ならばそれを使えばよいのだよ
2024/08/13(火) 19:01:54.22ID:vwwzn05u
>>166
想定するケースが最初から全部書けるならそれでいいが、残念ながらそんな現実は無いよ
ソフトウェアテストの7原則のひとつ: 全数テストは不可能

それに、意図はコード化できるものばかりではない、unsafe関数のdoc-commentに書くべきsafety sectionだってそうだろう
コード化できなければ「プログラマの意図」ではないというのならそれも一理あるだろうが、多分誰も同意しないと思うぞ
2024/08/13(火) 19:10:37.01ID:d5oxWZvl
>>171
そんな大きな話はなされていない
一般的な話はRustの範囲を超えている
今回はRustのライフタイムの記述が正しいかどうかの話
想定した使い方でコンパイルが通ればそのコードは正しい&安全となる
想定範囲を変えたり広げたりしてコンパイルエラーとなったならばそれに対応すればよい
173デフォルトの名無しさん
垢版 |
2024/08/13(火) 19:44:50.08ID:qGcIneKd
そもそもの話は「他の言語に比べてリファクタや設計変更がしづらい」という話では?
誰も「ライフタイムが提供する安全性が間違ってる」なんてレスはしてないよ
安全性の保証は強力だけど、そのぶん生産性を低下させ得るデメリットもあるよねって話をしてるだけで
2024/08/13(火) 19:53:38.42ID:vwwzn05u
>>172
あなたが「コンパイルが通ればそのコードは正しい」というとき、それは利用側と定義側を含むコード全体の正しさのことを言っているんだよね

でも例のブログ記事は、利用側の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の課題を指摘してるわけで
2024/08/13(火) 19:56:59.13ID:6FUbHmIE
>>173
ライフタイムをコンパイラがチェックしてくれることで生産性は低下ではなく上昇でしょ
全てのコードを人間がチェックし続けたりチェックし忘れて実行時デバッグとなることが生産性の低下ですね
さらにその参照バグにきづかないままだとセキュリティホールを招いてしまいますよ
177デフォルトの名無しさん
垢版 |
2024/08/13(火) 19:57:14.06ID:w/VnRva3
>>157
めっちゃ判りますωωω
2024/08/13(火) 20:05:14.94ID:d5oxWZvl
>>174
最初のコードもコンパイラが通ってアサートも通って意図通りに動いている
次のコードはイテレータが返した値を保持したままイテレータを作動させられる仕様への変更 (今回の例は可能だが必ずしも仕様変更できるかどうかは別)
それぞれコンパイルが通れば意図通りに正しく動作している
179デフォルトの名無しさん
垢版 |
2024/08/13(火) 20:07:43.05ID:w/VnRva3
>>174
ほんそれ
2024/08/13(火) 21:30:24.68ID:vwwzn05u
>>178
アサートも利用側のmain()にあるものなんだから、next()の呼び出し回数の話と同じで
ここからnext()についてのプログラマの想定を読み取ってたら、この記事が理解できないのは当然なんだってば
最初から理解する気が無くてそういう意地悪言ってるんじゃないよね?

修正後のプログラムの後に
> 今こうして前のプログラムを見返してみると、明らかに間違っていましたね。
って書いてあるんだから、これは仕様を変更したじゃなくて、最初から間違っていたのを修正したという体なんですよ
2024/08/13(火) 21:51:35.56ID:d5oxWZvl
>>180
一番最初に書いたようにその人の詭弁
後者の利用方法に対応する仕様にしたいならば最初からその後者用のアサートを入れたらよい
そうすれば一発でコンパイルエラーになって修正して終わり
ライフタイムに関してはコンパイルが通ればその利用方法については必ず正しい
コンパイルが通ったのに間違っていることはない
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);
このように宣言することで新たな利用方法に対応が可能となる
こちらに変えてもそれでコンパイルが通る範囲の利用方法をしていれば正しく動作する

どちらのケースでもコンパイラが通せば各々の利用範囲でライフタイムの記述は正しい
コンパイラが通したのに間違っているなんてことは起きない
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()の内容を考慮する必要が本当にあるのか?

別にコンパイルエラーになることをいちいち確認しなくても、「なんかおかしいなこれ」って早く気付いて修正できるならそのほうがいいでしょ、って個人的には思うけどね
2024/08/13(火) 22:54:24.44ID:d5oxWZvl
こちらの主張は最初から一貫して
>>157の記事「『5) コンパイルが通ればライフタイムの記述は正しい』は間違っている」
という主張とその説明例は詭弁だということ

以下は常に正しい
『5) コンパイルが通ればライフタイムの記述は正しい』

自分の意図通りの使い方をした利用範囲でコンパイラが通ったのならば
その利用範囲で記述は正しい
利用するつもりのない利用方法に必ずしも対応する必要がないことは>>182で説明した
2024/08/13(火) 23:11:58.95ID:vwwzn05u
>>184
ここまでのあなたの主張は正確に言えば「*十分に実際のユースケースを反映した利用側コードとともに* コンパイルが通ればライフタイムの記述は正しい」じゃないか
強い前提を置けば正しいと言える確度も高まって当然だろう
勝手に前提を変えて違う結論を導くのは、それこそ詭弁ではないか
2024/08/13(火) 23:29:33.49ID:d5oxWZvl
利用方法とその範囲は各実際のケースで各々異なるのだよ
あらゆるケースを想定して対応することは必要ないだけでなく事実上無理なこともあるだろう
必要となるケースのみ対応すればよい
そして必要となるケースはプログラムとして書かれているかテストコードに書く
どのようなケースでもコンパイルが通ればその記述コードは正しい
コンパイルが通ったのに誤動作することは起きない
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>とか

そういう嗅覚というか、経験知みたいな情報は誰も持ち合わせちゃいないのかね
2024/08/13(火) 23:36:10.30ID:Hu5uSedp
複オジに何を言ったところで時間の無駄
そろそろ気付いてね
2024/08/13(火) 23:40:06.70ID:d5oxWZvl
同じところで生まれるものしか取り扱わない場合にFoo<'a, 'b, 'c, 'd, 'e>とする必要はない
そこをFoo<'a>でコンパイルが通る使い方をしているならばFoo<'a>で正しい
どちらかが間違っているという変な考えを捨てよう
2024/08/13(火) 23:46:03.09ID:vwwzn05u
>>188
反論を通じて考えを整理しているという面もあるので
マサカリ歓迎
2024/08/13(火) 23:55:49.36ID:LZM61rZJ
>>175
読んだ
大雑把な要約

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 だけで済むという感じ
自分の認識違いだったらすまん
2024/08/14(水) 00:42:39.43ID:9bQ7P5cg
働け
194デフォルトの名無しさん
垢版 |
2024/08/14(水) 01:41:38.41ID:trbBeScR
>>153
ライブラリが乱立してる点
2024/08/14(水) 02:10:03.49ID:/eVAI9ia
>>194
まずasync/awaitはRustの標準機能
そして使われるFutureやPollやWakerなど各種はRustのcore標準ライブラリにありno_stdでも使える
asyncランタイムは用途ごとに適したものを自由に作ったり選んだり使える
標準的に使われるものはtokioがダウンロード10倍差で圧勝しており乱立と悩まなくていい
2024/08/14(水) 06:30:03.80ID:xnFjuNS8
>>164
ライフタイム注釈が間違っているのにコンパイルが通ってしまい正しく動作しない、というプログラム例を一つでも示せばよいのではないか?
そんな例は存在しないと思う
コンパイルが通ったらそのプログラムでライフタイム注釈は間違っていなくて正しく動作するよ
2024/08/14(水) 09:24:59.76ID:9a/DnTrG
挙げた手降ろせない子どもすごい増えたよな
折り合いつける知能もない
2024/08/14(水) 09:32:09.98ID:92pG5tQ9
>>183
>trait実装の場合にはtraitの宣言に合わせるために実際より小さいlifetimeを指定しないといけない場合があるしれないが

kwsk
そっちの方が知りたい
199デフォルトの名無しさん
垢版 |
2024/08/14(水) 10:02:37.51ID:jTlv+Rl8
Tokioが圧勝しているせいでtokio でしか使えないライブラリが出てきていて、tokioが終わったらRustのasyncもオワる状況
2024/08/14(水) 10:09:25.77ID:LfKGsMNu
tokio以外を考慮してるライブラリの方が少数派だろ
2024/08/14(水) 10:09:58.25ID:OuxAzukv
>>199
GAFMなどIT大手がtokio直接支持してるから不滅だよん
202デフォルトの名無しさん
垢版 |
2024/08/14(水) 10:12:07.88ID:jTlv+Rl8
>>201
GAFMは飽きっぽいから、支援されてるから不滅ってことはない
あ、Rustの寿命がそれより先に来るってことかな?
2024/08/14(水) 10:21:35.01ID:OuxAzukv
Rustに代わりうるプログラミング言語の芽すらないよん
IT大手各社が結束して同じ新言語を支持したのはRustが最初で最後かな~
2024/08/14(水) 10:31:23.23ID:LfKGsMNu
>>203
zig 1.0待ちだろ
2024/08/14(水) 10:45:06.96ID:OuxAzukv
Rustより保証してくれることが減ってしまう言語は代わりにならないよん
2024/08/14(水) 10:50:42.29ID:z6gmNdON
良いか悪いかよりも一貫しているかどうかが寿命を決める。
(いや、及第点程度には良いものである必要はあると思うけど。)
C がよい言語とはとても言えないけど皆が一貫して使ってたから価値あるものとして認められてたわけで。
プログラミング言語も言語だからね。
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>として宣言されていれば、実装側はそれに従わざるを得ない、と思ったけど
現実にそんなことが要求されることがあるか、と聞かれるとちょっと微妙かも
2024/08/14(水) 12:46:04.27ID:9gU6ei1I
zigは本当に最強
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>を保持するバージョンに変えてみよう
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では当たり前の仕様なんだよ
つまり制限された間違った仕様というよりは別の仕様と捉えることもできるんじゃないかな
2024/08/14(水) 19:39:11.70ID:VXEGQejB
>>209-210
「ByteIterはバイトのスライスを繰り返すイテレータです」
「今こうして前のプログラムを見返してみると、明らかに間違っていましたね」

とかの日本語で説明した文章をすべて無視して、コンパイルの通ったRustコードだけを正しいものとして「プログラマの意図」を見出そうとすると、そうなるんだね
どう考えるとそういう結論に至るのかはよく分かった
2024/08/14(水) 19:54:05.99ID:HK0RNQ5P
>>211
最初のプログラムのどこが間違っていると主張していますか?
assertも通って機能していますよ
2024/08/14(水) 20:38:24.97ID:VXEGQejB
日本語を読めば分かるよ
新ネタ無さそうならもう終わりにしとくね

lending iteratorって発想は無かったから、そこだけは面白かったかもね
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

両者を区別できていますか?
2024/08/14(水) 23:52:37.44ID:glbfXLC+
最初のプログラムは関連型のItemを定義できないからIteratorの仕様を満たせないだろ
type Item = &'a u8;
だと拡張(というか修正)した方のコードになる
「正しい」の意味が噛み合ってないことに気付こう
2024/08/14(水) 23:59:55.13ID:orQgr5Ob
結局>>157の記事は破綻してるんだな
イテレータをstd::iter::Iteratorだけを指す狭い意味に取ると
その記事の最初の&u8をItemにした時点でコンパイルエラーとなるから記事は破綻
イテレータを広い意味にとってその記事の方法でもOKとすると
最初の実装でイテレータとしての機能は満たしていて
それを&'a u8にする必要はなくなり記事は破綻
2024/08/15(木) 00:04:11.15ID:JUA9dFMu
「コンパイルが通ったならばライフタイムの記述は正しい」で常に合ってるのに、
それがいかにも間違ってるかのように仕立て装うから矛盾が出てる感じ。
2024/08/15(木) 13:27:43.17ID:TpdjcC5K
Rustは良い言語だと思うけど
清書用だね
2024/08/15(木) 14:13:48.29ID:ntgKOifP
他の言語よりバージョン管理(git)の技術が問われる気がする
全体の整合性が求められるから個人開発でもまじめにブランチ使わないとしんどい
2024/08/15(木) 14:43:48.85ID:vVr6IPen
>>219
整合性が求められるのはどの言語でも同じ
どの言語でもgitを使うかどうかブランチを切るかどうかの方針や判断は同じようになされて言語とは関係ない
221デフォルトの名無しさん
垢版 |
2024/08/15(木) 15:14:57.56ID:Q4hz384o
Rustはコンパイル通らないと嫌な気持ちになるから整合性が必要
動的言語はバグってても笑えるから整合性は不要
2024/08/15(木) 15:28:46.91ID:bVAhHZZX
>>218
Rustはリファクタリングに適していて
そのプログラムの本質のロジック以外のほとんどのミスをコンパイルエラーにしてくれるから
いきなり書き出し始めていってもなんとかなるよ
同じ機能が出てきた時点でtraitにして重複コードがあればそのprovided methodにするとかね
2024/08/15(木) 15:33:22.56ID:ntgKOifP
「全体の整合性が求められるから」は「全体の整合性をコンパイラにチェックされるから」に読み替えてくれ
コンパイル通らないと嫌な気持ちになる以前にテストできないだろw
2024/08/15(木) 16:10:36.88ID:bOFVyCO2
モノリシックな巨大なコードを作らずにクレイトに分けよう
クレイト毎にコンパイルできる
225デフォルトの名無しさん
垢版 |
2024/08/15(木) 16:13:34.27ID:gPssFbVF
自分だけかもしれないけど、新規にコードを書くとき/リファクタするときにエディタにワーニングが表示された状態になるのが精神的に負荷がかかるんだよね
だから新しく作ったファイルの先頭でまず #![allow(dead_code)] するね…
(ある程度コードができてきたら取り払うけど)
226デフォルトの名無しさん
垢版 |
2024/08/15(木) 16:23:19.81ID:gPssFbVF
>>218
分野によってはそう思う
探索的なデータ分析をするとか画像処理のアルゴリズムを考えるとか、そういう場面だとPython等で試してからRust等に移植というのは分かる
「書いて捨てる」を前提にするにはRustはやや重い
2024/08/15(木) 16:53:43.32ID:afsyCbP1
それはPythonに慣れてるだけじゃないか?
Python使ったことない人でもそうなるわけではない
228デフォルトの名無しさん
垢版 |
2024/08/15(木) 17:04:07.16ID:WFExrDMY
コンパイルワーニングやエラーが負荷になる人は動的言語でのテストファーストな開発も負荷になりそうだね。
229デフォルトの名無しさん
垢版 |
2024/08/15(木) 17:18:57.30ID:gPssFbVF
慣れというのは否定しないけど、そもそもコンパイル必要な言語とそうでない言語の違いだな
コード書いて Ctrl + S で保存すればすぐに変更後の動作を試せるのは大きい
特にRustなんてコンパイル時間長いんだし
書き捨てる前提の実験的なコードで完璧を目指すものでもないでしょ
2024/08/15(木) 17:31:23.55ID:2Mk02GNe
そんなにコンパイル言語が嫌いなら使うな
このスレから永久に出ていけ
231デフォルトの名無しさん
垢版 |
2024/08/15(木) 17:40:55.12ID:gPssFbVF
自分は用途によっては他の言語も使うとしか書いてないんだが
宗教的あるいは能力的に一つの言語しか使えないんです?
2024/08/15(木) 17:53:40.88ID:KHsgBa/H
特性の真逆なスクリプト言語と比較しても既知の話ばかりで新たな知見も情報も得られないからなあ
ノイズとなるだけのスクリプト言語との比較の話は禁止しようぜ
やりたい人は別スレを立ててやればいい
233デフォルトの名無しさん
垢版 |
2024/08/15(木) 18:21:12.60ID:gPssFbVF
自分が言いたかったのは「Rustは清書用」というレスへの同意だけなんだよな
特定の言語を推したり比較したりしたいわけではなく
これ以上の話はスレチになりそうだからやめとく
2024/08/15(木) 18:25:33.11ID:IG6WI0D2
俺はRustの方が慣れてるため最初からRust使うので慣れの問題だと思う
2024/08/15(木) 18:46:44.09ID:OZNxhJTv
スクリプト言語で下書きするっていっても直和型もないような言語だと
Rustで清書するときにデータ構造からやり直しだし
どういう言語を想定してるんだろ
TSとか?
2024/08/15(木) 18:58:18.84ID:OZNxhJTv
画像処理みたいな純粋なアルゴリズムの検討ならあまりそういう問題はないだろうけど
単なる数値計算なら別に最初からRustでいいと思うんだよな
DLみたいに既存のフレームワーク使うためにPythonで検討したいとかなら分かるんだけど
237デフォルトの名無しさん
垢版 |
2024/08/15(木) 18:59:39.70ID:gPssFbVF
アプリ全体の設計レベルだと流石に下書きなんてしないと思う
あくまでも部分的な話で、例えば画像処理なんかだと整数または小数型の多次元配列だけ扱えれば良いので
2024/08/15(木) 19:32:04.42ID:+y/e/IpZ
RustやC++で書かれたライブラリを呼び出すだけの話ならばどの言語でも同じだから議論の意味ない
そうではなく自分でプログラムを組んで実行するなら最初からRustで書けば高速実行できる
2024/08/15(木) 20:01:33.38ID:mLyUPHca
実験的な変更の波及範囲が広いんだよね
エラーの種類を増やすためにenum ErrorKindに新しい要素を追加したらErrorKindをmatchで網羅してるDisplayの修正も必要になるとか
最終的には必要な変更だから修正漏れを防ぐ意味では助かるけど一時的な変更だとちょっと大変
バージョン管理が適当だと戻すのも面倒になる
2024/08/15(木) 20:17:28.56ID:cCrv94Lj
>>239
thiserrorを使いなさい
2024/08/15(木) 22:15:21.69ID:nyOB87vc
不満を言う人は単なる不慣れとそれによる知識不足という感じですねー
2024/08/15(木) 22:23:50.08ID:J+lHdaYT
慣れてくるとサボり方も分かってくるからあまり困らんよね
とりあえずunwrapやtodo!多用してメインのパスだけ作ってしまうみたいなのはよくやる
243デフォルトの名無しさん
垢版 |
2024/08/16(金) 01:41:31.76ID:n83uLnGm
で、Rustのコンパイル時間は改善されてるのかい?
244デフォルトの名無しさん
垢版 |
2024/08/16(金) 08:44:44.18ID:AlUb7wqr
>>242
あとはclone連打したりBoxに入れたり
245デフォルトの名無しさん
垢版 |
2024/08/16(金) 11:16:32.52ID:NCq9ClXr
cargo build とかで rustc にオプションを渡すにはどうすれば良いですか
特定の hoge.rs に対してだけ出来ると有難いです
2024/08/16(金) 11:33:25.98ID:aaHau8VO
clone減らしても結局処理速度変わらなかったりする
2024/08/16(金) 11:41:08.16ID:ig7l4HYj
>>245
cargo rustcかRUSTFLAGS
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]);
}
249デフォルトの名無しさん
垢版 |
2024/08/16(金) 14:04:22.59ID:l1JK1BDI
純粋な質問だけどマクロ使わずにできる?
以下のような感じに

static x: X<中身の型> = X::new(初期化式);
assert_eq!(&x, 中身の型と比較可能な値);
x.do_something(); // メソッド呼び出し
2024/08/16(金) 14:20:39.96ID:PUHP0I+b
>>249
Mutexへの参照を持つMutexGuardを持つスコープ内でしかDerefできない
つまりメソッドを定義してDerefした結果の参照を返すのは無理
この仕組みにより参照をスコープ外へ持ち出せなくしていることが肝
ただしMutexGuardを返すメソッドは実現できる
その場合は自分でDerefして使うことになる
それにより具体的には *Foo.x() += 1; として使うメソッドx(&self)は実現可能
2024/08/16(金) 14:28:26.26ID:2XNA/Shu
>>249
それだけならできるよ
2024/08/16(金) 14:28:39.39ID:aaHau8VO
>>248
こんなのZigならcomptime付ければ解決だろ
2024/08/16(金) 14:43:23.29ID:/FTYasP4
>>252
グローバル変数、すなわち、タスクやスレッドが排他制御して安全に扱える話をしているところで、comptime??
254デフォルトの名無しさん
垢版 |
2024/08/16(金) 15:12:00.16ID:l1JK1BDI
Rustでもコンパイル時に作れるものは簡単にグローバルな定数にできる
問題なのは HashMap みたいなヒープを使うもので、LazyLockが必要になるのもほぼこのようなもののためだと思う
初期化した以降は不変な操作しかしない定数のような使い方をする場合でもMutexが必要なのは仕方ないという感じなのか
255デフォルトの名無しさん
垢版 |
2024/08/16(金) 15:14:27.12ID:l1JK1BDI
>>254
すまんこれは勘違い
不変ならLazyLockだけで足りそうだ
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]);
2024/08/16(金) 17:40:52.16ID:n/S+hvuh
LazyLockは油断するとデッドロックの要因になりそうだな
初期化が単純なうちはいいけど
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読み出し追加コストはその状態整数を見ることだけになり、
「初期化済」状態でずっと変わらないため分岐予測もおそらくずっと成功
そのためコストは気にせずに使える
2024/08/17(土) 01:30:12.83ID:OMSBWIoV
小さなTauri v1アプリをv2 RCにアップグレードしたら
リリースビルドのファイルサイズが2倍になったんだが

ファイルサイズ小さいのが売りじゃなかったのか?
6MBが12MBになったぞ
2024/08/17(土) 13:50:23.56ID:kywszD5m
TauriのことはJavaScript/TypeScriptスレでやれよ
2024/08/17(土) 14:00:58.13ID:w43wc/GB
>>260
Rust のバイナリにリンクする部分は Rust の話じゃね?
2024/08/17(土) 14:22:14.92ID:wXTvB1/z
もしRustやRustの汎用ライブラリのバージョンを変えてバイナリサイズが増えたのならRustの話なのでここでやればいい
しかしアプリのバージョンを変えてサイズが増えたのだからアプリの話であってRustスレで語ることはなにもない
2024/08/17(土) 14:27:21.91ID:OMSBWIoV
もしかしてTauriがRustのライブラリだと知らない人?
2024/08/17(土) 14:30:56.85ID:G1OfNx36
Rustに問題があると読めそうな文章なら手段を選ばずに排除する人
2024/08/17(土) 15:23:05.55ID:Qf5pJUWp
rustコードをコンパイルしたwasmバイナリが増えたってこと?
2024/08/17(土) 15:45:50.91ID:EpylkaBR
>>265
Tauriは各OSの他のアプリと同様に各ネイティブで動作するためwasmは関係ない
TauriはWebブラウザと同じ立場なので同様にJavaScriptとwasmが使えるが
そこでのwasmのコードはどのWebブラウザやTauriからも独立していて関係がない
2024/08/17(土) 15:53:49.31ID:bT3U9dm8
tauriはネイティブ部分とwebviewでプロセス間通信させて動いてるんだっけか
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側で書くかみたいな話もあるよな
2024/08/17(土) 16:32:34.13ID:b7Mo3s6c
>>268
ウェブコントロールなんて分かりづらい言葉を使わずにWebViewと言ってくれ
2024/08/17(土) 16:36:42.10ID:dIGhUzjt
>>261
numpyのバージョン上げたら動かなくなったなどと言ってpythonやnumpyのスレではなくCのスレに乗り込んでるようなもんだぞ
2024/08/17(土) 16:47:26.11ID:YqZ4otqM
https://tauri.app/v1/guides/building/app-size/
Tauri v1のページだけど、ここに書いてある手法自体はたぶんv2でも有効だから比較調査してみるとよし
274デフォルトの名無しさん
垢版 |
2024/08/17(土) 16:50:47.17ID:K84lbgy4
>>272
TauriはRust部分もちゃんと使うフレームワークだぞ
アプリとして必要な処理をRustで書いてそれをJS/TSから呼んだり、データをRust側とフロント側で受け渡したりできる
ほぼTS/JSだけで書くこともできるけど、逆にUI以外のロジックはRustをメインに書くといった使い方もできる

実際のプロジェクトでどう使われてるのかは自分も知らないけど
2024/08/17(土) 16:53:38.16ID:bEXpluCi
一般的にバイナリサイズは動的リンクの共有ライブラリの使用が多ければその分だけ小さくなり逆は大きくなる
だからバイナリサイズとプログラム全体のサイズは関係がない
そのver.1とver.2でバイナリに含まれていないライブラリの変化を調べて違いを投稿してください
276デフォルトの名無しさん
垢版 |
2024/08/17(土) 16:55:44.18ID:K84lbgy4
ビルドはCargoを使うし、「生成されたバイナリが大きい」みたいな問題もRustのカテゴリーで良い思う
フロント側に使ってるReactやVueについての質問ならJS/TSスレで聞くべきだけど
2024/08/17(土) 17:04:38.57ID:tGKWZUAz
>「生成されたバイナリが大きい」みたいな問題もRustのカテゴリーで良い思う
意味わからんわwww
278デフォルトの名無しさん
垢版 |
2024/08/17(土) 17:19:21.92ID:K84lbgy4
解決するかはともかく、質問先としてはJavascriptスレよりはRustスレの方が回答してもらえる可能性が高いじゃん
公式のリポジトリのissue見ろって話になるかもしれないけど
279デフォルトの名無しさん
垢版 |
2024/08/17(土) 17:24:48.12ID:K84lbgy4
>>259のレスを見落としてるせいでバイナリサイズの話が唐突な話に見えてるのだったらすまん
2024/08/17(土) 17:35:27.19ID:bEXpluCi
まずは動的リンクしているライブラリの変化を調べなよ
例えばもしそれが減ってるなら
依存していた外部ライブラリの不自由さから解放されて状況が良くなっている話の可能性もある
2024/08/17(土) 17:40:36.43ID:SISNcxTZ
普通にissueで報告したらええやん
Rustのバージョンもビルド方法もビルドオプションも変えてないんやろ?
2024/08/17(土) 17:47:51.42ID:co5P0ZaQ
>>279
むしろ>>259のレスが総スカンくらう理由だぞ
環境情報も無く自分で調べたり切り分けをした痕跡が全く見えないから
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倍ぐらい大きいんじゃないの?
2024/08/17(土) 18:41:27.25ID:I1dGWckH
今も小さい方のバイナリも生成できていることから
Rustとは無関係な話であると切り分けできてよかったね
285デフォルトの名無しさん
垢版 |
2024/08/17(土) 18:46:42.10ID:AaqttF5e
tauriのことはjavascriptの範囲 (キリッ)
って書いてたやつが的外れなのは変わらない
286デフォルトの名無しさん
垢版 |
2024/08/17(土) 19:34:46.59ID:w2zHmV9M
全部issueで聞くべきなのでこのスレは存在意義がないんだよね
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/)
2024/08/17(土) 21:22:36.94ID:bEXpluCi
>>286
アドバイスしても反応ないからもういいのだろう
2024/08/17(土) 21:26:19.66ID:OMSBWIoV
Tauri v1もv2も動的リンクしているライブラリはいっしょだよ
2024/08/17(土) 21:28:39.15ID:I1dGWckH
Rustの話ならともかく
Rust製の個別のアプリの話は知ってる人がたまたまいたらラッキー
他の言語のスレでも同じ
2024/08/17(土) 22:26:04.77ID:Lg9B4E9Y
>>290
>他の言語のスレでも同じ
同じじゃないでしょ
君はvscodeがTypeScript製だからといって
バージョンアップで問題が発生したら
TypeScriptスレに書き込みするのかい?

Tauriでもバックエンドやプラグイン開発の話ならわかるんだけどさ
2024/08/17(土) 22:55:19.71ID:I1dGWckH
Rust言語自体の話以外は
もし誰からの反応が無くても当然だから
反応が来ることをアテにするな、という意味だぞ

一方でTauriはRustのクレイトの一つだから
ここで話題にすること自体は全く問題がない
version 2.0の人柱なんてレアな話に誰も反応がなくて当たり前
2024/08/17(土) 23:48:49.41ID:Isu8e7gT
WebでのWasmバイナリなら各利用者ブラウザによるリアルタイムのダウンロードとなりサイズを気にするけど、
WebブラウザやTauriアプリのバイナリのサイズはどうでもいいって立場。
2024/08/18(日) 01:26:09.33ID:c9N8aWZH
倍といっても所詮は 5MB 増しでしかないならたいしたことではないとは言えるが……。
でも益なく増えてるのなら改善が望ましいのは確かだし、益があるならどんな益なのか知っておきたくもあるよ。
2024/08/18(日) 02:36:20.00ID:BU3f2kLL
複おじに振り回されっ放しのバカばっか
2024/08/18(日) 08:12:37.69ID:7bUmcmUR
>>283
そのexeは解凍できないん?中にjs/ts要素と一緒にリンクライブラリが入っとるだろうからそれ比較すればと思った
2024/08/18(日) 13:27:09.96ID:gYLk4pIA
tauri って新しいので servo 使うようになるんじゃなかったっけ?
それでバイナリサイズ増えてるんじゃ?

servo 使うようになるのは tauri 自身のコアコンセプト否定してる感じがして謎いが。
2024/08/18(日) 14:43:03.93ID:tu42Sbmi
こいつ前からずっと1人でWebView推してるおじさんでしょ
変なのが居着いちゃったな
2024/08/18(日) 15:04:00.99ID:RAsFRw0P
tauriのスレはちゃんとあるからそっちいけば?
【Electron】ハイブリッドアプリ開発総合【Cordova】 [無断転載禁止]©2ch.net
https://mevius.5ch.net/test/read.cgi/tech/1498985597/
2024/08/18(日) 23:46:45.47ID:C/oeXKJM
Tauri自体はcrates.ioにもある普通のRustのcrateで普通にRustのコードを書いてcargoで開発するものだから
それらcrateやRustコードやcargoの話はここでやっても構わない
Rust以外の話はこのスレの対象外
多少の脱線に限れば他の話題と同様に許容範囲
2024/08/19(月) 00:46:11.66ID:40PoSJGp
許容範囲が広いなら、話題に反応しない自由も大きくなってしまう
すべての話題・情報をノーカットで処理すべきと思う人は
反応しない自由は容認できないだろう
知らんけど
2024/08/19(月) 03:37:53.96ID:fUo70iyi
「Rustは良い」の結論に結びつかない話題はスレチです
2024/08/19(月) 08:28:41.87ID:E6sjrlZi
君らは
僕が選んだ(rust)は凄い
でしょ?
iPhone絶対正義やってる人と一緒
2024/08/19(月) 08:33:51.85ID:QEF3ueHi
>>303
個人的にはZig至上派でRustはC++よりマシという思いでやってる
305デフォルトの名無しさん
垢版 |
2024/08/19(月) 11:20:06.32ID:2cTqvZHP
Xで、Hideyuki Tanakaは、Rust信者の典型的な説を言ってると思うけど、
ほとんど同意できない。
2024/08/19(月) 11:57:13.33ID:40PoSJGp
無課金という選択がすごい
二刀流でも三刀流でもできるのは課金しないからだ
有限のリソースがといって宗教を一つしか選べない人達が戦争を始める
307デフォルトの名無しさん
垢版 |
2024/08/19(月) 12:14:50.01ID:BR0GvBMw
Rustはすごい
だからRustスレにいる俺はすごい
俺が知らない話題がRustスレにあると自分がすごくない気がするから許せない
2024/08/19(月) 15:34:27.05ID:sXHwNQud
RustよりZigのほうがすごい
2024/08/19(月) 16:46:33.01ID:KiHLz2jZ
米国国防総省のDARPA、CからRustへのコード変換を自動化する「TRACTOR」プログラムを開始
https://atmarkit.itmedia.co.jp/ait/spv/2408/14/news045.html
2024/08/19(月) 17:48:38.35ID:5GtswNJ5
あ、zig要らなくなったな
2024/08/19(月) 18:09:59.20ID:CLLx5KNp
C/C++からRustへの変換こそ自然言語処理技術を使えばいいのに
2024/08/19(月) 18:18:10.95ID:fUo70iyi
プログラムって、計画とかそっちの意味のプログラムかい
313デフォルトの名無しさん
垢版 |
2024/08/19(月) 22:28:35.76ID:HWmXMBa7
>>304
1.0になるまで黙ってろ
314デフォルトの名無しさん
垢版 |
2024/08/19(月) 23:09:53.72ID:qGtdUYlI
Cがやるような低レイヤ側だったらZigの方がシンプルだと思う
自分は式や型の表現力の高さの点でRustが好きだけど、これが強みになるのってより上位のレイヤーな気がする
RustでFFI用のC互換のコードを書こうとするとRustの管理を回避するためのコードが必要で、それが煩雑になりがち (基本的にunsafeが必要だったり、オブジェクトをCに渡すために Box から into_raw するのが必要だったり)
2024/08/19(月) 23:37:07.40ID:53YDPjss
>>314
低レイヤも全てRustで書くことに支障はない
Cと連携する場合でもFFI部分はパターン化していてすぐ書けるから困らない
2024/08/19(月) 23:47:50.44ID:fihfH3vm
低レイヤと高レイヤを別言語にしたら接続箇所がいくらか煩雑になるが
全部 Rust にすれば低レイヤ部分は unsafe ばっかりで Rust の良さが活きてこない。
低レイヤで便利な言語は高レイヤでは抽象度の不足などで使い勝手が悪い。

全部が楽ってことはないので煩雑さをどこに持ってくるかの問題じゃないの。
ある程度は煩雑な部分があるのは仕方がないとして仕方ない部分を (快適とは言えずとも) 及第点に出来てれば十分に良い言語でしょ。
2024/08/19(月) 23:57:37.03ID:53YDPjss
>>316
unsafeばっかりになる、が妄想思い込み
318デフォルトの名無しさん
垢版 |
2024/08/20(火) 09:21:19.12ID:5ubxjraY
変なことやることになった時にはRustのアロケーター指定面倒でZigはその辺楽だなってなる
2024/08/20(火) 10:15:16.56ID:8nEEv7Ra
同一言語内で失敗例と成功例があるのは客観的事実だから
「言語を変えたら成功した」という因果関係は妄想と言われても仕方ない
2024/08/20(火) 10:46:28.17ID:I3hdmNTC
>>317
理想的に設計できればいいけど現実はそうではない。
ホスト環境ありの高レイヤで unsafe まみれにならないのは標準ライブラリが慎重に設計されてるからで、標準の設計と同じくらいに上手くやれる人は稀。
そりゃカスなプログラマだからだろって言われればそのとおりだがだいたいの現場はカスなもんなんだよ。
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が苦手な良いアルゴリズムを知らない人。
そういう人が圧倒的に多いので多数派意見になっているだけ。
2024/08/20(火) 18:19:19.40ID:wtC8SLN0
unsafeまみれにならないように工夫すれば、unsafeまみれにならない
だからこそ、unsafeまみれにならないように工夫すべきである、と私は思いますね
2024/08/20(火) 18:55:32.33ID:81clKmqR
CやZigで作ったあとにAIで安心安全なRustに変換でいいんじゃね?
あ、それだとRust必要ないかも
2024/08/20(火) 20:54:37.99ID:AoNxQf2S
いうてRustはまだまだ発展途上でしょ。このケースはunsafeなしでも安全性を推論可能でコンパイルできる。みたいなケースは今後もどんどん増えていくんじゃないの?
2024/08/20(火) 21:23:27.30ID:wZEb7+R4
実際unsafeの安全性を証明するための研究も結構行われてるしな
Cみたいになんでもありだとかなり厳しいけど
Rustならunsafeといってもそれなりに制約があって研究としてもやりやすいらしい
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.
2024/08/20(火) 21:53:19.45ID:WNch2okD
>>325
変換して生成させるかゼロから指示して生成させるかどちらが効率的かは意見が分かれるが、
2024/08/20(火) 21:54:44.32ID:WNch2okD
一般的にAIに生成させる場合は少なくとも以下の3つが必須とされる
(1) AIが安全なコードを生成できること
(2) 生成物の安全性を人間が確認できること
(3) 安全性とは別にAIのミスや暴走を食い止めるため人間がレビュー確認できること
2024/08/20(火) 21:55:11.06ID:WNch2okD
(1)は生成AIにとってかなり難しく様々な安全なパターンの学習をさせても間違いが起きるうる
生成先がRustならばコンパイルが通る条件など指定で間違いを防げる
(2)も生成先がC/C++やマシン語だと難関だがRustならばコンパイラに任せられる
(3)は(1)(2)によりRustを読める人材が今後も必要になることを意味する
さらに核心部分はAIに任せず人間が書くことで対AIの安全性を確保する考え方もある
したがってRustを書ける人材も必要とされる
2024/08/20(火) 22:02:42.33ID:GiQ160H0
生成AIは既存物の変換処理は苦手でしょ
自然言語処理でやれないの?
2024/08/20(火) 22:26:06.21ID:WNch2okD
>>325のようにCで書いてAIにRustへ変換させることが出来るようになったと仮定しても
Rustを直接書いて開発できる人と比べて不利と思われる
さらに保守性の面では二重管理となってしまう
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では上手く書けないアルゴリズム」を知らない人が圧倒的に多いので多数派意見になっている。
2024/08/20(火) 22:49:18.72ID:04Vfq+Gu
>>335
[さらに補足]
・C言語は、どんなアルゴリズムでも(分け隔てなく効率良く)書ける。
・Rustは、unsafeの範囲内のでは限られたアルゴリズムだけが効率よく書け、
 それ以外のアルゴリズムは、効率が落ちてしまう。
2024/08/20(火) 23:44:10.92ID:o/ez13eh
CPUから見たメモリは何でも自由にできるunsafeな存在だからさ
一番下ではunsafeな操作が必須な存在となることは当たり前さ
そのためunsafeだらけのRust標準ライブラリがそこをカバーしているのさ
だから普通のプログラマーはunsafeを使わずにプログラミングできるのさ
2024/08/21(水) 00:04:15.03ID:9jT0I4l3
過去一キショい語尾のキャラ作り
339デフォルトの名無しさん
垢版 |
2024/08/21(水) 03:19:43.62ID:onw1PAAY
>>336
最初からそう言えば良いのにωωω=2πf
2024/08/21(水) 03:32:22.83ID:aTMrino2
>>336
Cで安全に書けるならば
Rustでもそれをライブラリとして提供できる
利用者にとってその中身がunsafeかどうかは気にする必要がない
例えばRustの標準ライブラリは何千ものunsafeブロックが含まれている
2024/08/21(水) 10:09:51.68ID:tqcavnGI
>>339
Rust は清書用(キリっ
2024/08/21(水) 10:57:58.35ID:W+U2SbEM
>>340
>Cで安全に書けるならば
>Rustでもそれをライブラリとして提供できる
問題は本当にCで安全に書けているのかわからないところ
アルゴリズム系は安全性がそれなりに担保されているからsafeラッパーを提供するのは難しくない
難しいのはFFI
343デフォルトの名無しさん
垢版 |
2024/08/21(水) 17:22:42.80ID:Lo3kfkUP
このスレにはRust理解してないガイジしかおらん
2024/08/21(水) 18:51:27.99ID:CiN+yn7N
オレはコンシューマ寄りであまり理解せずにRust書いてる
ほとんどSQL文のWEB APIだけど
2024/08/21(水) 19:17:17.31ID:e/imWdn6
サーバーやクラウドでCPUとメモリの使用リソース節約のために参照とライフタイム使いまくるプログラミングもあれば
リソースは金をかければよいだけだからとヒープ使いまくりのお大尽プログラミングもある
後者は技術力が低くてもいける
2024/08/21(水) 20:29:33.23ID:Hslv1ADF
有能な技術者を揃えて手間もかけて倍の性能を出すよりは機械を二台にするほうがコスト安ってのが昔の考え方だったんだよ。
高いのは設備より人の時間だったの。
いわゆる富豪的プログラミングという概念が生まれたのもそのときはちゃんと合理的な話だった。
だけど今は設備投資した上でまだ性能が要るという段階までコスト・性能の要求が厳しくなってきて揺り戻しが起こってる。
2024/08/21(水) 22:37:24.76ID:lzWu0Eqv
Rustでライフタイム付きの構造体を書いたことがなく書けない人とかな
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 などに置き換えるかになる?
2024/08/22(木) 00:54:54.13ID:bBXwpWXG
>>349
指してる先の寿命が短い危険なC/C++コードが
複雑で巧妙な条件管理でぎりぎりダングリングポインタとなることを上手く避けている
ように見えて実はある条件が揃った場合にはアウト、とかな

つまりunsafeでそのまま移植するとそのまま致命的バグが残ってしまう
根本から設計しなおせないならばRcと弱参照で致命的バグ回避か
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
2024/08/22(木) 20:23:18.57ID:bSiaItqF
>>351
ChromiumとChromeのC++メモリ脆弱性が日常茶飯事になってるから
少しずつRustへ置き換えていく方針なのか
353デフォルトの名無しさん
垢版 |
2024/08/22(木) 22:43:10.37ID:0OofYQEx
Firefoxはおっさんしか使っていない
2024/08/22(木) 22:46:45.14ID:RW7BB5aO
chrome 系一色になるのも良くはないからね。
2024/08/22(木) 22:47:07.99ID:Vc+ybjuc
Rust信者からするとこの期に及んでC++でブラウザの再実装なんて始めやがったLadybirdのことは全力で呪ってる感じ?
2024/08/22(木) 22:57:32.73ID:0cYmGRHf
chromiumがC++のメモリ管理ミスでセキュリティ脆弱性を毎回出し続けているように
ブラウザのような新機能を常に加えていく大規模ソフトウェアでC++の使用は無理がある
だからchromiumはRustを採用し始めた
2024/08/22(木) 23:59:43.53ID:cneVZgKz
>>355
Ladybirdは作者が慣れてるから初期実装をC++でやっただけでSwift6.0が出たら移行みたいだよ
まぁRustのエコシステムに貢献してくれたほうが良かったとは思うけど、Swiftならいいんじゃないかな
2024/08/23(金) 00:10:40.25ID:P1vs0moa
Swiftが遅い原因は
Rustで例えるとArc<Mutex<T>>を常用することでメモリ管理問題から逃げているため
という理解でいいのかな
2024/08/23(金) 00:24:23.39ID:4TKwTCLB
Chromeは生ポインタ使ってるところを
一気にスマートポインタ等に置き換えたという
話を何年か前に聞いたけどそれじゃダメなんだな
360デフォルトの名無しさん
垢版 |
2024/08/23(金) 09:32:17.32ID:1xE8ro2C
&strはlowercaseプルプル
2024/08/23(金) 09:59:59.89ID:cja0xMPs
primitive type は小文字ってのは Java あたりを踏襲した感じなのかね?
2024/08/23(金) 10:07:13.27ID:cja0xMPs
>>359
スマートポインタだけでは駄目で、 Rust で言うスライスみたいなものがないと安全に管理できない。
近年の C++ にはそういうライブラリも追加されたけどまだちょっと整備が不足している。
C++ は標準ライブラリには過剰なほど高い抽象度・汎用性を求めるので多次元のコンテナとの辻褄合わせでずっと議論してる……
2024/08/23(金) 10:12:11.46ID:UhIA8/Kr
>>361
Cからずっとそうじゃないっけ?
組み込み型名はたいてい予約語で、予約語はたいてい小文字だからな気はする
2024/08/23(金) 10:29:44.46ID:cja0xMPs
>>363
いや、暗黙の前提として「標準ライブラリの型名は camel case なのに」ってのを含んでる。
つまり「primitive とライブラリを違えている」ということを話題にしたくて、それを原則にしている言語の例として Java を挙げた。
2024/08/23(金) 12:43:06.00ID:HH2aHznt
RustでcamelCaseは用いない
基本型は小文字
structやenumで作る型および別名はUpperCamelCaseを用いる

例えばstrは基本型だから小文字
StringはstructだからUpperCamelCase
2024/08/23(金) 14:34:53.94ID:gM6UWsJN
strって言うほど基本型か? 問題
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なのが違和感の正体かも
2024/08/23(金) 15:49:44.63ID:HH2aHznt
array(記述は[T; N])やslice(記述は[T])やstrはもちろん基本型
そしてヒープを必要としない
だからcoreにありno_stdでも使える

一方でBoxやVecやStringはヒープを必要とする
だからcoreにはなくallocにある
2024/08/23(金) 20:34:48.59ID:7RGZdp5c
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=d8fa7bff7e61accb6f6bf7f0d4075dae

要素への不変参照を保ちつつ追加できるコレクションが欲しくて試しに書いてみたけど、どうすりゃいいんだ
UnsafeCell使うしかない?
2024/08/23(金) 21:33:21.24ID:IFprRKq6
>>367
スライスとstrとdynはDSTだからこそprimitiveだよ
参照が他と異なりfatポインタになるからね
"あいうえお" を正規UTF8と定めた点もRustの良いところ
それをprimitiveな型strとしたのも良い判断だね
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だよ
一般プログラマーは使ってはいけない
2024/08/23(金) 21:46:56.38ID:cja0xMPs
名前に露骨に Unsafe って付いてるんだから十分な理解なしに使うのはやめておけという意図は感じるよな。
2024/08/23(金) 21:47:30.17ID:3P3xaQHb
>>370
UTF-32の方が単純で良かったんじゃないか?
2024/08/23(金) 22:02:55.80ID:IFprRKq6
>>373
ファイルもネット通信もUTF8に統一されていってる状況だから
それらを無変換で済むUTF8がベストだよ
UTF32はメモリを無駄に消費してメリットがないよね
2024/08/23(金) 22:05:42.82ID:cja0xMPs
UTF-8 はランダムアクセスに難があるが文字列のランダムアクセスってそんなに要らんだろという割りきりだな。
やりたければ UTF-32 用の型を使えるし、あくまでも言語の基本には UTF-8 を据えるってだけ。
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
2024/08/23(金) 22:26:58.16ID:IFprRKq6
UnsafeCellは内部可変性を持つ安全な型を作るためのunsafeな部品として存在している
目的外に使う人に対しては今後は他の質問についても答えない
2024/08/23(金) 22:27:06.29ID:TPfx6yeo
>>376
値が数値だから今のところ問題ないけどこの実装だとListを新しいConsに突っ込んだ瞬間に
先頭の値の参照先が無効になりそうだな

自作にこだわらないならtyped-arenaを使うといい
https://docs.rs/typed-arena/latest/typed_arena/
小さいライブラリだから自作の参考にもなると思う
ライブラリ使わないならどこかでunsafeは必要になる
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と組み合わせてグラフをなんかいい感じに扱えるやつくらいの認識だったので完全に盲点でした
これでいけそうです、ありがとうございます
2024/08/23(金) 22:55:03.65ID:7RGZdp5c
おっとリンク再生成してなかった
ちょっとuser-friendlyに整理してみた版
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=b0ca47dce14c07da2936f1964bc54485
2024/08/23(金) 23:21:46.23ID:HH2aHznt
安全だと思い込んでunsafeを使うやつはCでも使っとけ
2024/08/23(金) 23:29:15.36ID:3P3xaQHb
依存クレートの中からunsafeを検索して一覧表示するようなツールある?
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は危険というよりも「このコードの安全性はコンパイラでは検証しないので実装者が責任を持つ」ブロックと考えて、よくテストされたライブラリについてならある程度信用して良いと思う
2024/08/24(土) 07:54:28.69ID:hn86gB+V
unsafeは人間が安全性を保証しなければいけないため、必ず多くの監視者がいなければいけない。
そして不必要なコードと必要で安全なコードを皆で選別しなければならない。
パフォーマンスにほぼ影響なく無くせるケースは無くすべきというのが第一原則。
2024/08/24(土) 07:56:32.18ID:hn86gB+V
一方でRustの標準ライブラリには何千ものunsafeが存在していて、安全なインターフェースを提供してくれている。
このおかげで我々はunsafeを使わずにパフォーマンスの高いコードを書くことができる。
標準ライブラリと同様に他のクレートでも下支えをしてくれるものは同じ立ち位置として認められているものが多い。
つまり必要不可欠なものである。
いずれにしてもライブラリ内に隔離して外向けに安全なインターフェースを提供してくれることが第一原則。
2024/08/24(土) 08:06:32.30ID:4K3Bdck4
Rust の参照についている様々な制約は機械的に解析可能なように制限したのであって
人間的な感覚での適切な抽象やデザインパターンと両立不可能な場合がある。
機械的検証可能性を維持するために不自然なデザインを持ち込むのが健全とは言い難いよ。

unsafe はなるべく低レイヤの小さな範囲に押し込めたほうが良いのは確かだが、
プロジェクトの性質によってはそれがもうちょっと高レイヤまではみ出してくることだってあるだろ。
2024/08/24(土) 08:21:40.08ID:oc2+bqUo
>>382
grep
2024/08/24(土) 08:22:12.74ID:zb5PQrw4
>>387
適切な抽象やデザインパターンと両立不可能な場合がある、ってマジ?
そんな話は聞いたことないな
具体的な例を教えて
390デフォルトの名無しさん
垢版 |
2024/08/24(土) 09:00:02.66ID:p6ioLyHc
>>297
tauriがrustを基盤としたフレームワークなのだから
rustと特別な関係にあるservoに移行するのは必然では?
2024/08/24(土) 10:45:01.27ID:ddJ1kwEW
servoが最低限まともに動くようになるには、あと軽く5年はかかる
今のバージョン動かしてみ?
夢見すぎ
2024/08/24(土) 11:01:21.63ID:YypCtLY/
>>384
>unsafeは危険というよりも「このコードの安全性はコンパイラでは検証しないので実装者が責任を持つ」ブロックと考えて、よくテストされたライブラリについてならある程度信用して良いと思う
こういうスタンスはダメだよな
作ってるアプリによっては許される場合もあるんだろうけど
2024/08/24(土) 11:31:23.33ID:yTiOx0eZ
>>390
俺はtauriのコアコンセプトはOSが提供するブラウザエンジンを使い、バイナリサイズやセキュリティアップデートの問題を解決することだと俺は思ってるんだ。
だからRust使ってるからservo使うってのは門外漢には自然に見えてもコアコンセプトを忘れてもともとの問題を解決しないOSSになっていってる感じがするんだよな。
2024/08/24(土) 11:47:25.22ID:7iJIMzJC
ブラウザエンジンの選択肢が増えるだけでしょ
wryの中のfeatureが増えるのかwryごとservoに差し替えるfeatureになるのかは知らんけど
2024/08/24(土) 12:27:15.89ID:7lrMjW7E
.NET 9の新機能としてC#版Tauriが来るらしい
Go版Tauriもあるらしいし、流行ってるのかな
2024/08/24(土) 12:33:53.63ID:4K3Bdck4
疎結合でブラウザを GUI として使うには接続部分を上手く標準化する必要がある。
参加が多いほど標準化の圧力が生まれるし、良いことだと思う。
397デフォルトの名無しさん
垢版 |
2024/08/24(土) 13:14:00.45ID:Ou5o/VfJ
いまどき疎結合とか意味のないこだわりだな
2024/08/24(土) 13:30:29.34ID:7lrMjW7E
疎結合とかそういうかっこいい話じゃなくて
今どき新規にGUIツールキット作ってもウィジェット開発してくれる人が集まらないから
Web技術転用してしのぐかって話でしょ?

当のMicrosoftは3連続ぐらいで新GUIツールキットの開発に失敗しバグ残したまま撤退を繰り返してるし
2024/08/24(土) 13:38:09.55ID:4K3Bdck4
unicode の表示からしてウェブブラウザ以外は規格に追い付いてない感触はあるなあ……
2024/08/24(土) 13:46:07.91ID:6hMOShrr
>>393
そう思うならforkすればいいのに
オープンソースなんだし
コード書かない人には一家言もない世界よ
401デフォルトの名無しさん
垢版 |
2024/08/24(土) 13:46:41.99ID:Ou5o/VfJ
いまはネットワークが高速で繋がっている前提なのなw
2024/08/24(土) 13:54:50.23ID:62s/s0Ka
>>395
仕組みは組み込みWebViewをネイティブの上で起動してるだけだから作るのが大して手間じゃないし実装してみたって感じでしょ
403デフォルトの名無しさん
垢版 |
2024/08/24(土) 14:58:54.54ID:Jkp0q3NQ
>>382
github
404デフォルトの名無しさん
垢版 |
2024/08/24(土) 15:01:04.10ID:Jkp0q3NQ
>>387
+1
405デフォルトの名無しさん
垢版 |
2024/08/24(土) 15:03:55.41ID:Jkp0q3NQ
>>401
これホント困るわ
2024/08/24(土) 16:36:29.92ID:yTiOx0eZ
>>400
いや、牛丼屋なのに鰻丼を中心にするんだ…みたいな気持ちがあるだけで、俺は現状 tauri に用はないので…。

ちゃんと使ってる crate はコントリビュートチャンスを伺ってるよ。
2024/08/24(土) 16:50:25.05ID:tVyuBhwz
unsafeブロックってどこからどこまで囲えば良いんだろう
2024/08/24(土) 18:11:39.50ID:YypCtLY/
>>407
「可能な限り小さく」が原則
2024/08/24(土) 18:18:35.56ID:oEJCcg2t
Rustでunsafeは使ってはいけない
例外的にunsafeの使用が認められるのは以下2点のみ
ベテランが基盤クレートを提供する時
ベテランがFFI部分を記述する時
2024/08/24(土) 18:20:35.25ID:4K3Bdck4
unsafe なことをやっている箇所をなるべく小さい範囲で囲むべきだがお互いに関係のある複数の unsafe がごく近くにあるならまとめて囲むほうが分かりやすいということはあるかもね。
2024/08/24(土) 18:29:15.33ID:L19e2eSE
そういうケースを除くとunsafeを使ってる者は技術力がないだけのバカと
パフォーマンスにほとんど変化しないのに高速化してるつもりで保守性を下げてるアホだからな
2024/08/24(土) 18:32:37.91ID:wRPlPCuY
Rustでどう書くのか分かりませんが、C言語で書けば、
BYTE *ConvertUintToPtr( Uint32 u ) {
 unsafe {
  return (BYTE*)u;
 }
}
のような関数をRustで作ることは出来ますかね?
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内に持ち出さないようにすればいいってことかね?
2024/08/24(土) 18:43:12.73ID:HUq12b/T
>>406
現状だと
servo「うちの鰻丼を置かせてください!」
tauri「まぁ客に出せる味になったらメニューに加えてもいいよ」
くらいの温度感に見えるけどなぁ。これまでの発表はservo側からだし、tauriチームとしてservoに全面移行するなんて話は出てないと思うけど
2024/08/24(土) 18:46:57.91ID:u5pZaQPK
>>413
unsafeの作法も知らない雑魚はunsafe Rustを使うな
基礎から学んで出直してこい
2024/08/24(土) 18:51:25.05ID:0FPuuX3m
unsafe Rust使うくらいならCでよくない?
反対意見あったら言ってくれ
2024/08/24(土) 18:52:59.44ID:73Xik/Zr
>>412
当然できるけど
危険な行為なので熟練者とキチガイしか使わないよ
2024/08/24(土) 18:53:02.17ID:tVyuBhwz
>>415
一応Referenceのunsafe blockの部分は読んだけど、nomiconも全部読まなきゃだめ?
具体的にどこが間違っている/作法に反しているのか指摘してくれるとありがたいんですが……
2024/08/24(土) 18:55:23.20ID:wRPlPCuY
>>417
参考のため、どう書けばいいのか教えていただければ幸いです。
2024/08/24(土) 18:55:51.72ID:NdtpJtS7
>>416
反対意見なんてないよ
人間はバカだからC/C++ではなくRustを使わざるを得ない状況になってるんだし
なるべくならRustなんて使いたくもない
2024/08/24(土) 18:57:28.86ID:73Xik/Zr
>>416
インフラやFFI部分のライブラリを作る上級者は例外として
unsafeを使うのはキチガイばかりだね
2024/08/24(土) 19:07:44.35ID:tVyuBhwz
>>412
変換するだけならunsafeも特に要らなくて、ただのasキャストでいいみたいね
fn convert_uint_to_ptr(u: usize) -> *mut u8 {
u as *mut u8
}

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

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

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

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

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

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

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

これは絶対無い
むしろC**使われてるとRust化から遠ざかる
断言出来る
RustとC++の相性は最悪
2024/08/30(金) 19:21:09.42ID:FuTFI1jb
かつてC++をボロクソに叩いていたLinusが、何でRustを許したのかよくわからない
2024/08/30(金) 19:35:01.93ID:00JO0I50
Rust for Linuxってout-of-treeカーネルモジュールをRustで書けるってだけでは?
それすらも思ったほど書く人がいなかったってことを言ってるんだろうか
2024/08/30(金) 19:51:34.75ID:ePNDldoR
いや書きたい人はたくさんいるし、実際書かれてるけどそれを本家に取り込む際にメンテナが拒否するって話
例えば

Rustドライバを書くための基盤となるユーティリティを追加したい → 実際のドライバで使われていないユーティリティは追加しない
ならドライバとユーティリティを一緒に追加したい → パッチが大きすぎるからレビューしない

みたいなのとか

この辺見ると実際にRustドライバの作者がカーネルメンテナの何に不満を持ってるかわかるよ
(この人はApple Silicon用のGPUドライバをRustで書いてる人)
https://vt.social/@lina/113045455229442533
2024/08/30(金) 20:29:51.47ID:J18stTwv
>>510
糞言語ってことじゃねw
2024/08/30(金) 21:40:23.58ID:9WnxEAZW
rustでファイルシステム扱うAPIを入れる活動に
メンテナから難癖つけられてうんざりしたので
下りるという人が出たらしいので
政治レイヤーで色々あるんだろうなあ
522デフォルトの名無しさん
垢版 |
2024/08/30(金) 22:55:20.95ID:jcHw3qvA
>>512
>昔ながらのカーネル開発者は賢いからCで良いんだよな

その割には毎週セキュリティパッチでてるようじゃん
2024/08/31(土) 03:26:17.69ID:bV8CK+h4
>>517
新しいものをなんでも否定していたら「老害」認定されるから、ここはちょっくら軟化しておこうかな、みたいな感じじゃね。
2024/08/31(土) 04:29:19.80ID:TuWOabX/
>>517
Cに対してC++の導入の益と害を考えると害が大きい
Rustの導入は益が大きいため国防総省(DARPA)も進めようとしている
ソース>>309
2024/08/31(土) 06:58:45.77ID:sI0PgNnZ
信者が家主に対してやっている事はこれに近い

最近、水道企業団の職員や委託業者を装い、「水質や水道管の検査に来ました」などと言って高額な浄水器の購入や水道管の取替えなどをすすめられた、
水道管の調査と称して管が汚れているから水道水が危険と言って給水管清掃の契約をすすめられた。 などの事例もあります。
2024/08/31(土) 08:04:20.66ID:/qocMB6l
リーナス自身がRustで何か作って見せたら流れ変わるかもな
まあそんなことは無いんだろうけど
2024/08/31(土) 08:34:49.06ID:RhJ/yuCQ
Rust がどうこうというのを抜きにしてひとつのプロジェクトにいろんな言語が混在するのは面倒さが生じるというのはある。
Linux に乗ろうとするなら Linux の方針に従えというのは当然の判断だろう。
受け入れてしまったらメンテナンスしなきゃならんし、メンテナンスできないものを導入するのは問題だ。
あくまでも Rust の急進的導入をしたいというなら fork するくらいの気概を見せて欲しいところ。
2024/08/31(土) 08:38:08.89ID:CwbqwO1Y
>>527
既にRustのコードが入っている現実を無視して妄想が激しいな
2024/08/31(土) 09:01:31.35ID:ppLeuuZs
Rustのコード入れたくないまでならまだ分かるが
(Rustドライバ導入の前段階として)既存のサブシステムのバグを直したいと言ったら
今あるドライバではそのバグは踏んでないから直す必要なし、って言われたりしてるらしく
さすがに自分のCのコードのクオリティくらいちゃんと上げろよ、とは思う
2024/08/31(土) 09:13:30.90ID:TZjbwynp
考え方が違うんだよね
C/C++では現在のコードの使い方の範囲内では(ギリギリ)バグを回避できているので大丈夫と考える
そして後に機能追加や改修が入ったときにそのギリギリのところを踏んでしまって致命的バグが露呈する
このダメな考えな人がまだ多くいる
531デフォルトの名無しさん
垢版 |
2024/08/31(土) 09:22:22.01ID:oPSFGvVw
RustほどC++と相性の悪い言語はないね。
C++との相性を考えるならNimの方が良い。
勘違いしないで欲しいんだがRustとCの相性はとても良い。
532デフォルトの名無しさん
垢版 |
2024/08/31(土) 09:25:59.57ID:oPSFGvVw
>>529
>今あるドライバではそのバグは踏んでないから直す必要なし、って言われたり

これは酷い
MicsoSoftを嗤えないな
533デフォルトの名無しさん
垢版 |
2024/08/31(土) 09:27:58.78ID:oPSFGvVw
>>530
>そのギリギリのところを踏んでしまって

きみも考え方が間違っている
昔ながらのカーネル開発者は賢いからCで拡張してもそのバグを踏まない自信があるんだよ
(それが良いか悪いかは別として)
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を翻訳するには言語あるいはライブラリによるサポートが必要
536デフォルトの名無しさん
垢版 |
2024/08/31(土) 09:57:33.39ID:siamFKDm
「RustとC++は相性が悪い」というよりも「C++と相性が良いのはNimなどに限られる」という感じじゃないかと思う
そういやC++の後継を目指してたCarbonってどうなってるんだろ
2024/08/31(土) 10:01:46.87ID:gxBoDZic
Nimのような弱小言語を使う人は今後も極少数に限られるから意味がないよな
2024/08/31(土) 10:04:38.88ID:IaoAItNz
C++のメモリ管理とNimのメモリ管理はは全く異なっている
相性がいいなんて話はまやかし
539デフォルトの名無しさん
垢版 |
2024/08/31(土) 10:08:52.28ID:oPSFGvVw
>RustとPythonを連携させるPyO3

これはC++要素無いだろ
540デフォルトの名無しさん
垢版 |
2024/08/31(土) 10:28:40.41ID:siamFKDm
>>539
C++に限った話ではなく、クラスやメソッドといった概念を異なる言語間 (ここではRustとPython) でうまく翻訳できてる例として書いた

他だと、例えばC#とRustを連携させる csbindgen はFFIをしやすくはしてくれるけど、メソッド付きのクラスなどは作れずAPIはほぼCになるといった感じ
2024/08/31(土) 10:40:19.97ID:lPS1m7oR
>>530
まだ顕在化していないものに対してあれこれ考えるのは
難しいことができる「才能」とは違った「センス」が必要なんだよね

そして学校でも企業でも才能で判断することはやっているけど
センスに関しては無頓着というか、センスに気づくにもセンスが要るということで
そもそもそういうものがあることを分かっていない人が多い
542デフォルトの名無しさん
垢版 |
2024/08/31(土) 11:37:38.42ID:oPSFGvVw
>>540
>クラスやメソッドといった概念を異なる言語間 (ここではRustとPython) でうまく翻訳

きみは何も判ってないな
2024/08/31(土) 12:39:33.76ID:e6lCluh3
カーネルメンテナーの中にはここにいるような
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のオブジェクトに返還してるので、そこそこうまく翻訳できてると言って良いんじゃない?
2024/08/31(土) 14:19:45.17ID:v65y/3af
カーネルデベロッパはRustよりZigが好きだと思うよ
ZigこそCの置き換えを担う
RustはC++の置き換えとして役割を全うしてくれ
2024/08/31(土) 14:34:53.19ID:69SUV3M5
企業や国防総省や各ソフトウェアプロジェクト等が解決したい、人間の手に依らない、様々な安全性の保証を、Zigは解決しないことが、企業スポンサーの量質や、政府による支持の差となっています。
2024/08/31(土) 16:51:39.82ID:fbG74reB
言語一決定戦
549デフォルトの名無しさん
垢版 |
2024/08/31(土) 18:46:49.67ID:siamFKDm
Rustのライブラリまわりの現況ってどう思ってる?
プロジェクトでライブラリを使うと、他の言語に比べて依存ライブラリが多くなりがち&1.0未満のライブラリが多いな気がしてるけど、みんな気にしないもの?
2024/08/31(土) 19:46:25.63ID:E1cdB3xT
>RustはC++の置き換えとして

まだこんなこと言ってる馬鹿がいるのか
2024/08/31(土) 19:47:21.29ID:E1cdB3xT
>>549
cratesは破綻してる
2024/08/31(土) 20:11:59.68ID:Or5Sc8N3
>>549
考え方を180度変えるとわかりやすい
クレートは可能ならば小さければ小さいほど良い
並行してコンパイルできるメリットがあるだけでなく
重複コードもなるべく無くせるメリットもある
特にunsafeを含む基礎的な汎用な機能の場合に
大きなライブラリにその同じ機能を持つコードが各々に別々に入ると
unsafeの監視も各々で個別に無駄に重複して行う必要となってしまう
この点でも小さく分けたほうが望ましい
553デフォルトの名無しさん
垢版 |
2024/08/31(土) 20:44:50.30ID:S/IPQmeQ
メンテナンスコストは増えると思う
Outdatedになってないかチェックしたり、ライブラリ間の依存のせいでバージョン上げられなかったり
2024/08/31(土) 20:53:33.20ID:LXO9pQJ0
え、ここそのレベルの方々だったんだ…
ドン引き
2024/08/31(土) 21:35:41.49ID:aMsyxey6
>>553
それって何に比べての話?
PythonでもGoでも結局標準ライブラリだけで全部できるわけではないし
どのみちそのあたりのコストはかかるから大差ないと思うけど
556デフォルトの名無しさん
垢版 |
2024/09/01(日) 10:01:28.26ID:ydrH9psJ
依存の数ならRustは多い方じゃない?
tokioあたりを入れるとそれだけで数十のライブラリに依存するし
Goは知らないけど、Pythonはそこまで多くならないと思う

JSも依存が多くなりがちで、依存パッケージに脆弱性やマルウェアが仕込まれることが時折問題になってるけど、Rust界隈だとその辺りの問題はどう認識されてるのかなと思った次第です
2024/09/01(日) 10:17:26.39ID:zf7mJz3x
breaking change と semver violation の話じゃないかなぁ < メンテナンスコスト
今はツールができて 少しはましとはいえ
メチャクチャ難しい
2024/09/01(日) 10:30:23.05ID:kOiIMmbX
数個〜20個程度の依存と100〜200個の依存と同じわけないじゃん
それに鉄板ライブラリと考えられてたものでも2〜3年するとメンテ状況が怪しくなったり無駄な破壊的変更がされたりするのが結構あるから他の言語と比べるとはるかに手間がかかるよ
現段階ではRustの最大の弱点
弱点以上にメリットを見出せないなら本格的に使うのはお勧めしない
2024/09/01(日) 10:34:17.81ID:t3ZzK7/4
実体験として、PythonやDartでは依存関係地獄にハマって解決に苦労したことあるけど
Rustは今のところないな
2024/09/01(日) 10:48:37.08ID:+SJIq2Go
>>558
その説明だとnodejsなんか使い物にならないのでは
561デフォルトの名無しさん
垢版 |
2024/09/01(日) 10:50:08.09ID:F+GfMvv5
chronoなんかも未だに1.0未満だし2年ほどメンテナンス停止にしてたことがあるしな (今は再開してる)
時刻やタイムゾーンを扱いたい場面は多いだろうから、こういうのは安定化または標準ライブラリでサポートして欲しいとは思う
2024/09/01(日) 11:09:10.42ID:AB63LC10
別に致命的な脆弱性でもなければ無理に上げる必要もないしな
普段はdependabotに自動で上げさせといて、
破壊的変更があるやつは年1回くらいで追従する感じにしてるけど
特に手間と思ったこともないな
2024/09/01(日) 11:20:43.92ID:JCWqhatm
>>561
バージョン番号1.0未満かどうかという表面上のどうでもいい問題にこだわるのはおかしい
chronoのようなほとんどのプログラムで使われない機能を標準ライブラリに入れようという提案は感覚が変
あとRustで安定化とはstableかexperimentalかの区別でstableになることだよね
2024/09/01(日) 11:30:01.13ID:mI2+lAFs
表面上って…
565デフォルトの名無しさん
垢版 |
2024/09/01(日) 11:33:21.84ID:F+GfMvv5
APIの破壊的変更を今後行う可能性があるかの表明にはなるだろ
1.0であれば、少なくともメジャーバージョンが変わらないうちは後方互換性を維持するという意思表示になる
仕組みで防いでるわけではないし、「共通認識としてそう受け取られる」という話には過ぎないけど
2024/09/01(日) 11:50:19.16ID:wKqEGZJE
>chronoのようなほとんどのプログラムで使われない機能を
こんなこと書くやつは何書いても信用度ゼロ
”偽情報注意!”ってやつだな
2024/09/01(日) 12:08:43.54ID:cwes3csq
chronoなんて日時を扱わない限り使うことないだろ
特定の分野だと必須だろうが
Rustが使われる分野は広いからね
2024/09/01(日) 12:21:28.53ID:Coh3zEx3
>>565
いや、ならんでしょ
結局破壊的変更があれば2.0になるわけで、実際5.0とか10.0みたいなのもあるし
まぁこの作者が1.0を宣言するんならもう十分安定してるんだろう、みたいなのはあるけどな
そういう背景情報なしなら1.0と0.1の違いは特にないと思うよ
2024/09/01(日) 12:26:37.18ID:ySw/MmvM
バージョン0.x.yは cargo tree | grep v0 で確認できて
大量の基盤ライブラリが見つかるけどそれで困ったことはないな

>>565
そういう守るべきマナーとしては
0.x指定しておけば破壊的変更はないとされているので大丈夫
クレイトを作ってる側は破壊的変更があればx←x+1と上げるため
2024/09/01(日) 12:51:19.19ID:wKqEGZJE
>>567
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:y1BosOiy
>>558
+1

問題無いと主張してる人は
まともに開発したこと無いんだろうな
573デフォルトの名無しさん
垢版 |
2024/09/01(日) 13:06:30.98ID:y1BosOiy
>>565
>仕組みで防いでるわけではない

これなんよね
メモリ脆弱性は言語本体で管理してて仕組みで防いでるのを売りにしてるんだから
パッケージマネージャも仕組みで防げと思う
574デフォルトの名無しさん
垢版 |
2024/09/01(日) 13:13:51.37ID:ydrH9psJ
>>571
それは自分のプロジェクト (Linux) におけるバージョン番号の意味を述べてるもので、ソフトウェアライブラリ一般を指して言ったものではなくない?
2024/09/01(日) 13:26:50.54ID:t3ZzK7/4
v2.0が出た後も末永くv1.xブランチでメンテされ続けるなら意味あるけど
そんなの全く期待できないよね
576デフォルトの名無しさん
垢版 |
2024/09/01(日) 13:29:19.13ID:ydrH9psJ
乱数生成ですら外部クレートが必要になるんだから、そういう言語なんだと割り切ってはいるけど
2024/09/01(日) 13:34:18.52ID:NN/ZIFle
>>573
インターフェイスの互換性はある程度は機械的検証が出来るかもしれないけど挙動の互換性まで検証するのは非現実的だろ。
バグで制約が緩かったのを修正した (ドキュメント通りに使っていれば問題ない) みたいなケースだと機械的には非互換に見えることもあるだろうし。
そこらへんは使う側でバージョンの固定をするしか仕方ない。
いや、もちろん仕組みを構築できるならそのほうがいいよ。 でも、出来ないだろ? って話でさ。
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);
579デフォルトの名無しさん
垢版 |
2024/09/01(日) 14:22:12.72ID:MnUgJTxK
>>576
playgorund とか paiza とかで use crate 出来ないのがあると面倒やね
580デフォルトの名無しさん
垢版 |
2024/09/01(日) 14:23:04.37ID:ydrH9psJ
>>578
盲点だった
ハッシュマップが乱数を使うのは言われてみればその通りだ
けどこれってHashMapのための機能だし、「この方法でも乱数を得られる」であって、乱数をつくるために提供されてるものではなくない?

英語でも調べたけど、Rustで乱数を生成する方法を調べたらrandクレートの方が最初にヒットする
2024/09/01(日) 14:49:06.86ID:N2jhi4ch
>>580
いずれも環境に応じて最終的にはgetrandomシステムコールを呼んだり/dev/urandomを読んだりするだけだから機能としては同じだね
何度も使うならそれをシード値としてxorshiftなどするだけなのでstdだけで使えるメリットは大きいよ
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を使う意味がなくなると思うのですが、このベンチマークは本当なのでしょうか?
2024/09/01(日) 16:37:38.74ID:ViuTOdnl
Cより何倍も速い詐欺の話は他のスレでやろう
Rustと関係ないので
2024/09/01(日) 16:58:53.35ID:FX04qzI+
Zigは1.0になってから出直せ!
crateはpre-1.0でもそういうもんなのでヨシ!

はーくだらね
586デフォルトの名無しさん
垢版 |
2024/09/01(日) 17:07:22.02ID:ydrH9psJ
言語とライブラリは流石に違わないか
ライブラリは開発止まっても同分野の別のライブラリがあればそれに差し替えられる (最悪、元のライブラリをフォークしても良い) けど、言語仕様はそうもいかないだろ
2024/09/01(日) 17:08:31.34ID:ROff46JY
比較の対象にすらならない
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は言語選択時の比較対象として関係あるだろ
2024/09/01(日) 18:02:28.26ID:YFaA0adv
何でもできるC言語より速いと主張しだしたらそれは変な宗教だから相手にしてはダメ
しかもNimはC言語へトランスパイルされるんだろw
2024/09/01(日) 18:08:55.61ID:NN/ZIFle
雑に書いて十分に速いかってのと専門家が気合いを入れてチューニングをすれば最強に速いかってのは違う指標だろうし、仮に速さを比べるにしても想定を合わせないと意味がないよ。
2024/09/01(日) 18:09:09.43ID:B8TxC8Ku
CへトランスパイルされるならCより速くなってても不思議じゃないな
2024/09/01(日) 18:15:39.95ID:tFzE2nE4
Rustは特殊なケースを持ち出さなくても
実際の実用ケースのほとんどで、Cと同じ速さ、もしくは、ほぼ同じ速さで、凝ったことをせずとも書けるから
IT業界が挙ってRustを支持した
593デフォルトの名無しさん
垢版 |
2024/09/01(日) 18:34:18.72ID:ydrH9psJ
知らないから純粋な質問なんだけどnimって並行処理の安全性に強みはあるの?
個人的に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()
2024/09/01(日) 20:00:37.37ID:9GOpEruV
はいはい
C/C++/Rustに勝ってから出直してきてね
スレ荒らしはダメよ
2024/09/01(日) 20:08:43.57ID:ZXrp9Cnz
わざわざ他言語のスレに来て噛み付かなきゃいけない時点で負けていると宣言しているようなもの
その言語のスレを盛況にすればいいのに
598デフォルトの名無しさん
垢版 |
2024/09/01(日) 20:08:50.47ID:f0nFMo6o
>>596
はあ?日本語嫁内の?
>>594より速いベンチマークで証明すればいいだけだろ
2024/09/01(日) 20:12:17.24ID:pPmOnqPH
Cより速い言語が本当に出現したのならば世界的なニュースになるのでここを荒らす必要なし
600デフォルトの名無しさん
垢版 |
2024/09/01(日) 20:18:33.83ID:f0nFMo6o
>>599
証明できないから荒らし判定してるだけだろ

証明できないなら証明できないって正直にRustはNim2.0より劣る言語だと認めればいいだけだろ
2024/09/01(日) 20:34:03.89ID:J5FWiNml
CスレやC++スレへ行ってくればいいんじゃね
相手にしてくれるかもよ
2024/09/01(日) 20:36:25.69ID:FX04qzI+
RustスレでRust宣伝とかいう意味のないことやり続けた報い
603デフォルトの名無しさん
垢版 |
2024/09/01(日) 20:42:24.60ID:ydrH9psJ
煽りたいだけなら他言語のコードも自分で書いてベンチマークを個人ブログまたはRedditかQiitaかZennに書けばよくない?
>>583はリンク先が無いし >>595 はCPU性能どころか入力の数すら書いてないから、誰かが他の言語で書いたとしても比較しようがない
604デフォルトの名無しさん
垢版 |
2024/09/01(日) 20:43:24.75ID:f0nFMo6o
このスレはNim2.0のORCで明示的にオブジェクトプールを使ったプログラミングのベンチマークより速い事を証明できないカスばっかだな
605デフォルトの名無しさん
垢版 |
2024/09/01(日) 20:47:46.74ID:f0nFMo6o
>>603
https://zenn.dev/dumblepy/articles/af2b2b9f8fd890

Website https://nim-lang.org/
Forum https://forum.nim-lang.org/
Github https://github.com/nim-lang/Nim
IRC https://webchat.freenode.net/?channels=nim
2024/09/01(日) 20:49:35.02ID:/rP62rMk
検索してみたがNim 2.0がCより速いという記事が一つも見つからなかったのでガセっぽい
記事が出るまでこのお話はお預けってことで
607デフォルトの名無しさん
垢版 |
2024/09/01(日) 20:51:46.74ID:f0nFMo6o
>>603
https://youtu.be/yA32Wxl59wo

https://github.com/Araq/fosdem2020
2024/09/01(日) 20:53:27.80ID:Coh3zEx3
>>605
純粋に疑問なんだけどそのページのどこをみてCの2倍速いって言ってるの?
単にNim同士でメモリ管理をいろいろ変えたら速くなったとしか書かれていないと思うんだけど
609デフォルトの名無しさん
垢版 |
2024/09/01(日) 21:03:34.87ID:ydrH9psJ
Nimの過去のものより速くなったとしか読めないし
補足として貼ってるリンクもベンチマークじゃなくて言語自体の説明や公式ページだし
自分で手を動かさずにその記事だけ読んでCより速いと言うのは妄想レベルでは
610デフォルトの名無しさん
垢版 |
2024/09/01(日) 21:14:25.35ID:f0nFMo6o
>>608
NimはCのソースコード吐けるからから、Nimの手動メモリ管理はCの手動メモリ管理と同じとして、Nim2.0のORCで明示的にオブジェクトプールを使ったプログラミングと比較した場合のベンチマークが2倍以上速くなってるからCより速いと言ってる

それが間違ってると主張したいのであれば、想定を合わせるためにCでもRustでもどっちでもいいから、さっきから何度も言ってるように速いベンチマークで証明すればいいだけだろ
2024/09/01(日) 21:17:33.09ID:Coh3zEx3
>>610
それはCでもオブジェクトプール使えば2倍速くなるのでは?
オブジェクトプール版のNimから生成したCはまさにそういうコードだと思うけど
612デフォルトの名無しさん
垢版 |
2024/09/01(日) 21:24:18.89ID:MVARTL7s
言語の差でなくメモリ管理方式の差では
ライブラリにはなるけど同様のものはRustにもあるし大して変わらなさそう
2024/09/01(日) 21:27:22.64ID:0f8jKoK3
コーディングもベンチもせずに
NimはCより2倍速いと主張していて
心の病をうたがってしまう
2024/09/01(日) 21:38:54.81ID:pUggxEL4
そもそもNimがCより速いっていうのが原理的におかしいんだよ…
Nimの最速実装には必ずそこから生成されたCが存在するわけで
それとも生成されたCはCとは認めない、みたいな話なんだろうか
615デフォルトの名無しさん
垢版 |
2024/09/01(日) 21:48:04.56ID:MVARTL7s
方式の違いを言語の差と思ってるなら
例えば誰かがコストの大きい計算をスレッドプールで高速化した実装を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でもどっちでもいいから、速いベンチマークで証明すればいいだけだろ
2024/09/01(日) 21:56:31.28ID:0f8jKoK3
NimはCより2倍速いと主張している人がまずはその比較コードとベンチ結果を示す義務がありますよ
618デフォルトの名無しさん
垢版 |
2024/09/01(日) 22:00:47.66ID:ydrH9psJ
主張するだけならどの言語でもできますがな
PythonはCよりも速い、違うというならお前らがコードを書いて証明しろ
みたいなのは面倒くさすぎて誰も相手にせんだろ
619デフォルトの名無しさん
垢版 |
2024/09/01(日) 22:04:17.16ID:f0nFMo6o
>>617
https://github.com/Araq/fosdem2020
2024/09/01(日) 22:06:25.77ID:pUggxEL4
>>616
別にCでも自分でオブジェクトプール実装するなり既存のarena allocator使えばいいじゃん
まぁ言語組み込みであることで「初心者が何の最適化もしないコードを書いたときにNimが最速」となる可能性はあると思うけど、それならそのように主張してくれ
2024/09/01(日) 22:14:20.69ID:2CzFvl+J
>>616
>Cは手動メモリ管理しかできないオブジェクトプールの機能はないだろ
はい、ここ笑うところですよ〜
2024/09/01(日) 22:18:07.82ID:0f8jKoK3
>>619
2020年のNimのコードしか見当たりませんね
Cのコードとベンチ結果はどこですか
2024/09/01(日) 22:19:40.68ID:B8TxC8Ku
CとC++の違いも判らない人が主張してもな
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/
2024/09/02(月) 11:00:21.39ID:bCUpdzqg
まあ確かに純粋なCとの置き換えなら別にCでええやんってなるわな
2024/09/02(月) 12:43:05.01ID:wq6C4ZI5
>>626
そんなあなたにZigがおすすめ
comptimeやdeferが便利です
2024/09/02(月) 12:57:03.37ID:o+5p2SR6
C++ に慣れてると後始末をデストラクタの中に隠蔽できてないのは抽象化の失敗だという感覚があるから defer には良い印象がない。
2024/09/02(月) 16:42:30.80ID:ctZgLyfU
RAIIがない欠陥言語たちはdeferとかwithとかusingとか毎回書かされて汚くなる
630デフォルトの名無しさん
垢版 |
2024/09/02(月) 16:51:36.63ID:FQfjCQIj
別にRAIIが絶対的な正解というわけではないので
そこに自由度を持たせるにはその自由度を制御するための一言が必要になるのは当然のこと
2024/09/02(月) 16:52:53.11ID:13HDFjot
>>628
それならRust使えばいいっしょ
C++を置き換えるものがRust、
Cを置き換えるものがZigである
2024/09/02(月) 17:01:06.29ID:C3j8rcv1
clang ccは最適化フラグが沢山あるし、色々やればNimと同程度の速度くらい出せるんじゃないの?知らんけど
2024/09/02(月) 17:19:45.07ID:o+5p2SR6
>>631
defer は抽象化の失敗の表れだとは思うが抽象化をそれほど頑張らない方針を悪いと思ってるわけじゃないよ。
C++ が Better C としての用途でも超強力な選択肢として馴染みがあるからあらためて他の選択肢を使いたい気持ちがあまりないという程度の話。
634デフォルトの名無しさん
垢版 |
2024/09/02(月) 17:34:21.85ID:4iRl8tQB
C++がBetter Cとして馴染みがあるから他の選択肢を使いたい気持ちがない人、弊社には来て欲しくねえな
馬鹿か、すごい賢くて賢い人としか働けないか、人と働いたことないかの三択だ
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
637デフォルトの名無しさん
垢版 |
2024/09/02(月) 18:32:02.91ID:VEiLzJpt
補足
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倍以上速くできる
2024/09/02(月) 18:51:06.06ID:x+sFU8Hh
>>632
NimがCより速いというガセネタに釣られるなよ
キチガイを招いただろ
640デフォルトの名無しさん
垢版 |
2024/09/02(月) 19:04:49.90ID:VEiLzJpt
>>639
Nim言語開発者のORCで明示的にオブジェクトプールを使ったプログラミングのベンチマークがガセだと思うなら、それよりも速いベンチマークで証明すればいいだけだろ
2024/09/02(月) 19:17:59.50ID:CQW1lAEf
Nimの方が速いというコード比較ベンチが一つも存在しないから
現状ではNimが速いは嘘と判断するしかないね
642デフォルトの名無しさん
垢版 |
2024/09/02(月) 23:35:39.51ID:Azu0Ww0Z
よく見たら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だけ
644デフォルトの名無しさん
垢版 |
2024/09/03(火) 00:13:59.39ID:kXSWNX4e
人間がCの手動メモリ管理したベンチマークより、Nim2.0は循環参照が大量に使用されていればいればいるほどムーブセマンティクスとオブジェクトプールでベンチマークが速くなる

だからNim2.0は循環参照が大量に使用されていない通常の短いコードの言語間ベンチマーク比較だとÇと変わらなくなる
2024/09/03(火) 00:22:16.43ID:SddP/phw
>>643
嘘つきあかんよ
示された>>605の記事でオブジェクトプールはNimの機能ではなくNimで自作していてコードも示されている
しかも記事の中でオブジェクトプールとはC++でのArena Allocationのことだと解説している

このアリーナ方式(=オブジェクトプール方式)を用いるとメモリ割り当て解放のオーバーヘッドが減るため速くなることは昔から知られている
もちろんRustでもアリーナの使用は盛んに行われておりこのスレで「Arena」で検索すれば8レスの書き込みがある
2024/09/03(火) 01:11:48.95ID:1HHGF7Zl
ここ何のスレでしたっけ?
2024/09/03(火) 01:53:59.18ID:Dbzwi48i
次世代言語スレじゃない?
2024/09/03(火) 06:26:51.96ID:q/sgL6ap
最強言語を決めようスレ
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だけって事で異論はない?
651デフォルトの名無しさん
垢版 |
2024/09/03(火) 07:47:47.67ID:kXSWNX4e
訂正(オブジェクトプール → ムーブセマンティクス)
じゃあNim言語開発者が、RustやC++、そしてSwiftがどのようにメモリ管理を行っているかを調べ、良い部分を再組み合わせたムーブセマンティクスは他の言語にあるの?

無いなら、現時点でRustやC++、そしてSwiftがどのようにメモリ管理を行っているかを調べ、良い部分を再組み合わせたムーブセマンティクスはを導入してるのはNim2.0だけって事で異論はない?
2024/09/03(火) 07:52:41.59ID:e/LVUItZ
アロケータを細かく制御したいなら断然Zigだろ
Arena Allocatorももちろん用意されてるし、他にも選択肢がある
2024/09/03(火) 07:59:06.62ID:32lfd5Tu
>>649
普通オブジェクトプールをキャッシュとは言わないと思うけど
まぁ挙動としてはメモリ領域のキャッシュみたいなイメージでいいかもしれない
小領域の確保と解放が繰り返されるときにキャッシュすることで実際のmalloc/free(あるいはGC)呼び出し回数を減らすためのもの
2024/09/03(火) 08:03:36.62ID:LULqlZCj
来年にはZigがメジャーバージョン1到達見込みみたいだし期待
2024/09/03(火) 08:04:09.12ID:UM5ITwja
Zigはこのまま未完成に終わって極少数の趣味人にしか使われないでしょう
2024/09/03(火) 10:06:28.79ID:+fPFl5kU
なんかZigファン多いみたいだから、単独スレ立てて議論したら?
ここはRustスレだから、ただ単にZigはすごいんだあって宣伝するだけなのはつまらんぞ
2024/09/03(火) 10:17:54.29ID:Dbzwi48i
C++とかGoとかNimとかの他所様のスレにRustの宣伝を書き散らしてたカスもいたわけだし
今更そんなこと言っても誰も相手にせんだろう
2024/09/03(火) 10:20:47.01ID:e/LVUItZ
アロケータ周りの不自由さはRustの代表的なウィークポイントだから
Zigと比較するのは有意義だと思うよ

Rust for Linuxで不備を指摘されて、unstable featuresとして整備し始めてるのが現状でしょ?
2024/09/03(火) 10:30:58.77ID:oCyo/VGZ
入院が安定化されればクリアする話だから年内か年明けにでも解決
2024/09/03(火) 13:17:35.66ID:q/sgL6ap
スレ違いなのに書き込んでるやつは頭悪そう
2024/09/03(火) 16:24:34.66ID:/Ve5otW6
>>631
>C++を置き換えるものがRust、

doubt
662デフォルトの名無しさん
垢版 |
2024/09/03(火) 16:46:40.15ID:/Ve5otW6
>>657
いたね
ほんとめいわく
世界中のケンタという名のプログラマを敵に回しただろう
663デフォルトの名無しさん
垢版 |
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倍以上速くできる
664デフォルトの名無しさん
垢版 |
2024/09/03(火) 20:29:12.43ID:70res71t
補足
NimはCのソースコード吐けるからから、Nimの手動メモリ管理はCの手動メモリ管理と同じとしてベンチマーク計測してる
https://github.com/Araq/fosdem2020
https://zenn.dev/dum...icles/af2b2b9f8fd890
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倍以上向上し、メモリ消費もほぼ同じです。
2024/09/03(火) 20:59:57.60ID:vYs0R68S
それはNim同士の別方式の比較
他の言語と比較しないと意味がないね
もちろん他の言語で書いても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
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.
(略)
2024/09/04(水) 00:24:08.00ID:WSrhyWiD
なんでstdで公開してるんだか知らんが、rustc開発陣には面白いこと考えて実装してしまう人がいるもんだね
https://doc.rust-lang.org/std/intrinsics/mir/index.html
2024/09/04(水) 06:25:46.42ID:L9jt2Atz
>>669
https://zenn.dev/ekusiadadus/articles/bench-go-node-rust-zig

denoって遅いんだな
2024/09/04(水) 06:51:22.28ID:jUst+7wI
>>672
バカなベンチマーク記事の典型例
Goはマルチスレッドをフルに使っていて8倍速い結果
2024/09/04(水) 08:21:33.86ID:YIdoJmrM
こっちのが各種負荷が分かりやすい
youtu.be/2hWfLiRGaNM
675デフォルトの名無しさん
垢版 |
2024/09/04(水) 13:53:11.19ID:gtSSINdp
どっちのロゴもださい
2024/09/04(水) 18:38:20.03ID:LischCmo
いくつか記事出てるけど、Rust for Linuxは失敗に終わったみたいだね
2024/09/04(水) 18:53:43.06ID:kEJZEp+0
>>676
既に次々とRustコードが入っていってる
一方でRustを理解できない人が抵抗勢力になっていてLinus氏が釘をさした形
2024/09/04(水) 20:38:51.07ID:WSrhyWiD
具体的にLinuxの何がRustで書かれてるんだっけか
2024/09/04(水) 20:51:35.06ID:pD6zdA4Y
https://github.com/torvalds/linux

カーネルにはまだ何も入ってなさそう
2024/09/04(水) 21:35:17.87ID:WSrhyWiD
だよね
知ってた
2024/09/04(水) 21:39:00.59ID:DkGnoe2A
抵抗勢力のクズを一掃できないとLinuxの敗北の始まりになるかもな
682デフォルトの名無しさん
垢版 |
2024/09/04(水) 22:30:46.44ID:kVp+OLCr
何に敗北するんだろうか
Rust製でもっと高信頼性かつ高機能なOSをどこかが作ってたりするの?
2024/09/05(木) 00:00:09.27ID:zViJFvGA
linux はバイナリ互換性を大事にする。
(Windows ほどではないけど。)
ドキュメントに書いてない仕様外の挙動であってもそれを変更して動かなくなるアプリケーションがあってはならないというのが基本指針。
コンパイラの挙動とも協調して細部をコントロールしてる工芸品だ。
この状態を維持したまま Rust を導入するのは無理だよ。
比較的疎結合な一部のモジュールはなんとかなるかもしれんがあえてやるには時期尚早。
2024/09/05(木) 00:04:52.28ID:clMGp1Hb
それバイナリ互換と関係ない話
2024/09/05(木) 00:33:15.38ID:9Qm4YGNu
>>683
それはカーネル外と際の話
さして言語は関係ない
実行バイナリファイル形式は同じだからRustで書かれたものも動いているしCで書かれたものと混在リンクしても動いてる
バイナリインタフェースのうちシステムコールについてはlibcそのまま用いている
そのためためRustでもレジスタの使用方法積み方全て同じ
実行バイナリへの混在リンクの関数呼び出しについてもCと同じくレジスタ割り当てや退避を行うためこれも同じ
2024/09/05(木) 01:05:51.55ID:hShQUNIv
カーネルとモジュールの間ではバイナリ互換性の問題は発生しないとでも言うつもりなんだろうか
2024/09/05(木) 01:54:33.69ID:3g7CnUji
>>686
カーネルモジュールはRustで書いても問題なく動いている
興味があるなら誰でも自由に書くことができてローカルにモジュールロードもできるのでどうぞ
2024/09/05(木) 05:13:44.23ID:e3jYYrt5
>>679
unsafeを使うときには必ずそのすぐ上に // SAFETY: コメントで説明を書かないといけない
ってコーディングルールなんだね
Documentation/rust/coding-guidelines.rst
2024/09/05(木) 07:32:51.81ID:YoL+MCk6
>>682
なぜかそれはしない
2024/09/05(木) 08:27:51.37ID:2XHFyhSG
小さいものはある
しかし巨大なものを置き換えるにはコストがかかる
特に安定している部分はメリットがない
一方でデバイスドライバなど次々と新たなコードが実装されていってる部分はメリットがある
そのためカーネル本体ではなく新たなモジュールからRust化されつつある
691デフォルトの名無しさん
垢版 |
2024/09/05(木) 09:24:04.12ID:NUwXZfpl
>>677
判らないから反対してるのか
判ってるけど入れたくないから反対してるのか
どっちだろうね(どっちもあると思う)
692デフォルトの名無しさん
垢版 |
2024/09/05(木) 09:29:32.76ID:NUwXZfpl
>ドキュメントに書いてない仕様外の挙動であってもそれを変更して動かなくなる
>アプリケーションがあってはならないというのが基本指針。

そういう規定されていない挙動がセキュリティホールになるんじゃないの
アプリじゃなくてウィルスやワームなら動かなくなっても良いという考えは感心しない
(いいけどさ)
2024/09/05(木) 09:53:36.80ID:4TgHYLLA
Windowsアーキテクチャを捨てる時rustでスクラッチから書き直すんじゃね?

もう誰かが実験的に始めてるかも知れないけど
2024/09/05(木) 10:28:42.83ID:e3jYYrt5
Windowsカーネルにはもう既にRustで書かれたモジュールが入ってるぞ
695デフォルトの名無しさん
垢版 |
2024/09/05(木) 11:26:57.99ID:MrUlEodS
>>691
結局、たとえCとRustが相性良いとか言っても現実は
Cプログラマ「Cで十分。はい論破!」
やからな
696デフォルトの名無しさん
垢版 |
2024/09/05(木) 11:28:29.71ID:ucx37QCe
linuxについてもリーナスはrust導入に期待してるからね。
少しずつだけど前進はしてる。けどrust推進者がメンタルやられて後退もしてる。
リーナスも老害には釘さしてる。
2024/09/05(木) 11:43:44.01ID:KbFebBvQ
rust製OSといえばRedox
https://redox-os.org/
2024/09/05(木) 12:01:55.65ID:FfD21zGl
RedoxはMITライセンスだから、Redox開発者&コントリビュータはLinuxのGNUソースを一切見ることが出来ないね
2024/09/05(木) 12:03:41.73ID:zViJFvGA
たとえばヌル終端した文字列を Rust に持ってくるのが面倒くさい (かといって素のポインタで扱うのは Rust の良さが活きない) とかそういう些細な不整合の積み重ねがある。
よく分離されたモジュールの間で通信する分にはたいした話じゃないが一体の塊の中で内容が同じ異なるオブジェクトがあって頻繁に変換するなんてのは論外だ。
カーネルが Rust に配慮するよりは libc みたいなポジションの Rust 版みたいなやつがあればいいんでないの。
700デフォルトの名無しさん
垢版 |
2024/09/05(木) 12:11:34.88ID:ucx37QCe
>>698
?何で見ることできない?
2024/09/05(木) 12:11:54.33ID:kbcpGSLl
そう、それもGPLな
Redoxに流用すなると、RedoxもGPL
Redoxソースを見たらそれもGPL
2024/09/05(木) 12:14:00.92ID:kbcpGSLl
>>700
GPL/GPLAライセンスを舐めたら痛い目に遭う
2024/09/05(木) 14:03:52.89ID:8gaPnIRW
ライセンスはApache-2.0 licenseしか信じてないわ
704デフォルトの名無しさん
垢版 |
2024/09/05(木) 15:24:16.99ID:ucx37QCe
>>702
それは 見ることできない とは別問題だよ
2024/09/05(木) 15:28:43.04ID:QwnqngeR
>>699
ヌル終端文字列の一部を切り取ったヌル終端文字列はたいていヒープに割り当てられ
たいていリファレンスカウントまたはマークアンドスイープの対象になる

ヌル終端しない自由があればヒープがいらなくなる
2024/09/05(木) 15:38:39.94ID:Vdc38OeX
やばい、やばい、別言語に書き換えたらGPLロンダリング出来ると本気で思ってそうだな
会社ぐるみで参考とか調査と称してGPLコード内の処理内容をパクってそう

新興OSがLinuxコードをパクって無いと主張するのはダウト
707デフォルトの名無しさん
垢版 |
2024/09/05(木) 16:03:51.09ID:eP4hkN3V
GPLの力をそこまで拡大するのはカスなんだよな
そこまでやるなら裁判でもなんでもしてGPLごと破壊していくべき
2024/09/05(木) 16:10:43.66ID:clMGp1Hb
そこまで気にするならGPLに限らず他人の
著作物見ると危険だから
709デフォルトの名無しさん
垢版 |
2024/09/05(木) 16:22:33.75ID:CfpHO291
「GPLのソースをコピーして使ったソースは、ソース公開の義務が生じ、それもGPLになる」
というものだから、目で見て脳で記憶してそっくりに真似た場合はコピーしたわけではないから
GPL感染しないかも。
そもそも、目で見たものを再現したら、駄目、なんて理屈、特許も取れてないのに主張できる
ものなのかいな。絵とか文章をそのままコピーするのは著作権違反だけども、目で見て真似た
だけでは著作権違反ではなかろう。ミッキーマウスみたいなのは駄目なんだろうけども。
GPLは、ライセンス自体が法解釈的に「無効」かも知れない。
2024/09/05(木) 16:26:01.06ID:CfpHO291
memcpyのx86用のアセンブリコードがあったとして、それ以上ほぼ高速化できない場合が有るから、
それを真似てはいけないと言うのは、技術の進歩を阻害してしまうだろう。
それとは異なるが速度は同じ、というようなものを考え出す苦労がGPLのせいで生まれる
ことになり、それに時間をとられて人類は損失を被ることになる。
2024/09/05(木) 16:29:22.37ID:CfpHO291
そもそも、人類は技術を少しずつ改良している。memcpyに関しても基本的にそう。
しかも、ハーバード、スタンフォード、MITなどの最高レベルに優秀な人が研究目的
だからライセンスを気にせずにGPLのものを改良を重ね、最良に近いものを作り出して
いることがある。しかし、それを真似てはいけないと言うのは、GPL以外のものは、
人類の英知を利用してはいけない、ということになってしまう。研究費が国から出るような
立場の人はそれでよくても、民間企業はそれではとても困る。
2024/09/05(木) 17:03:49.47ID:ehhJfJsl
GPLじゃないOSSなんていくらでもあるのに「GPLロンダリング」をどうしても正当化したい勢が結構いる事に驚いた今日この頃
2024/09/05(木) 17:05:55.92ID:QwnqngeR
誰が作っても同じ物ができる部分は遵法精神があろうがなかろうが同じ物ができるから
法律は関係ない

関係あるのは、ふつうと違う物を作ったらボーナスがもらえるような奴だけだろう
2024/09/05(木) 17:14:02.07ID:CfpHO291
>>712
例えば、多倍長計算ライブラリは、GPL以外のものに良いものがない。
2024/09/05(木) 17:19:12.62ID:zViJFvGA
>>711
> GPL以外のものは、人類の英知を利用してはいけない、ということになってしまう。

そうだよ。 真似しなければ滅びるというなら滅びるべきであるのに
どうして生き延びるために真似していいと思うんだ?
GPL の感染を許したくないなら「お前が」適当なライセンスで作ればいい。
お前が作れなければ出来る人に金を払って作らせろよ。
それがオープンソースの理念だろ。
716デフォルトの名無しさん
垢版 |
2024/09/05(木) 17:28:10.99ID:CfpHO291
>>715
>GPL の感染を許したくないなら「お前が」適当なライセンスで作ればいい。
memcpy や多倍長計算は、世界最高レベルのものが、GPLで出来てしまえば、
異なるアルゴリズムや書き方で、それと同じか、または、超える効率のものは作りえない。
2024/09/05(木) 17:33:36.15ID:zViJFvGA
>>716
なら滅びろと言ってるのがまだわからんのか。
しつこい。
2024/09/05(木) 17:46:49.89ID:9d7Gx9oD
アイデア・ノウハウ・情報などは著作物ではなく保護の対象ではない
だから考え方やアルゴリズムを真似たところで著作権違反にはならない

逆に言語を変えていてもコードを丸コピしてれば違反に問われる可能性はある
コードに「創作性」が認められる場合のみだけど

ただCを例えばHaskellで書き換えたら
基本ルールが違いすぎて異なる表現にしかならないので
複製にあたる可能性は限りなくゼロ
719デフォルトの名無しさん
垢版 |
2024/09/05(木) 17:51:37.45ID:CfpHO291
>>718
>アイデア・ノウハウ・情報などは著作物ではなく保護の対象ではない
>だから考え方やアルゴリズムを真似たところで著作権違反にはならない
だとすれば、GPLで書かれた数値計算ライブラリやmemcpyのアイデア・ノウハウ・アルゴリズム
と完全に同じものを使ったプログラムを作っても、著作権の保護にならないと言うことか。
2024/09/05(木) 18:02:59.65ID:k9PbGgWS
無理筋で弾幕張ってるのは「GPLロンダリング」し過ぎてもう取返しがつかないのか
自動車のECUをリバースエンジニアリングする様子がツベで視聴数を稼ぐ時代にリスク張り過ぎw

>>718
それ論文の話でしょ
>>719
違う

アルゴリズム論文みてHaskell実装するならOK、好きなライセンス形態を選べる
GPL CコードみてHaskell実装するならGPL感染する
2024/09/05(木) 18:13:46.19ID:zViJFvGA
著作権は表現を守る権利だよ。
どこまで表現でどこからアイデアなのか知財関連は素人には判断できないが、 memcpy レベルの基礎的なやつは CPU のドキュメントとかに書いてあるのが元だったりするからどうしても GPL なソフトウェアを真似しないといけないってことはあまりない。
GPL に知恵が集約されてるなんてことはない。
722デフォルトの名無しさん
垢版 |
2024/09/05(木) 19:53:46.83ID:eP4hkN3V
企業が収めた税で食ってる立場の人間が企業の邪魔するようになっちゃ終わりよな
そういう資金がなくなるような政党に投票していこうな
2024/09/05(木) 20:22:43.47ID:MKUftFeD
>>721
>memcpy レベルの基礎的なやつは CPU のドキュメントとかに書いてあるのが元だったりするから
調べてみたが、Intel PDF Manual からは発見できなかった。
724デフォルトの名無しさん
垢版 |
2024/09/05(木) 20:36:21.56ID:MKUftFeD
>>720
>アルゴリズム論文みて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ではなく、
アセンブラレベルにする。だから、レジスタや細かい命令の使い方まで含めてアイデア。
レジスタは、完全には自由には選べないので、個人の自由で選べる範囲は狭い。
だから、効率を落とさずに変更できる余地は少ない。
2024/09/05(木) 20:49:43.99ID:uJyBKCNl
>>720
何も知らんのだなw
Nim推ししてたやつと同じ低知能臭い
2024/09/05(木) 22:10:14.25ID:QwnqngeR
多倍長整数は、整数もObjectクラスを継承している系の言語と相性が良かったが
そういう言語とアセンブラの相性は良くないからアセンブラにこだわる意味は昔はなかった
今は知らんけど
728デフォルトの名無しさん
垢版 |
2024/09/05(木) 22:17:29.12ID:/+8Jbbe1
民業圧迫ωωω
2024/09/05(木) 22:41:12.21ID:mB2Npkme
>>705
C言語の\0終端文字列は部分文字列をそのままでは作れないから不利なのか
長さが最後まで読まないと不明で不利なだけでなく
730デフォルトの名無しさん
垢版 |
2024/09/05(木) 22:47:40.53ID:MKUftFeD
memcpy(のアセンブリコード)だと、たまたま良く似たコードになる可能性も有る。
絶対に真似したかどうかの判定は難しい。
また、そんなことで裁判起こされても困る。
731デフォルトの名無しさん
垢版 |
2024/09/05(木) 22:47:40.53ID:MKUftFeD
memcpy(のアセンブリコード)だと、たまたま良く似たコードになる可能性も有る。
絶対に真似したかどうかの判定は難しい。
また、そんなことで裁判起こされても困る。
2024/09/05(木) 22:51:02.28ID:zViJFvGA
ヌル終端の文字列が不利かどうかは知らんが C で書かれたプログラムは原則としてそうなっていて、
OS レベルに互換性が重要なものはいまさら変更することもできない (から Rust と相性が悪い要素のひとつ) って文脈の話ね。

どちらが良いとかじゃなくて混ぜるのはしんどいという話。
733デフォルトの名無しさん
垢版 |
2024/09/05(木) 23:25:02.06ID:/+8Jbbe1
let hoge: &str = "hoge\0";
で解決
2024/09/05(木) 23:28:42.24ID:krot3bvf
Rustに std::ffi::CStr が出来たから大丈夫
2024/09/06(金) 07:46:48.97ID:BoX7C6E+
>>731
ちゃんと上流に問い合わせた方が良い

何かあったら切捨てられるように何も知らない下流を使っている可能性大
確認して一蓮托生だと認識させないとだめ
2024/09/06(金) 08:16:00.50ID:EpQXEMSG
>>677 >>691
そりゃそうだろ。マネージャーとコーダーで立場が違うんだから。
Rustはコーダーに余計なことをやらせない管理者向けの言語だからLinusが受け入れるのは分かるし、コーダーにとっては無駄に複雑で自由の無い言語だからクソ判定するのもわかる。

実際、Rustは設計固めないとコーティングできないクソ言語だし。
2024/09/06(金) 08:41:14.19ID:EpQXEMSG
>>718
日本の場合、翻訳は二次著作物で原著作者の支配下だよ。
外国も同様のところが多くなかったっけ?
2024/09/06(金) 09:22:28.52ID:mKGFkZT8
>>737
GPLのプログラムソース中のアルゴリズムを別の言語で書いてGPL違反になった判例ある?
739デフォルトの名無しさん
垢版 |
2024/09/06(金) 09:23:43.25ID:zzPaKLb6
>>736
Rustは清書用(キリっ
740デフォルトの名無しさん
垢版 |
2024/09/06(金) 09:25:11.78ID:zzPaKLb6
>>738
コードそのものは違反にならないね
アルゴリズムに著作権は無いとして
外部とのインターフェースに著作権があるかどうか
741デフォルトの名無しさん
垢版 |
2024/09/06(金) 10:11:20.75ID:KHdVu5nS
>>740
インターフェースに著作権は無いよ
2024/09/06(金) 10:16:26.58ID:n4+9uRqg
マネージャとコーダーとか多重請負SIer文化で
linuxカーネル開発を語るなよ…
2024/09/06(金) 11:01:47.89ID:7lTmc6Nm
じゃあメンテナーとコミッターで
2024/09/06(金) 11:05:42.46ID:P1Lpy4RD
linuxで余計なことをやろうとしたのはコーダーではなく
継承とか仮想関数とか設計を語る人達だよね
継承とか仮想関数とかを使わない方針が固まるまでC++コードを書かなかった情強がRustを書き始めた
745デフォルトの名無しさん
垢版 |
2024/09/06(金) 12:04:11.30ID:zzPaKLb6
C++でOS造ろうとした●●ぽんとかいう人は情弱か
2024/09/06(金) 12:19:00.64ID:onD85wsi
linuxカーネルのソース読んだことないのか
c言語とは言え実質的に継承、仮想関数で実装されているところ数多あるから
このあたりはもしオブジェクト指向言語であれば非常にすっきり書けたはずだ
c++の問題はそれ以外の落とし穴が多すぎる
2024/09/06(金) 12:20:47.23ID:EpQXEMSG
>>738
GPLに限定した話は知らんけど、ソースコード->機械語のコンパイルは翻訳として扱われるんだから同じじゃね?
2024/09/06(金) 12:30:31.40ID:P1Lpy4RD
カーネルが清書だ
何言語だろうがカーネルを書いた者は清書おじさんだ
749デフォルトの名無しさん
垢版 |
2024/09/06(金) 13:03:06.23ID:zzPaKLb6
ここでRust持ち上げてC++叩いてる人は
C++のこと全然判ってないね
2024/09/06(金) 14:21:47.18ID:P1Lpy4RD
>>746
openもcloseもただのメンバ関数とする設計が固まればいいのだが
いやopenはコンストラクタに変えるべきだろ
closeはデストラクタだ
っていう所がすっきりしない
2024/09/06(金) 16:17:28.15ID:mKGFkZT8
>>747
判例出してよ
2024/09/06(金) 16:37:13.89ID:/YnY9On7
>>749
分かります。
2024/09/06(金) 16:38:41.24ID:/YnY9On7
>>752
誤解を招きそうな書き方になってしまいましたが、
「判ってないね」
を否定しているのではなく、あなたのご意見に賛同すると言う意味です。
754デフォルトの名無しさん
垢版 |
2024/09/06(金) 18:30:21.35ID:z6D1HraO
C++のこと、全然わかんないや
わかってる人に会ったこともない
2024/09/06(金) 19:25:43.95ID:YdMd7Cxd
C++のメタプログラミングがすべてを理解しようとしたら頭おかしくなる
2024/09/06(金) 20:38:27.30ID:EpQXEMSG
>>751
ちょっと検索してみたけどこんなのがトップに出てきた。

jpaa-patent.info/patent/viewPdf/4110

逆コンパイルがメインだけど差は無いかね。
2024/09/07(土) 07:53:51.62ID:FsPkWUQG
>>756
その判例にGPLのGの字も無いよ
「GPLのプログラムソース中のアルゴリズムを別の言語で書いてGPL違反になった判例」出して
2024/09/07(土) 08:03:00.66ID:vlbXq7x5
そろそろGPLスレでやった方がいい
2024/09/07(土) 08:24:32.13ID:bjSDu3Ht
このスレにRustでGPLロンダリングしている輩が一定数居そうだからおk
2024/09/07(土) 09:16:43.75ID:vmkw4WWt
unsafeを使えばCを呼べるのに一体なぜCをRustに書き直すんだ
2024/09/07(土) 10:03:49.93ID:Gu5ULvaE
チューニングするなら結局境界検査とかオフにすることになるしなぁ
2024/09/07(土) 10:22:43.32ID:sqLgjcFz
低レイヤ、ベアメタルってのも何故か一連のRust関連スレで見かける印象
2024/09/07(土) 10:37:53.70ID:aLQz+qVq
>>757
レスバトラーなら絶対言うだろうなと思ったら案の定で笑っちゃった
2024/09/07(土) 11:14:10.87ID:s8y/n5qE
>>761
境界検査は不要なところではそもそも行われないのでそんなことする必要がない
例えば回数的にほとんどのケースはループ内だがそれはループの終端検査に集約されるため消える
2024/09/07(土) 11:33:41.32ID:wkpoJM1A
ランダムアクセスは思ったより少ないけど必要なところでは性能的に割とシビアなことも多いぞ。
2024/09/07(土) 11:44:43.13ID:UFsx2JaR
>>757
その反論するならまず
「著作物のGPL配布には『著作権上コンパイルは翻訳として扱われる』ことを否定する要因がある」
ことを明らかにしなきゃ話にならんわな。

そもそも>747で「GPLに限定した話は知らんけど」と言っているのにその反論は無能すぎるかと。
2024/09/07(土) 11:58:50.25ID:LaGZ4PBX
>>760
unsafeだからですよ
2024/09/07(土) 12:14:44.55ID:i403o9eP
>>759,760,767

Rust書き換えに裏の目的があったとはね

低レイヤRustプロジェクトの数は少なくて
更にわざわざRust使ってますアピールするから
絞り込んだら見つかるかもしれない
2024/09/07(土) 13:21:00.20ID:vmkw4WWt
C++とCがまるで嫁と姑のように同居する設計はLinuxに採用されなかった
Rustなら同居にはならない
本来の目的はそんな感じだろう
770デフォルトの名無しさん
垢版 |
2024/09/07(土) 13:41:30.42ID:EaB+sfRT
LinusがC++を嫌ってるのはCとの関係性でなくC++独自の部分だと思うぞ
「レベルの低い開発者がクラスとかオブジェクトを使ってどうしようもない壊れたコードを容易に作れる」といった感じだったと思う
これはC++ 11すら登場してない時代の批判だから、今も同じように思うかどうかは分からないけど
あと「C++の例外機構はカーネル開発に向かない」というのもあって、これは今も同じだと思う
2024/09/07(土) 13:45:37.17ID:D6q2gEim
RustやGoなどの例外ではなくエラー値を返していくやり方いいね
2024/09/07(土) 14:09:35.09ID:YJSeDDN1
返されたエラー値をスルーする事例が多発したから例外が作られたと思う
Rustはmust_useがあるけどGoはよく分からん(特に戻り値がエラーだけの関数)
2024/09/07(土) 14:10:48.96ID:aLQz+qVq
ハイプ期に流行った言説をいつまでも言い続けていくこの感じ
2024/09/07(土) 14:34:40.97ID:vmkw4WWt
東京オリンピック、大阪万博、不動産バブル
2024/09/07(土) 15:19:49.13ID:FsPkWUQG
>>763>>766
スレ違うだし判例無いならもういいよ
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++に興味ある方も歓迎しております。
2024/09/07(土) 17:01:27.84ID:kS2tnPiY
ゲームサーバーは低レイヤRustプロジェクトじゃないから
Linux等からのGPLロンダリングは関係なさそうだね

低レイヤ、ベアメタル、Rustがポイントなのかな?
2024/09/07(土) 18:01:33.85ID:Xs/MSaVq
>>775
判例という難しそうな言葉を使いたいお年頃なのね
2024/09/07(土) 18:16:42.45ID:FsPkWUQG
>>778
お前のお気持ち表明に何の意味も無いのよ
2024/09/07(土) 18:41:33.85ID:vmkw4WWt
表明されたエラーを無視されない確実な方法はプロセス全体を終了すること
終了を回避する方法があれば無視される可能性がある
2024/09/07(土) 18:57:47.65ID:UFsx2JaR
>>775
判例は>>756
GPLの著作物と違いから無いからそのまま適用可能。
782デフォルトの名無しさん
垢版 |
2024/09/07(土) 21:31:00.16ID:PLAeIm6B
逆コンパイルとGPLプログラム見たことがある人がプログラム書く行為が同じってマジ?
2024/09/07(土) 22:24:15.60ID:aLQz+qVq
違うと思うならその辺の適当なGPLソフトウェアをパクり移植して著作権記載全部消してAll rights reservedって書いて公開して自分でFSFに通報すれば
2024/09/07(土) 22:53:24.95ID:vmkw4WWt
なぜ実験すればいいと思った
自分は科学的だと思ってるのかな
科学って暴走するんだな
2024/09/07(土) 23:03:30.32ID:gaaFAzxX
>>782
んなわけない
逆コンパイルはコンパイルに近い扱い
2024/09/07(土) 23:14:34.54ID:oYZzSe8a
当たり前だが「見た == パクった」とはならない

ただ万が一の訴訟リスクも避けたいなら
GPLのソースを見て仕様を起こす組織/人間と
GPLのソースを見ず起こされた仕様をもとに
コードを書く組織/人間を完全に分けておけばよい
これで完全にパクリを否定できる
2024/09/08(日) 00:01:36.02ID:uWZDJFuJ
そもそも、特許取れてないものをパクることは、歴史的には許されてきた。
また、著作権法も契約も、作家や著作権者が作品を売って暮らしていけることを目的と
していたものであり、GPLのように社会全体を構造的に変化させることを目的としたものでは
なく、法令の目的外使用と言える。
788デフォルトの名無しさん
垢版 |
2024/09/08(日) 02:29:49.31ID:/oFDgQbn
パソコンのキーボードでフリック入力できるものはありますか?
2024/09/08(日) 07:57:18.94ID:4KkAMey9
相場が乱高下することは許される
ということは昨日は無罪だったものが今日は有罪になっても
相場が間違っていることにならない
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オブジェクトのコピーにするのが正義……
791デフォルトの名無しさん
垢版 |
2024/09/08(日) 22:20:14.30ID:vegiTRtO
C++スレでやれって感じだけど、自分ははその説明は適切でないと思う
shared_ptrを使う理由はちゃんとある
寿命を適切に管理してるなら片方がunique_ptr等で所有して他方に生ポインタ渡すのも駄目ではない

可能ならデータ共有よりもスレッドごとに所有させる方が安全というのは分かるけど、共有が必要な場面って普通にあるはず
2024/09/08(日) 23:25:28.71ID:KupGOfGa
>>791
スレッドの寿命に依存するからunique_ptr使用でポインタ渡しはリスキーだね
Rustならthread::scopeで安全に参照を渡せる
もちろんArcを使うのもよくて
追加コストはclone時と終える時の加減算
スレッド内での参照にコストはかからないからArcを避ける必要はない
793デフォルトの名無しさん
垢版 |
2024/09/08(日) 23:59:54.41ID:vegiTRtO
自分も推奨とまでは思ってなくて、「寿命の問題がないことが明らかであれば許容する」くらいの感じで書いた
クラスのコンストラクタでスレッド立ち上げて、デストラクタの中でjoinするような作り (よくあると思う) ならスレッドの寿命 < 参照先のデータの寿命 は明らかだし
shared_ptrの方が意図は分かりやすいとは思うけど、必須までとは思わない
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参照
795デフォルトの名無しさん
垢版 |
2024/09/09(月) 05:07:18.49ID:cTuZnVfu
>>792
>寿命を適切に管理してるなら
って描いてあるだろ
2024/09/09(月) 07:01:55.53ID:p2Jj+0Ux
>>795
その考え方が既に詰んでいる
もし寿命を適切に管理できるならunique_ptrもRustも不要
しかし人間が100%適切に管理することは不可能だからC++でunique_ptr等が導入された
そしてさらにRust言語が導入された
797デフォルトの名無しさん
垢版 |
2024/09/09(月) 08:08:18.92ID:eGfGA388
寿命を適切に管理できる時はあるんだけど、そうであるかそうでないかの境界くらいなコードをうっかり受け入れてしまうとその後ずっと負債になるんだよな
2024/09/09(月) 08:13:24.94ID:X0IwgyVa
でもここでRustを持ち上げている一定数は
RustでGPLロンダリングしていると吹聴しているレベル

低レイヤ、ベアメタル、Rustってのがポイントみたい
2024/09/09(月) 08:59:39.68ID:XH4OT6yj
どうあっても完璧にはならないという前提で、ちょいちょいリファクタリングするくらいの運用ができればいいんだけどな。
ワヤになることがあっても戻せば少なくとも動きはするし。
2024/09/09(月) 11:37:01.61ID:CQiqzRbc
またC++知らん人が出て来たでおじゃる
2024/09/09(月) 13:49:10.25ID:eftneq+I
C++のスマートポインタは分かってる分かってないもあるがTの型や使われ方によって考えること多すぎて元々キツイやろ
Rustは継承無くしたり所有権複雑にしたことでスマートポインタの様々な機能が可能な限り単一責任に分散されててスッキリしてる
考えた奴の努力凄えと思う
2024/09/09(月) 13:56:14.25ID:ZyHHM8VJ
あっちのスレワッチョイ付いてるからわざわざこっちに持ってきたの?
2024/09/09(月) 20:31:43.26ID:6U3TxPzT
Rust プログラミング 1 (全 5 回)
watch?v=6AiU6ncdUdk
出演
低レイヤーガール 1: 自作 OS を Rust で書いている
低レイヤーガール 2: 自作 browser を Rust で書いている
2024/09/09(月) 21:35:49.10ID:+SItvs3R
>>801
継承の有無は関係なくて
C++ではヒープの解放責任が対象で
Rustはそれに加えてヒープかスタック上かに関わらず参照の有効性が対象
805デフォルトの名無しさん
垢版 |
2024/09/09(月) 23:09:27.92ID:4O0n94uD
>>804
ArcやRcってスタックのデータを指せるっけ?
基本的にヒープに確保されると思ってた
2024/09/09(月) 23:57:57.19ID:q4jDNuIo
Rc/Arcは確保したヒープの解放責任者数だけをカウントしている
解放責任者数がゼロになると解放する
参照している人の数はカウントしていない
参照がいくつ増えようがRc/Arcの内部のカウンターは変化しない
まずこの区別ができているかどうかが基礎かな
2024/09/10(火) 00:00:07.29ID:30cMByxj
そしてスタック上のTであろうがヒープに確保したBox<T>やRc<T>であろうが
そのT部分への参照は同じ&T型となりその値は(スライスなどを除いて)アドレス値のみで構成される
そこでスタック領域かヒープ領域かの区別はない

そしてそこには参照のカウント値は当然なくてライフタイム値も存在しない
参照の有無やライフタイムの妥当性はコンパイル時のみ把握されて問題があればコンパイル時にエラーとなる
2024/09/10(火) 11:45:49.01ID:oGuW1rX8
>>804
すまんその通りや
継承関係ないわw
C++だとスマートポインタにするか生ポインタをクラスに隠すかみたいなことが頭をよぎってあぁぁぁってなるのよ
2024/09/10(火) 13:35:20.41ID:KGjTz1X0
>そこでスタック領域かヒープ領域かの区別はない

これもコンパイル時のみの話では
2024/09/10(火) 18:55:33.96ID:q3P6j0bc
参照があるかないかライフタイムを満たしているかといった情報はコンパイルの時しか持たないけど
参照のアドレス値は実行時にも当然ある
ただしそれがヒープを指すかスタックを指すかは把握できないから区別しない
そして区別しなくてもよい方法をRustは導入した
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 }
}

二つの引数にヒープを指す参照とスタックを指す参照を渡した場合
関数から返ってくる参照がどちらなのかは各実行毎のデータが揃うまでわからない
そして実は参照が指す領域がどちらなのかを把握する必要がないのが結論
ライフタイムさえ満たしていれば区別する必要がなくなった
812デフォルトの名無しさん
垢版 |
2024/09/10(火) 20:21:44.39ID:5FTvOJ5k
なるほど
2024/09/10(火) 21:08:40.00ID:3nGnNoH6
>>805の疑問とは何の関係もないよね
騙されてるやつが訳1名いるみたいでご愁傷様だけど
814デフォルトの名無しさん
垢版 |
2024/09/10(火) 21:31:43.71ID:7V29flyi
Rcは参照の数を管理するものではない
Rcはヒープ領域を確実に解放するためにその所有者の数を管理する
当然Rcはヒープ領域だけを扱う
スタック領域はRAIIで確実に解放される
2024/09/10(火) 22:01:22.00ID:yy/y1+XI
誰かがArc/Rcはborrowの数を管理してると言ってる?
文脈によって意味が変わる「参照」とか「reference」という言葉を勘違いしてるだけじゃない?

Arc/Rcはreference counting pointerなんだから当然参照の数は管理してる
同じアロケーションを参照してるowning pointerの数を管理してる
2024/09/10(火) 22:08:07.24ID:O/aiMcKg
Rcのソースコード解説あったわ。
qiita.com/qnighy/items/5b2fbf27e3ee36e57b8d

誰かソースコード読んだ?
2024/09/10(火) 22:23:36.52ID:/Q+PZbLD
>>815
そんな言葉遊びをして混乱させるのはよくない
Rustで参照といったらTに対する&T
一方でRcはヒープ解放責任の所有者を複数可にする
参照が複数あることと所有者が複数あることは全く別なのでこの違いをはっきりさせて理解するのが正しい
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」とは限らない
文脈次第

>参照が複数あることと所有者が複数あることは全く別なのでこの違いをはっきりさせて理解するのが正しい
その区別ができてないレスとかあった?
2024/09/10(火) 23:09:22.99ID:30cMByxj
Rc/Arcはヒープの解放責任者が複数になるときに対応するものだが
>>805が「ArcやRcってスタックのデータを指せるっけ?」と言い出したのでちょっと怪しい
2024/09/10(火) 23:12:42.09ID:+l9ylb2n
それで言うなら>>804のほうが明らかに言葉足りてないがなあ
まあよく分からんなら反応すんなってこった
2024/09/10(火) 23:22:45.87ID:+H56cclg
RcはC++にないけどArcがC++のshared_ptrだよ
だから複数所有者については新規性がなくて
Rustが強いのはスタック上かヒープ上かに関係なく両者への参照を混ぜても安全に扱えるようになったことだよ
これでスタック上の活用の幅が広がりさらに速くなった
822デフォルトの名無しさん
垢版 |
2024/09/10(火) 23:33:27.03ID:TEK+202e
>>805は元々の認識の方が合ってて、>>804の説明で混乱したと思われる
2024/09/10(火) 23:38:50.48ID:mzgoZglT
複オジの読解力不足&的外れはいつものことだろ
騙されるやつにも問題あるんだからもうほっとけよ
2024/09/10(火) 23:41:27.35ID:blt3RnjU
C++ではヒープの解放責任が安全性の対象だった
Rustはそれに加えて複数の安全性を導入している
ヒープかスタック上かに関わらずそれらへの参照の有効安全性がその一つ
2024/09/10(火) 23:48:29.99ID:mryuhu82
真正アスペかな
2024/09/10(火) 23:49:26.48ID:+l9ylb2n
造語してる暇があったらちゃんとイチからC++学ぼうや、じゃないと他人に伝わる言葉で比較することもできんやろ

いや、別にできなくてもいいのか、なんとなくそれっぽい感じのこと書けるならそれで
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 このアサートは通らない
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複製の戦略)は微妙に変わるかもしれない
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では上述のように安全性とコストゼロを両立させている
2024/09/11(水) 01:53:23.49ID:GmVwOhhB
声かけで特殊”複”詐欺を未然に防止
5ch有志らに感謝状
831デフォルトの名無しさん
垢版 |
2024/09/11(水) 07:05:44.53ID:KRDYrSYu
>>827
vectorにpush_backして再配置でアドレス変わったんだから当たり前でしょ。それが嫌ならstd::listでも使えば
832デフォルトの名無しさん
垢版 |
2024/09/11(水) 07:19:25.98ID:J41SJMWS
>>831
Rustではコンパイルエラーとなって未然に防いでくれるから
C++の欠陥の一つだと思うよ
2024/09/11(水) 08:14:31.51ID:UEfsyQtn
>>832
まともなプログラマはこんな処理書かねーよ
もっとありそうな例だしてくれないかな
2024/09/11(水) 08:40:17.21ID:CkAz+p2f
しかもasan出て久しいのに、この人ら>>827,832 時間止まってる?
2024/09/11(水) 08:58:17.83ID:LHxkhbUK
>>827は簡単な例だからデータ競合を起こしてp5がダングリングポインタとなってることに気づくけど
もっと複雑な状況だと気づかずに実行してしまいデバッグでハマるパターンでもある
それをコンパイル時点で指摘してくれるRustは開発効率いいね
2024/09/11(水) 09:10:35.02ID:9o4a+ZUZ
>>835
本当にsanitizer知らないレベルだと言語以前の問題
全てが効率悪そう

とんでもないスキルイシューの塊だから
RustでGPLロンダリングしていると吹聴するレベルなんだな
2024/09/11(水) 09:13:53.53ID:H21AqaxG
C++はそういう欠陥言語だから仕方ないかと
2024/09/11(水) 09:28:04.51ID:xj8ieTHK
Rustは安全でC++は危険というきれいな比較図式が成り立たなくなるので、C++さんサイドは静的解析だの動的解析だの姑息な手段を使わないでください
同じ理由でunsafe Rustも自分で書くのは禁止です
2024/09/11(水) 09:43:51.82ID:jb2pT+rq
「RustでGPLロンダリング」するのも禁止です

「RustでGPLロンダリング」と検索するのも禁止です
2024/09/11(水) 09:56:40.10ID:Dm5BWpYV
>>827
C++コンパイラはpushの後になぜp5を無効にできないの?
2024/09/11(水) 10:26:06.00ID:tyNMYAOt
予めreserveしてpush_back後も安全にアクセス出来る
2024/09/11(水) 10:27:11.35ID:tyNMYAOt
>「RustでGPLロンダリング」するのも禁止です

こっちは茶化すなよw
2024/09/11(水) 10:30:47.07ID:6tLD5FSA
それpushしまくってる途中でreserve超えてvectorが再配置されてダングリングになるバッドパターン
2024/09/11(水) 11:08:50.53ID:CnBklswL
「境界検査は不要」とか「ループの終端検査に集約されるため消える」とか嘘バラまいてる奴が一番unsafeだよねー>>843
2024/09/11(水) 11:25:15.06ID:4/LY1usJ
落とし穴だらけのC++
2024/09/11(水) 12:02:27.80ID:xj8ieTHK
死ぬまでセフセフやってんのん
2024/09/11(水) 12:23:08.35ID:WF50eMkP
808ですが
>>804の指摘は間違っていることに気づきました
ごめん…
2024/09/11(水) 13:13:12.77ID:qEXxoO97
>>847
どこが間違ってる?
2024/09/11(水) 13:51:56.28ID:I6qUdCVn
人として間違ってる
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
木の精だな
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.
2024/09/12(木) 15:10:13.30ID:Q/uAzgkq
borrow は貸借
2024/09/12(木) 16:35:38.17ID:gdBeeopR
いちいち漢語使うなよ
貸す、借りるでいいだろ
2024/09/12(木) 16:59:56.29ID:L1ol5ihM
borrow は桁借り
2024/09/12(木) 21:13:06.55ID:wl59UoXv
借りてboroboro。70年代のネタあるね
858デフォルトの名無しさん
垢版 |
2024/09/12(木) 21:33:10.32ID:lBmgHN22
Rustを学習していてよくわからなくて、大きく2点について教えて欲しいんだけどさ
1 参照型で含まれるポインタ相当部分を可変、参照先のデータを不変にすることってできるの?
2 構造体Aのフィールドに構造体Bがあるようなとき、(I)A可変・B不変だった場合、(II)A不変・B可変だった場合、それぞれどの範囲で可変・不変になるの?
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
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と関連はあるけど別のものなので分けて考えたほうがいい
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みたいなものだけど、より厳格にチェックされる)
862デフォルトの名無しさん
垢版 |
2024/09/12(木) 22:55:09.24ID:5mY9NUJh
個人的な意見だけど参照先を変える場面ってあまり無い気がする
「aをmutなしに宣言しているのにaが参照するbの内容を変更できる」ことに少し違和感があるかもしれないけど、それはフィールドの型を &mut で指定しているからそういうもの
863デフォルトの名無しさん
垢版 |
2024/09/12(木) 23:04:50.13ID:5mY9NUJh
> struct A {bref_1: &B, bref_2: &mut B}
書き忘れたけど上記はライフタイム注釈を付けないとコンパイルに失敗する
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; // 可変 & 可変参照
865デフォルトの名無しさん
垢版 |
2024/09/13(金) 13:37:30.00ID:bblj+c3p
struct A {bref_1: &B, bref_2: &mut B}

lifetime無いとだめなんじゃね
866デフォルトの名無しさん
垢版 |
2024/09/13(金) 13:38:15.45ID:bblj+c3p
>>863
ああ断りがあったわスマソωωω
2024/09/13(金) 13:47:53.90ID:Q2/6uPpv
なんていうか
質問が曖昧な時ってどういうことか問い直すだけで曖昧さが消えて勝手に解決することのほうが多いんじゃないかって
868デフォルトの名無しさん
垢版 |
2024/09/13(金) 13:49:36.00ID:bblj+c3p
moveされたものはともかく
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/
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
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
2024/09/13(金) 18:49:24.01ID:Q2/6uPpv
これは荒れるぞ…!
2024/09/13(金) 18:54:08.50ID:XNZ3+5G0
C言語よりNimが4倍速いと確定
メモリ管理に優れたNimはフィボナッチ計算でも速い
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 の仕様?不具合?) から試せなかったけど
2024/09/13(金) 22:25:18.35ID:Q2/6uPpv
う~ん高知能
2024/09/13(金) 22:29:46.65ID:XNZ3+5G0
普通に書いてCの4~5倍速いNimが最速プログラミング言語でよろしいでしょうか?
2024/09/13(金) 22:42:17.50ID:7dvxgxgq
マイクロベンチマークは特性の把握に使うものであって優劣を決めるものじゃないよ。
単純な再帰の速度を計測してわかるのは単純な再帰のときの速度だ。
それが想定するユースケースにマッチしてるならそれでもいいけど……。
フィボナッチ数を計算するのが Nim の典型的な用途ってわけじゃないだろ?
2024/09/13(金) 22:52:41.76ID:T78DJi0p
nimってCに落とすんじゃ無かったっけ?
881デフォルトの名無しさん
垢版 |
2024/09/13(金) 22:56:11.85ID:3+j4DpP0
Nimはメモリ管理が良いという話なら、ヒープを使わないコードで比較しても意味がないと思う
再起呼び出しの速さだけ見て何になるんだ
2024/09/13(金) 23:00:41.14ID:FL81G/Fa
>>880
Nimが吐いたCコードを見ると謎が解けるわけだ
ちゃんと再起呼び出し計算しているのかとうか
2024/09/13(金) 23:12:47.89ID:z8SS7FBe
Cの4-5倍も速いのに全く普及する気配がないのは何故かを気にしたほうがいいと思うけど…
2024/09/13(金) 23:13:27.70ID:36xg6fYR
俺環(Nim2.0.8)だと-d: dangerで-O3になる
Cを同じ-O3にすると所要時間はほぼ同じになる(ややCのほうが高速)
-d:releaseと-O2で比べるとNimのほうが有意に遅い

pragmaとコンパイルオプションと環境を揃えればそんな差が出るわけがない
2024/09/13(金) 23:18:25.01ID:36xg6fYR
生成されたCのコードはNimのコンパイラ作ってる人間ならともかく普通の人間が読むのはキツイな
2024/09/14(土) 00:15:56.82ID:tADrZaHu
https://wandbox.org/permlink/MN8P2xOdeXQRYrEB
関数呼び出しコストの話とはあんま関係ないけど、小さな再帰関数なら数段分を別関数に分けると爆速になるという気づきを得た
たぶん数段分がひとつの関数内にインライン展開されてる
2024/09/14(土) 01:41:16.01ID:vw4ahZGC
structoptクレート外したら、リリースビルドで2.5MB小さくなった
たかがオプション解析でコードサイズでかすぎだろ
888デフォルトの名無しさん
垢版 |
2024/09/14(土) 13:43:40.74ID:o3f0Ddoe
>>872
糞リンク貼ってると誰の自演かバレるなω
2024/09/14(土) 13:46:57.51ID:FiNQTETj
Nimが、Cのトランスパイラのままなら、
Cを超えることは、出来ないんだけど。
C以外との比較なら、まだわかる。
2024/09/14(土) 14:59:24.39ID:5H/bnNk9
Rust の std::sync::atomic::fence って C++ の std::atomic_thread_fence 相当?
2024/09/14(土) 18:16:26.88ID:/jwt/PtH
C/C++コードをパクろうとしているか?

RustでGPLロンダリングするな
2024/09/14(土) 18:32:44.15ID:5H/bnNk9
メモリモデルが C++ のパクリだしそっちのほうが資料が豊富なんだからしょうがないじゃん
2024/09/14(土) 19:17:14.39ID:zKyrbT+d
そんなことよりCarbon Languageの話をしようぜ
2024/09/14(土) 20:13:02.31ID:AKZgRAxV
スレチ
895デフォルトの名無しさん
垢版 |
2024/09/15(日) 09:30:53.13ID:xw1jp1Zr
Rustでreplaceするとロンダ楽なのか
良い話を教えてもらった
2024/09/15(日) 13:04:00.82ID:hg9QOZOF
specialization って unsound なんですか?
2024/09/15(日) 14:09:53.01ID:IQt0DXZr
full specializationはunsoundな問題を抱えている
それが君の言う「specializationはunsound」の定義なら答えはyes
2024/09/15(日) 14:54:57.41ID:O4LroQh3
Nimって初めて聞いたけどCのコード出力するんか
ならNimがCより早い、じゃなくてNimがおまえより早い、じゃね?
2024/09/15(日) 15:02:55.04ID:hg9QOZOF
>>897
あっうん、それは分かってて聞いたんだ
具体的にどういうコードだと UB になるのか
それを回避しているらしい min_specialization はどういう制約が付いたサブセットなのか
そういうのが知りたかったかな……
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
2024/09/15(日) 23:40:25.17ID:TlrO/i0R
>>6
トヨタもRustかよ
2024/09/15(日) 23:50:17.65ID:D8okZ/+L
Rustのビルド中間ファイルってなんであんなにでかくなるの?
Tauri使ったちょっとしたツールで20GBぐらい行ったりする
LLVM使ってる言語はみんなそうなの?
903デフォルトの名無しさん
垢版 |
2024/09/16(月) 14:06:23.46ID:KZuryTv7
cargo clean
cargo update
これ毎回やってる
904デフォルトの名無しさん
垢版 |
2024/09/16(月) 14:06:47.97ID:KZuryTv7
Tauriは特に糞
2024/09/17(火) 23:55:54.51ID:fQRlhwbL
>>829
そこまで使い勝手が違うならshared_ptrとは別物と認識した方がよさそうだ
2024/09/18(水) 11:56:36.10ID:vGGDuA6m
Zigだんとつやんけ
ver1.0早う
github.com/kostya/benchmarks?tab=readme-ov-file#primes
2024/09/18(水) 12:51:56.38ID:Vqc4Tj2+
>>906
ソース見たらコストの高いハッシュ衝突安全性を必要としない計算ベンチでそれを使っているいつもの話だった
知識がないとそういうミスをしてしまいがち
他にもVecをインデックスでシーケンシャルアクセスしたりRustに不慣れすぎ
2024/09/18(水) 13:01:04.32ID:vQRPyR7n
それより>>890ってどうなの
2024/09/18(水) 13:54:44.95ID:3YdRpzvH
>>906 >>907
HashMapはnohash_hasher、
Vecシーケンシャルアクセス(to_list内)もiterにしても遅いな

上限を10倍にして
g++ 0.542
clang++ 0.689
Zig 0.595
Rust 1.393 (nohash_hasher)

気になる人がPR出せば良いかと
2024/09/18(水) 14:41:44.76ID:Qk7JHPx8
>>906
Rsutってインタープリター言語だっけ?
2024/09/18(水) 15:08:51.57ID:TO48nZmb
>>906
Rustは二重ループ内(141行目)の
let new_prefix = prefix.clone() + &ch.to_string();
が負担になってそう
他の言語と比べてないけどcloneはいらないはず
2024/09/18(水) 15:25:03.39ID:TO48nZmb
zigの実装に寄せるなら
let new_prefix = format!("{prefix}{ch}");
でいいのかな
全部見てないから動くか分からんけど
2024/09/18(水) 15:26:20.88ID:SWVF2jAZ
>>829
これ最初マジでわかりにくかったわ
中身を借用してたんだな
C++の感覚でいたらは?ってなった
2024/09/18(水) 19:11:45.89ID:mTxD41RC
>> 909
Go & trie-rs 追加

Go 0.845
Rust 1.306 (trie-rs)

>> 912
影響ないっぽい、ブレの範囲内だった
2024/09/18(水) 22:13:43.11ID:nFxNUCWE
>>906
意図的なのかわからないがそのコード
ZigではArenaAllocatorつまりアリーナを用いている
C++ではmonotonic_buffer_resorceつまりアリーナを用いている
Rustではなぜかアリーナが使われていない
その差が速度差となっている
前にもこのアリーナ利用の有無で速度が全く異なる話がこのスレで出ていたような
2024/09/19(木) 03:23:22.25ID:NqtXmLsQ
>>915
GoはアリーナアロケータなしでRustより速い
2024/09/19(木) 03:57:37.37ID:kiFDdu85
そもそも Rust のアリーナアロケータってなんで全部独自コンテナみたいな感じで実装されてんの?
allocator_api がまだ unstable だから?
2024/09/19(木) 04:11:09.43ID:kiFDdu85
真面目に改善しようと思うなら、プロファイル取った上で alloc/dealloc が本当にボトルネックだったのか、そこから検証しなきゃ
2024/09/19(木) 04:44:55.41ID:99kJCx26
>>916
Goはガベージコレクタ依存言語だから
アリーナを使用するか否かでそれほど大きくは変わらない
特に今回はGCが起きる前に終わるため影響は限りなく小さい
アリーナを使用するか否かで非常に大きく影響を受けるのはGCを前提としない言語
2024/09/19(木) 07:08:15.45ID:+8pHe+Yd
一般にガベコレ言語はalloc/freeが速い
特にfreeが速い
さらに小さなプログラムでは、遅延させたfreeを結局実行しないまま終わるのでさらに速い
2024/09/19(木) 09:38:22.33ID:10l+f26H
> アリーナ利用の有無
×
> アリーナを使用するか否か
×

○ Rustはアリーナアロケーターなトライ木をポンと書ける程に整備されてない
2024/09/19(木) 10:26:52.55ID:v0DA15Jd
Sorena
2024/09/19(木) 12:34:03.58ID:bzcz+C1u
アリーナ関係ない前段のsieve部分もrustが遅い

programming-language-benchmarks.vercel.app/problem/nsieve

前まで最適化に熱心だった信者がZigに移ったんかな
2024/09/19(木) 12:48:12.80ID:kiFDdu85
またなんかできてるな
ちょっと Jetpack Compose 風味?

https://ribir.org/
2024/09/19(木) 13:03:22.18ID:FghkJ/1s
>>923
BunでZigが始まった感ある
926デフォルトの名無しさん
垢版 |
2024/09/19(木) 16:25:47.59ID:ZuBUnHjP
>>925
1.0に達してから出直してくれ
2024/09/19(木) 17:04:35.08ID:W7Rw00sD
いい加減ベンチでHashMap使うのやめてくれんかな
2024/09/19(木) 17:04:45.88ID:AQ9Jto0I
>>926
1.0 を過ぎても変更だらけなのが現代やで。
セマンティックバージョニングもあてにならんしな。
2024/09/19(木) 17:18:19.21ID:kiFDdu85
Zig 1.0 は 2025 年にリリース予定らしいので、その後はどうなるかね
2024/09/19(木) 18:00:30.55ID:5zXjGsxJ
>>906のAtkin sieve部分のみ、最後10個表示(to_list処理なし、flag見て10個だけのvectorで処理)
Rust & Goはbitvect版追加

Zig 0.107
g++ 0.115
Rust 0.129 (bit-vect)
clang++ 0.131
Go 0.202 (godropbox/container/bitvector)
Rust 0.284 (Vec<bool>)
Go 0.326 ([]bool)

>>923と似た順序
2024/09/19(木) 18:00:52.16ID:99kJCx26
Zigはasync/awaitなどの非同期対応を捨てたまま狭い領域でやっていくのかな
2024/09/19(木) 18:04:31.95ID:5zXjGsxJ
Zigはstd.DynamicBitSet
C++はvector<bool>
を使っている
2024/09/19(木) 21:18:23.55ID:js953yg3
>>909 >>914
ZigのgenerateTrieの中のkey contains判定してからの(無ければputして)getをgetOrPut一発にしたら速くなった
(std.fmt.allocPrintをstd.fmt.bufPrintなどその他細かい所も変えたけど軽微)

Zig 0.433 (getOrPut)
Zig 0.595 (もともとのcontains/put/get)
2024/09/19(木) 21:23:20.81ID:js953yg3
それと一番最初Zigはコンパイルエラーだったので>>909の段階でstd.TailQueueはstd.DoublyLinkedListにした
2024/09/19(木) 22:39:32.91ID:Ar0pN/Hy
>>115
Zigはそんな安全性無視なことをして速さを得ているの?
936デフォルトの名無しさん
垢版 |
2024/09/19(木) 23:08:32.65ID:O+mD9PcY
範囲外チェックに突っ込むならC/C++もそうですがな
RustはC/C++ほどには速さを優先してなくて、安全性の方を重視してる
HashMapがデフォルトで「遅いけど安全」なハッシュアルゴリズムを使うのもそう

Rustが良いのは安全性や型による表現力の高さが提供されてて、その上で十分に速いところ
純粋な速さだけであれば、よりCに近いZigの方が上というのも妥当といえば妥当
2024/09/19(木) 23:24:05.93ID:a7Zco7ef
そういう方針のZigを採用する企業は極少数になりそう
アメリカ政府が安全な言語に置き換えよう!と言ってるけどZigはNG側だね
2024/09/19(木) 23:46:52.22ID:AQ9Jto0I
「言語が」というだけでなく「デフォルトでは」という前提が付く。
広く使われるようになるとカスい判断をする人も出てくるし、比較的マシなほうをデフォルトにしておくのは合理的な判断だ。
Zig はまだ言語をよく理解しようとする好事家 (いわゆるアーリーアダプタ) のものであってしょうもないユーザは参加してない段階 (なので低能なユーザを考慮してない) というだけかもしれない。
状況や用途によって判断は違ってくるので単純な良し悪しでは測れない。
2024/09/19(木) 23:56:50.81ID:H7B6P1++
ホワイトハウスの意向で今は安全な言語への移行を推奨という状況だけど近いうちにもっと厳しくなる
その時にZigの立場はない
940デフォルトの名無しさん
垢版 |
2024/09/19(木) 23:57:18.58ID:O+mD9PcY
unsafe Rustを使う分野だとRustも安全だと言い切れなくない?
RustほどではないけどZigもCに比べれば安全なコードを書きやすいし、Better Cとしての価値は十分にあると思う
将来的に採用が増えるかは分からないけど、C開発者にとって移植しやすい・学習コストが小さいという理由でZigを選ぶケースはありそう
2024/09/20(金) 00:04:52.33ID:/FW0+jsA
いくら悪いと主張したところで低レイヤは C が支配している (OS やデバイスドライバは大抵の場合に C で書かれている) という現実があるのは変わらんからな。
過渡的な措置として (充分に安全ではなくても) C から移植しやすい言語に出番がありうるというのはわかる。
2024/09/20(金) 00:12:09.61ID:nStvhCnF
とはいえ最近のLinuxカーネルメンテナの話とか見るに彼ら(の一部)はC以外に移行する気は一切なさそうだよね
あと組み込み系でC使っている人は多いけど、あっちはあっちでコンパイラ認証必須だったりして
Zigが使い物になるにはまだ10年とかかかりそう
そこまでZigがちゃんと生きているかというと結構難しいところなんでは…
2024/09/20(金) 00:20:40.07ID:zHznArWB
>>940
そのスレにいるならそろそろ学習しようよ
「unsafe Rustを使う分野」というものは存在しない
標準ライブラリがunsafeで作られているためどんな分野であろうとunsafeのお世話になる
しかしunsafeは特定の関数やモジュールに閉じ込められていてそれ以外の部分の安全性をRust(コンパイラ)が保証してくれる

新たな分野であろうとこの原理は同じ
プログラムのほとんどの部分は自動的に安全性が保証される
どうしても必要な極一部のunsafe部分のみに人間の監視リソースを集中できる
この原理によりRustは安全であるとされて選ばれている
2024/09/20(金) 02:06:23.53ID:hHX3CUd7
Republic of safe Rust

http://www.lisperati.com/landoflisp/panel57.html
2024/09/20(金) 02:10:32.66ID:Hv+SE9tF
楽になるから単価下げるねって言われたら使わないだろうな
946デフォルトの名無しさん
垢版 |
2024/09/20(金) 08:14:15.43ID:ombgsYO5
走行中に連結器が外れたら
そのまま走り続けるのがC言語
緊急停止がabort
そもそも外れないのがRust
でFA?
947デフォルトの名無しさん
垢版 |
2024/09/20(金) 08:19:24.68ID:ombgsYO5
>>940
unsafe Rust は安全だ
948デフォルトの名無しさん
垢版 |
2024/09/20(金) 08:22:06.57ID:ombgsYO5
>>941
> (充分に安全ではなくても) C から移植しやすい言語に出番がありうるというのはわかる。

(充分に安全な) C から移植しやすい言語(もちろんRust)を使えば良いやん
2024/09/20(金) 08:26:57.74ID:+urgn5Bc
Cから移植するのはZig
C++から移植するのはRust
明快だ
2024/09/20(金) 08:36:43.29ID:0kwaWsQC
というより充分に安全でないならわざわざCから移植する必要がないんだよな
Rustは安全というメリットがあるから移植コストを払える(人もいる)けど
Zigがbetter Cであるのはわかるけど、現実にはCを使い続ける人がほとんどじゃないかと思う
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:ZOd0SPdk
>>949
>C++から移植するのはRust
これは絶対無い断言する。
移植ではなく完全書き換えなら在り得るが移植は絶対無理。
2024/09/20(金) 10:26:50.19ID:U1w7xIBY
Rustは管理者・経営者という強力な味方がいるから、コーダーに強制するのは簡単だな。

かつてのJavaの流れになれるかどうか。
955デフォルトの名無しさん
垢版 |
2024/09/20(金) 10:47:55.86ID:SuyVRk3R
>>942
Cプログラマ「Cで十分。はい論破!」
の世界やからな。どうしようもない。
2024/09/20(金) 11:17:57.80ID:/FW0+jsA
問題は想定しないところから出てくる。
想定されるところは対処済みだから。
想定漏れを潰すには実際に運用して、出てきた問題を潰してというループを繰り返すしかない。
実務者の考えはそういうものだ。
運用実績があることが保証の裏付けなんだよ。

Rust の保証が C に比べて強力なのはメモリアクセスまわりの違反検出くらいなので
Rust で書きなおすなら他の要素は検証しなおしになる。
OS が保証しなけりゃならないのはメモリアクセス違反がないことだけじゃないんだぞ。
2024/09/20(金) 11:24:36.15ID:ZOd0SPdk
Rustは清書用(キリっ
958デフォルトの名無しさん
垢版 |
2024/09/20(金) 11:35:22.91ID:Z+QjUDB+
組み込み系はMISRA Cとかあるがお作法レイヤーだからな。
rustの場合は言語レベルの層で対応できるのがメリットでかい。
2024/09/20(金) 11:36:34.54ID:iYhQa7Jy
>>941
既にデバイスドライバはRustで記述されている
わざわざRustのスレに来て批判をしたいなら現状を把握してからにしろ
2024/09/20(金) 11:48:11.57ID:KtEON28z
>>956
モダンな言語を使ったことがない時代遅れの人から見るとそういう間違った勘違いをしてしまいがちだけど
C言語と比較するとモダンな言語はいずれも驚くほど様々なことを保証してくれていたりミスが減ったりするよ
Rustはさらにメモリ競合なども防止してくれて強力だよ
2024/09/20(金) 12:36:21.81ID:uZVeMn04
バースト転送モードとかも書けるの?
2024/09/20(金) 13:06:37.11ID:/FW0+jsA
>>960
余計なことを付け足したから主旨がぶれたな。
もう一度書く。
「問題は想定してないところから出てくる」
2024/09/20(金) 13:13:40.32ID:/FW0+jsA
>>959
意味がわからん。
Linux のカーネルと大半のデバイスドライバが C で書かれている現実が存在しないというのがあなたの主張?
2024/09/20(金) 13:22:45.84ID:ihDm1oNN
>>961
どの用途の話かわからないけど何でも対応できるよ
Rustの変数を用いたインラインでのアセンブラ記述もできるのでRustは万能
2024/09/20(金) 13:38:51.47ID:hHX3CUd7
>>963
全体の文意を読まないで「デバイスドライバは大抵の場合に C で書かれている」の部分だけ拾って反応しちゃったんだと思う
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
967デフォルトの名無しさん
垢版 |
2024/09/20(金) 14:22:18.97ID:ZOd0SPdk
>>966
そういうのはもうおなか一杯だから
Cで出来るのにRustで出来ないことを挙げてよ
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
2024/09/20(金) 15:06:48.25ID:F4gFpM7i
>>827がシングルスレッドでもデータ参照に競合が起きてバグが発生している例
>>966がシングルスレッドでもデータ参照の競合をコンパイラが検出してバグを防いでいる例
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
...
...
971デフォルトの名無しさん
垢版 |
2024/09/20(金) 15:35:56.11ID:YCHSHi4r
このようにC++だとサニタイザーで実行するまでわからない
レアケースで発生するものだと実行しても何日間も見つからないこともある
そして本番へ投入してレアケースが発生して大惨事となる
つまりサニタイザーでは本質的な解決にならないのだ
Rustのように実行せずともコンパイル時に確実に判明することが正しい解決策だ
2024/09/20(金) 15:36:26.98ID:DKDJjDvH
>>827のような操作がバグかどうかは状況による
Rustがやってるのはバグと見做されるような挙動を生みやすいパターンを弾く安全側のアプローチ
言語によっちゃ同名変数の宣言によるシャドウイングを禁止してたりするが、それと似たようなもんだ
2024/09/20(金) 15:41:33.93ID:F4gFpM7i
>>972
開放された無効領域を指すダングリングポインタとなっている>>827は明確なバグ
セキュリティホールにもなりうる深刻なバグ
2024/09/20(金) 15:51:51.16ID:DKDJjDvH
>>973
それはpush_backの実装がたまたま領域を解放しうるから結果的にバグなだけで、
Rustのチェックがそこまで考慮してこのエラーを出しているわけじゃないでしょ
安全側に倒した結果としてたまたまバグを検出できた例と考えるのが適切
2024/09/20(金) 15:51:55.07ID:+urgn5Bc
>>959
政治的な理由でマージされないなら、それは記述されているとは言えない
2024/09/20(金) 16:13:04.26ID:YKBLs+L3
>>966,971が裏でJS/TS書いてると思うとほっこりする
977デフォルトの名無しさん
垢版 |
2024/09/20(金) 17:24:13.84ID:Z+QjUDB+
>>974
結果的も何も、たまたまも何もバグじゃん。
バグは早期に発見できるほうがいいだろ。
2024/09/20(金) 18:37:17.32ID:fL6HDpBx
>>974
↑こういう認識だからいつまでたってもバグがなくならない
主要なOSやブラウザで毎年数千単位の脆弱性が出てる現実を分かってない
2024/09/20(金) 18:46:47.16ID:be7Y0ISI
今rustでグラフィックスプログラミングって実用的?
dx12とかvulkanとか
いい加減c++捨てたいと思ってるけどrustで性能でないなら使えない
2024/09/20(金) 18:57:32.01ID:DxeYxJuZ
>>974
一般的に参照を保持したままそのデータへの別の可変参照が用いられる(=データが書き換わる)と
意味論的に最初の参照が期待していたものと異なるデータ状態になっている可能性があるためバグの発生要因となる
その例のうち最も極端なものがデータがメモリ開放されてしまっているベクタ伸長による自動メモリ移動の例
もちろんメモリ開放を伴わなくてもデータの状態が変わってしまって意味論的に食い違いが起きることでのバグが生じる
特に複雑な状況だとその食い違いが起きていることを人間が把握しきれなくなり見落としてしまう
Rustではそのようなデータ参照の競合を検出してコンパイルエラーにしてくれるため安全である
2024/09/20(金) 19:02:50.08ID:h3rsYutP
>>977,980
Rustはコンパイルが超遅いから、Rustがコンパイルエラーを吐くより先に、C++がコンパイルとサニタイザー検出を終えてるだろ
2024/09/20(金) 19:28:29.22ID:DxeYxJuZ
>>981
サニタイズはプログラムを実行しなければならず更に問題が発生する条件がたまたま揃うまで無限に待たなければいけない
したがって必ずしも問題が検出できるとは限らない非常に劣った方法
しかも対象領域がメモリ問題などいくつかに限られた項目のみ
Rustはデータ参照競合を一般的にコンパイル時点で確実に検出できる
2024/09/20(金) 19:54:50.23ID:d/Vr9ark
>>982
データ競合の間違い指摘でデータ参照競合と言い出す奴
2024/09/20(金) 20:22:52.87ID:eBsokoVK
>>909 >>933
C++も速くなった

g++ 0.406 (martinus/unordered_dense, try_emplace他)
Zig 0.433 (getOrPut他)
g++ 0.542 (元々のpmr::unorderd_map, find/emplace)
Zig 0.595 (元々のcontains/put/get)
2024/09/20(金) 20:25:25.31ID:eBsokoVK
>>930
C++ boost::dynamic_bitsetも試したけど効果なかった
起動終了時間も含んでいるからその違いでZigと差が付いている可能性はありそう
2024/09/20(金) 20:32:05.98ID:eBsokoVK
>>951
現状はドキュメントが直ぐに古くなってソース見ることになる
とりあえずC/C++より速いとなると原因を探すきっかけに出来るベンチマーク言語
2024/09/20(金) 20:37:14.78ID:hHX3CUd7
>>982
> Rustはデータ参照競合を一般的にコンパイル時点で確実に検出できる

「データ競合」の誤用はさておき、このたった一文のために unsafe Rust は決して健全性を破壊しないように書かれなくてならないのですが
safe Rust の健全性保証を一切受けられないその開発者たちは、一体どうやって検証していると思っているんですか?

unsafe ライブラリ開発者のこと、ちゃんとリスペクトしてますか?
2024/09/20(金) 21:14:33.29ID:YCHSHi4r
>>987
unsafeブロック内でも借用(参照)関係のルールは同じ
989デフォルトの名無しさん
垢版 |
2024/09/20(金) 21:23:28.17ID:AH7W/bFk
>>979
WGPU
990デフォルトの名無しさん
垢版 |
2024/09/20(金) 21:28:48.15ID:AH7W/bFk
次スレよろ
2024/09/20(金) 22:02:42.38ID:hHX3CUd7
次スレ
https://mevius.5ch.net/test/read.cgi/tech/1514107621/
2024/09/20(金) 22:22:54.89ID:c48cFuZJ
次スレ

Rust part26
https://mevius.5ch.net/test/read.cgi/tech/1726838318/
2024/09/20(金) 22:27:40.78ID:TuwTNvNc
>>975
既にマージされている
LinuxではデバイスドライバもカーネルモジュールもRustで誰でも記述することができる環境が整備されており動作している
2024/09/21(土) 06:57:11.60ID:Wickqrt+
>>993
マージされてないって聞いたんだが?
2024/09/21(土) 07:19:00.02ID:yZmm+XDT
rust for linuxのトップメンテナーが一抜けしたよな
いわくnontechnical nonsenseなことに飽きただと
言語変えても何か新しい機能が作れるわけじゃないからな
熱量は下がってる
2024/09/21(土) 08:01:00.78ID:1xZtzolN
>>994
とっくにマージされている
誰でも作れるようになったため
「RustでLinuxカーネルモジュール」を作った日本語の記事もたくさんあるのでどうぞ
2024/09/21(土) 09:01:51.68ID:tGswm/a3
Linuxの新たな機能やデバイスドライバが次々とRustで書かれるようになってきたね
2024/09/21(土) 09:23:20.76ID:MXmAIymZ
安全性には新しさがないと?
敵に危害を加えると新しさを感じて熱量が上がる理由がそれなのか
2024/09/21(土) 09:51:32.91ID:7V9P6+h8
RustはCVE出している時点で安全性の新しさはないな
2024/09/21(土) 09:52:42.78ID:7V9P6+h8
しかもRust製のTauriがCVE出してるのが安全性の新しさがない証明になっている
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
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
レス数が1000を超えています。これ以上書き込みはできません。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。