「C++の色々配慮してめんどくさい感じは好きだけど、実務になったらメモリ安全性とか考えて今後Rustに変わっていくんかな」
「うだうだ言ってないで仕事で必要なのをやればいいんだよ、趣味なら好きなのやればいい」
っていうスレ。
前スレ: 結局C++とRustってどっちが良いの?
https://mevius.5ch.net/test/read.cgi/tech/1677286186/
結局C++とRustってどっちが良いの? 2traits
■ このスレッドは過去ログ倉庫に格納されています
2023/04/02(日) 00:42:57.53ID:W9/nq+tL
304デフォルトの名無しさん
2023/04/20(木) 21:38:15.36ID:iAIcEMT7 >その場合でも、範囲内のインデックス値しか来ない構造ならば
この判断を誤ると結局脆弱性が埋め込まれそうだけど、
チェックを忘れることに比べれば起こりにくいのかもね
この判断を誤ると結局脆弱性が埋め込まれそうだけど、
チェックを忘れることに比べれば起こりにくいのかもね
305デフォルトの名無しさん
2023/04/20(木) 21:40:24.96ID:SYxH5KMK306デフォルトの名無しさん
2023/04/20(木) 21:40:47.43ID:9yNISOE6 私は違いがサッパリ分からんぞ
307デフォルトの名無しさん
2023/04/20(木) 21:44:22.16ID:9yNISOE6308デフォルトの名無しさん
2023/04/20(木) 21:51:17.50ID:D1KovJeq309デフォルトの名無しさん
2023/04/20(木) 21:56:16.00ID:9yNISOE6310デフォルトの名無しさん
2023/04/20(木) 22:01:05.35ID:9yNISOE6 >>307
私はせっかちなので自分で議論を進めると(と言っても私はRustは分からんのだが)
範囲外チェックなしでインデックスでアクセスできる -> Rustも同様に危険
範囲外チェックなしでインデックスでアクセスできない -> Rustはオーバヘッドがある
ということになる
私はせっかちなので自分で議論を進めると(と言っても私はRustは分からんのだが)
範囲外チェックなしでインデックスでアクセスできる -> Rustも同様に危険
範囲外チェックなしでインデックスでアクセスできない -> Rustはオーバヘッドがある
ということになる
311デフォルトの名無しさん
2023/04/20(木) 22:03:11.36ID:cejxbewD 複オジの説明がクソだから伝わらなくても仕方ない
312デフォルトの名無しさん
2023/04/20(木) 22:06:37.25ID:9yNISOE6313デフォルトの名無しさん
2023/04/20(木) 22:18:01.10ID:FIsyFWOj C++に勝ってると主張するために普段はunsafeのことを脇に置いてメリットばっかり語ってるのに
性能で負けてるって言われて悔しいからって急にget_uncheckedの話持ち出すからややこしいことになるんじゃな
性能で負けてるって言われて悔しいからって急にget_uncheckedの話持ち出すからややこしいことになるんじゃな
314デフォルトの名無しさん
2023/04/20(木) 22:26:58.01ID:dJqrvGvM 昔LISPもそれでCと張り合ってたな
歴史は繰り返すんやな
歴史は繰り返すんやな
315デフォルトの名無しさん
2023/04/20(木) 22:36:42.26ID:98y/hYCF 話は簡単
RustはVecもそこで使われるスライスのイテレータも
unsafeなコードを閉じ込めてsafeなメソッドを提供している
だからその部分の作成は人間がミスるとおしまい
逆に言えばその狭い範囲のみ人間が頑張って安全性を保証すればよい
一方でそれらVecやイテレータなどを利用する一般のプログラマーは
そのsafeなメソッドを使っている限り絶対に安全なことが保証される
もし問題があればコンパイラがエラーを出すので常に安全となる
結論
RustもC++も最小限のオーバーヘッドが可能で同じ
しかしその安全性は全く異なる
C++は常にミスったらおしまい
C++はプログラム全体に対して人間が安全性を保証しなければならない
Rustはsafe利用者がミスることは絶対になくコンパイラがエラーを出してくれる
Rustはunsafe利用部分のみ人間が安全性を保証しなければならない
RustはVecもそこで使われるスライスのイテレータも
unsafeなコードを閉じ込めてsafeなメソッドを提供している
だからその部分の作成は人間がミスるとおしまい
逆に言えばその狭い範囲のみ人間が頑張って安全性を保証すればよい
一方でそれらVecやイテレータなどを利用する一般のプログラマーは
そのsafeなメソッドを使っている限り絶対に安全なことが保証される
もし問題があればコンパイラがエラーを出すので常に安全となる
結論
RustもC++も最小限のオーバーヘッドが可能で同じ
しかしその安全性は全く異なる
C++は常にミスったらおしまい
C++はプログラム全体に対して人間が安全性を保証しなければならない
Rustはsafe利用者がミスることは絶対になくコンパイラがエラーを出してくれる
Rustはunsafe利用部分のみ人間が安全性を保証しなければならない
316デフォルトの名無しさん
2023/04/20(木) 22:42:39.55ID:9yNISOE6317デフォルトの名無しさん
2023/04/20(木) 22:43:11.74ID:98y/hYCF >>313
そのunsafeなget_uncheckedの件も同じ
unsafeを利用してsafeを提供する人だけがその安全性の保証できるコードを書けばよい
一方でそこで作られたsafeなものを利用する一般プログラマーはミスってもコンパイラがエラーとして止めてくれる
そのunsafeなget_uncheckedの件も同じ
unsafeを利用してsafeを提供する人だけがその安全性の保証できるコードを書けばよい
一方でそこで作られたsafeなものを利用する一般プログラマーはミスってもコンパイラがエラーとして止めてくれる
318デフォルトの名無しさん
2023/04/20(木) 22:44:27.28ID:9yNISOE6319デフォルトの名無しさん
2023/04/20(木) 22:44:35.26ID:98y/hYCF >>316
Rustではコンパイル時に安全性を必ずチェックできる
Rustではコンパイル時に安全性を必ずチェックできる
320デフォルトの名無しさん
2023/04/20(木) 22:48:29.32ID:9yNISOE6321デフォルトの名無しさん
2023/04/20(木) 22:49:34.33ID:98y/hYCF322デフォルトの名無しさん
2023/04/20(木) 22:55:08.59ID:98y/hYCF >>320
最初に出ているこのコードのことだろ
for n in v.iter().take(input_size) {
println!("{n}");
}
もちろんinput_sizeの値に関わらず静的に安全なコードだ
そしてインデックスは用いないのでインデックス範囲外チェックは無い
Cでポインタで書いたときと同じ速度になる
最初に出ているこのコードのことだろ
for n in v.iter().take(input_size) {
println!("{n}");
}
もちろんinput_sizeの値に関わらず静的に安全なコードだ
そしてインデックスは用いないのでインデックス範囲外チェックは無い
Cでポインタで書いたときと同じ速度になる
323デフォルトの名無しさん
2023/04/20(木) 22:56:41.18ID:9yNISOE6 議論にならんのでスルーして
彼の主張は(正しいのかは分からんが)
要するに範囲外チェックなしでインデックスでアクセスできるということだから
Rustも同様にこの点は危険ということになる
彼の主張は(正しいのかは分からんが)
要するに範囲外チェックなしでインデックスでアクセスできるということだから
Rustも同様にこの点は危険ということになる
324デフォルトの名無しさん
2023/04/20(木) 23:00:30.54ID:9yNISOE6325デフォルトの名無しさん
2023/04/20(木) 23:23:11.63ID:SYxH5KMK >>323
Rustはチェックしないけど安全な型を作れるよ
例は何でもいいんだけど例えば将棋盤を表す型を9✕9=81のインデックスを考えてみよう
その将棋盤の型に対するインデックスの型を新たに作ってメソッドとその操作を限定することでusize化した時に常に0~80の値しか取らない型を作る
あとは unsafeを使ってsafeかつ効率的な実装
impl std::ops::Index<将棋盤インデックス型> for 将棋盤 {
type Output = 将棋駒;
fn index(&self, index: 将棋盤インデックス型) {
unsafe { self.0. get_unchecked(index.to_usize()) }
}
}
これで将棋盤型のアクセス時にインデックスの範囲内チェックは行われずに効率的かつ安全
(将棋盤インデックス型の定義によりindex.to_usize()は常に0~80の値のみをとるため)
将棋の実装を実際にしたことはないが
似たようなデータ型は実際に何度か書いたことがある
Rustはチェックしないけど安全な型を作れるよ
例は何でもいいんだけど例えば将棋盤を表す型を9✕9=81のインデックスを考えてみよう
その将棋盤の型に対するインデックスの型を新たに作ってメソッドとその操作を限定することでusize化した時に常に0~80の値しか取らない型を作る
あとは unsafeを使ってsafeかつ効率的な実装
impl std::ops::Index<将棋盤インデックス型> for 将棋盤 {
type Output = 将棋駒;
fn index(&self, index: 将棋盤インデックス型) {
unsafe { self.0. get_unchecked(index.to_usize()) }
}
}
これで将棋盤型のアクセス時にインデックスの範囲内チェックは行われずに効率的かつ安全
(将棋盤インデックス型の定義によりindex.to_usize()は常に0~80の値のみをとるため)
将棋の実装を実際にしたことはないが
似たようなデータ型は実際に何度か書いたことがある
326デフォルトの名無しさん
2023/04/20(木) 23:29:13.60ID:vzrku2iH C/C++にも、-fsanitize=address ってのが後追いながらちゃんと入ってきてる
その価値は認めていいし、しかし、差は縮まりつつある
その価値は認めていいし、しかし、差は縮まりつつある
327デフォルトの名無しさん
2023/04/20(木) 23:32:10.47ID:vzrku2iH Rustでも、unsafe が抜け穴になるよね、って反論はつまり、
コピペ勢に対して、「いやみんなばんばんunsafe使っちゃうからダウト」って返してるってことw
ここにたまるようなヤツは、必要に応じてモジュール毎にON/OFFくらいできるヤツ
熱心に張り合うまでもなく、有意義に使うよ
コピペ勢に対して、「いやみんなばんばんunsafe使っちゃうからダウト」って返してるってことw
ここにたまるようなヤツは、必要に応じてモジュール毎にON/OFFくらいできるヤツ
熱心に張り合うまでもなく、有意義に使うよ
328デフォルトの名無しさん
2023/04/20(木) 23:56:26.81ID:98y/hYCF わずかなunsafe封じ込め部分だけに注力することで、効率的なsafeを作ってしまえば、safe利用者はコンパイラに安全性の保証を任せられることがRustの最大のメリット
329デフォルトの名無しさん
2023/04/21(金) 00:05:38.80ID:SijbBkLt わずかになってくれればいいね
ああ、また釣られてしまったw
ああ、また釣られてしまったw
330デフォルトの名無しさん
2023/04/21(金) 00:13:14.15ID:4oRlgId+331デフォルトの名無しさん
2023/04/21(金) 00:14:20.12ID:4oRlgId+ まちごうた
-9yNISOE6の主張が正しいと仮定して
+98y/hYCFの主張が正しいと仮定して
-9yNISOE6の主張が正しいと仮定して
+98y/hYCFの主張が正しいと仮定して
332デフォルトの名無しさん
2023/04/21(金) 00:14:28.54ID:7fROJFuD 最適化はunsafeというのはRustではほぼ客観的事実に近い
C++で似たような意見を言えば、最適化の足を引っ張る陰謀と見分けがつかない者もいるだろう
C++で似たような意見を言えば、最適化の足を引っ張る陰謀と見分けがつかない者もいるだろう
333デフォルトの名無しさん
2023/04/21(金) 00:19:35.15ID:9IEMPFWw 範囲がconst/constexprであれば、チェックコストはゼロにしうるのでは
そこにコストをかけてでもsafeにしましょうというのがモダン(含Rust)
そこにコストがかからないように書いてナンボなのがC++(失敗時は: 安全だがコストが生じる)
そこにコストをかけてでもsafeにしましょうというのがモダン(含Rust)
そこにコストがかからないように書いてナンボなのがC++(失敗時は: 安全だがコストが生じる)
334デフォルトの名無しさん
2023/04/21(金) 00:58:19.29ID:9IEMPFWw 関係あると思うのできかせて
いまさら人に聞けないんだが、Intel MPXってのが早々にディスコンになったのは、
・MPXでも抜けがあることがわかった
・いまやパイプライン? が優秀すぎて、MPXでもソフトウェア サニタイザでもそんな変わらなかった
っていう理解をしてるけど合ってる?
いまさら人に聞けないんだが、Intel MPXってのが早々にディスコンになったのは、
・MPXでも抜けがあることがわかった
・いまやパイプライン? が優秀すぎて、MPXでもソフトウェア サニタイザでもそんな変わらなかった
っていう理解をしてるけど合ってる?
335デフォルトの名無しさん
2023/04/21(金) 01:08:57.82ID:mE/p3bqb336デフォルトの名無しさん
2023/04/21(金) 02:33:15.05ID:9IEMPFWw かのIntel(当時)が頑張ってもこんなもん(こんなことになる)か
難しいもんなんだな。。
俺にできないだけで、本気出せば難しくないもんかと思ってたのに
難しいもんなんだな。。
俺にできないだけで、本気出せば難しくないもんかと思ってたのに
337デフォルトの名無しさん
2023/04/21(金) 05:31:12.23ID:7fROJFuD 具体的に誰が頑張ったのか全然わからない
いまさら英雄化してももう遅い
いまさら英雄化してももう遅い
338デフォルトの名無しさん
2023/04/21(金) 09:34:15.68ID:Jt0l0JSP339デフォルトの名無しさん
2023/04/21(金) 10:24:01.60ID:YWjwap1N play.rust-lang.org で
use rstk::*; とか
use wx; とか
もちろん出来ない訳だが
use したときに一瞬一覧で選べるものが出て来るので
これの一覧をテキストファイルで欲しいんだが
どこで観れますか?
use rstk::*; とか
use wx; とか
もちろん出来ない訳だが
use したときに一瞬一覧で選べるものが出て来るので
これの一覧をテキストファイルで欲しいんだが
どこで観れますか?
340デフォルトの名無しさん
2023/04/21(金) 10:33:13.77ID:YWjwap1N >C++に勝ってると主張するために普段はunsafeのことを脇に置いてメリットばっかり語ってるのに
>性能で負けてるって言われて悔しいからって急にget_uncheckedの話持ち出す
ほんそれ
>性能で負けてるって言われて悔しいからって急にget_uncheckedの話持ち出す
ほんそれ
341デフォルトの名無しさん
2023/04/21(金) 11:32:23.34ID:obBiE3Vg342デフォルトの名無しさん
2023/04/21(金) 15:41:39.16ID:YWjwap1N343デフォルトの名無しさん
2023/04/21(金) 16:08:14.43ID:e/N20Lgf >>342
それは自分の環境でどうぞ
それは自分の環境でどうぞ
344デフォルトの名無しさん
2023/04/21(金) 21:37:21.45ID:AfLtEamq 控えめに言って Rust は超マゾ言語
345デフォルトの名無しさん
2023/04/21(金) 23:59:16.40ID:LZBHeARm C++もRustも基本的には変わらん
C++で常に安全に書ける人にとってライフタイムなんてすぐ理解できて困らん普通のことだった
Rustでいいと思ったのはイテレータメソッドチェーンのシンプルさとか
あらゆる部分でパターンマッチングできる点とか
C++で常に安全に書ける人にとってライフタイムなんてすぐ理解できて困らん普通のことだった
Rustでいいと思ったのはイテレータメソッドチェーンのシンプルさとか
あらゆる部分でパターンマッチングできる点とか
346デフォルトの名無しさん
2023/04/22(土) 00:04:17.51ID:L3G+XloM GC言語は良いと思うし使いけど可視化する気にならない
GC言語が多過ぎるから
Python並みの人気でも過半数に支持されるとは思えない
GC言語が多過ぎるから
Python並みの人気でも過半数に支持されるとは思えない
347デフォルトの名無しさん
2023/04/22(土) 01:08:10.55ID:6MRD/fZf ライフタイム付き再帰構造体を再帰関数で回してlifetimeのvarianceで苦しむまでがボローチェッカチュートリアルです
348デフォルトの名無しさん
2023/04/22(土) 05:11:35.36ID:ve/ll5uR Rustの弱点突きまくり
349デフォルトの名無しさん
2023/04/22(土) 07:15:46.36ID:iD47eBZH 言語(Rust含む)がせっかく親切にしてくれてるのに、その虚を突く
…っていうか、虚を天然で踏み抜いちゃうのが、シロウトなんだよなあ 俺含む(自戒
…っていうか、虚を天然で踏み抜いちゃうのが、シロウトなんだよなあ 俺含む(自戒
350デフォルトの名無しさん
2023/04/22(土) 07:19:16.96ID:UYc1nlSd PythonのAI系のライブラリを
rustで作り直したら爆速になるのかな?
rustで作り直したら爆速になるのかな?
351デフォルトの名無しさん
2023/04/22(土) 07:23:17.49ID:iD47eBZH 大人気のCUDA版は、CUDAでできてるから Pythonで操ってるだけ
352デフォルトの名無しさん
2023/04/22(土) 09:44:15.55ID:UBHQks3G C++のライフタイムが本当に簡単ならライフタイム系のバグを100%検知できるツールなんて簡単に作れるはずだよね?
353デフォルトの名無しさん
2023/04/22(土) 09:50:17.61ID:OMpDwvP8 >>352
そういう意味ではなく逆だろ
C++でもともなコードを書けているプログラマーはRustでライフタイムをすぐ習得してしまう話だろう
逆にライフタイムを難しいと言ってるプログラマーはC++で込み入ってくると正しいコードを書けない
そういう意味ではなく逆だろ
C++でもともなコードを書けているプログラマーはRustでライフタイムをすぐ習得してしまう話だろう
逆にライフタイムを難しいと言ってるプログラマーはC++で込み入ってくると正しいコードを書けない
354デフォルトの名無しさん
2023/04/22(土) 10:40:59.94ID:iD47eBZH355デフォルトの名無しさん
2023/04/22(土) 10:48:04.53ID:/en2DlgL varianceをOOPにたとえると
変数の型を宣言できないが基底クラスなら宣言できる
という理解でいいんでしょ
変数の型を宣言するツールを簡単に作れるかが問題なのでは
変数の型を宣言できないが基底クラスなら宣言できる
という理解でいいんでしょ
変数の型を宣言するツールを簡単に作れるかが問題なのでは
356デフォルトの名無しさん
2023/04/22(土) 10:54:03.92ID:8hXabeY8 ポインタと同じでライフタイムも概念を理解するのは何も難しいことはない
バグなしで使いこなすのが難しいだけ
それだからRustは厳しめのルールにしてコンパイラでチェックする
C++が脆弱性を量産してきた負の遺産を継承しないためにね
バグなしで使いこなすのが難しいだけ
それだからRustは厳しめのルールにしてコンパイラでチェックする
C++が脆弱性を量産してきた負の遺産を継承しないためにね
357デフォルトの名無しさん
2023/04/22(土) 11:23:28.94ID:XW9UuYWq358デフォルトの名無しさん
2023/04/22(土) 12:09:24.25ID:SKSgk+MB 少し前にvectorの再配置の例が出てたけど
他で参照してる間にデータを操作して参照がおかしくなる事故が後を絶たないから仕方ない
普通のイテレータで走査してる最中に要素を削除したりとか
他で参照してる間にデータを操作して参照がおかしくなる事故が後を絶たないから仕方ない
普通のイテレータで走査してる最中に要素を削除したりとか
359デフォルトの名無しさん
2023/04/22(土) 12:57:45.65ID:/en2DlgL360デフォルトの名無しさん
2023/04/22(土) 13:13:05.95ID:XW9UuYWq >>358
それはどういう状況かな?
それはどういう状況かな?
361デフォルトの名無しさん
2023/04/22(土) 13:44:44.50ID:3JkCsMe2 RustはまだMicrosoftがVisualRust出してないしなあ…
362デフォルトの名無しさん
2023/04/22(土) 15:25:53.88ID:V6k8LZu5 Microsoft方言なRustとかはいらん
363デフォルトの名無しさん
2023/04/22(土) 15:57:35.73ID:nX3yaBf6 >>357
所有権システムはC++もRustも基本的に同じで難しいところはない
表記方法は両者で異なるがRustの方がシンプルに整理されていてわかりやすいだろう
そのインスタンスの挙動についてもRustは新たな型宣言時に特に指定しなければムーブ型になるが
コピー型にしたいならばこう宣言すれば挙動がムーブではなくコピーとなる
#[derive(Copy, Clone)]
struct Foo(i32, i32);
let mut p = Foo(123, 456);
let q = p;
p.0 = 789;
assert!(p.0 != q.0);
assert!(p.1 == q.1);
所有権システムはC++もRustも基本的に同じで難しいところはない
表記方法は両者で異なるがRustの方がシンプルに整理されていてわかりやすいだろう
そのインスタンスの挙動についてもRustは新たな型宣言時に特に指定しなければムーブ型になるが
コピー型にしたいならばこう宣言すれば挙動がムーブではなくコピーとなる
#[derive(Copy, Clone)]
struct Foo(i32, i32);
let mut p = Foo(123, 456);
let q = p;
p.0 = 789;
assert!(p.0 != q.0);
assert!(p.1 == q.1);
364デフォルトの名無しさん
2023/04/22(土) 17:41:44.05ID:+yUQZ3bR >>359
実行時に参照カウントが2以上ならエラーとなる型もRustでは作れるよ
でももっと便利な仕様「実行時に(可変でない)参照カウントはいくつ増えてもOKだけど、可変参照を得る時だけは独占的つまり参照カウントが0でないとエラー」がもっと便利
標準ライブラリRefCell<T>がその仕様そのままで
RefCell<T>自体の可変参照を持っていなくて(非可変)参照を持ってるだけでもTを書き換えることができちゃう
Rustの厳しい可変参照ルールを無視できるから便利だね
いわゆる内部可変性と呼ばれる型の一つ
実行時に参照カウントが2以上ならエラーとなる型もRustでは作れるよ
でももっと便利な仕様「実行時に(可変でない)参照カウントはいくつ増えてもOKだけど、可変参照を得る時だけは独占的つまり参照カウントが0でないとエラー」がもっと便利
標準ライブラリRefCell<T>がその仕様そのままで
RefCell<T>自体の可変参照を持っていなくて(非可変)参照を持ってるだけでもTを書き換えることができちゃう
Rustの厳しい可変参照ルールを無視できるから便利だね
いわゆる内部可変性と呼ばれる型の一つ
365デフォルトの名無しさん
2023/04/22(土) 18:24:59.90ID:/en2DlgL >>364
Rc<T>とRefCell<T>に互換性のようなものはないから「もっと便利」というのは違和感がある
Rc<T>とRefCell<T>に互換性のようなものはないから「もっと便利」というのは違和感がある
366デフォルトの名無しさん
2023/04/22(土) 18:42:18.67ID:+yUQZ3bR367デフォルトの名無しさん
2023/04/22(土) 18:45:43.59ID:pFB+K5t4 話が専門的になってきているけれども、「メモリー関連バグ」はバグの一部に
過ぎず、それが完全に防げたとしてもバグが入り込む余地はたくさんある。
例えば、JSやJava、C#、BASIC、Pythonなどの言語はメモリー関連バグは
入り込まないが、バグはいくらでも入り込む。
過ぎず、それが完全に防げたとしてもバグが入り込む余地はたくさんある。
例えば、JSやJava、C#、BASIC、Pythonなどの言語はメモリー関連バグは
入り込まないが、バグはいくらでも入り込む。
368デフォルトの名無しさん
2023/04/22(土) 18:51:49.24ID:iD47eBZH Javaはぬるぽぬるぽいってたけどねえ いまさらだけど、あれなんだったんだろう (nullptrは使ってます
369デフォルトの名無しさん
2023/04/22(土) 19:01:05.60ID:pFB+K5t4 >>367
追加として、Ruby、PHP、Perl なども同様。
メモリー関連バグは入らないが、論理バグはいくらでも入り込む。
だから、ネットショッピングサイトをこれらの言語で作っても、
データ漏洩や、データ消失(顧客情報の間違った削除など)、
インターフェースのバグ、買いたいものが買えない、別人のアカウントで
買った事になってしまう、あるいは、セキュリティーホールなどは、
入り込む余地はいくらでもある。
15 番の人が購入しているのに、16番の人を購入したことにしてしまったりとか。
または、ボタンを一回押したのに、2回購入したことになってしまったとか。
キャンセルボタンを押しても動作しないとか。
または、キャンセルすると、14番の人の購入がキャンセルしてしまったりとか。
そういうのは基本的に論理バグであり、メモリー関連バグとは別に発生しうる。
追加として、Ruby、PHP、Perl なども同様。
メモリー関連バグは入らないが、論理バグはいくらでも入り込む。
だから、ネットショッピングサイトをこれらの言語で作っても、
データ漏洩や、データ消失(顧客情報の間違った削除など)、
インターフェースのバグ、買いたいものが買えない、別人のアカウントで
買った事になってしまう、あるいは、セキュリティーホールなどは、
入り込む余地はいくらでもある。
15 番の人が購入しているのに、16番の人を購入したことにしてしまったりとか。
または、ボタンを一回押したのに、2回購入したことになってしまったとか。
キャンセルボタンを押しても動作しないとか。
または、キャンセルすると、14番の人の購入がキャンセルしてしまったりとか。
そういうのは基本的に論理バグであり、メモリー関連バグとは別に発生しうる。
370デフォルトの名無しさん
2023/04/22(土) 19:24:40.58ID:2MwGVm8+ >>367
GC言語を含めた多くの言語で発生する普遍的なバグがデータ競合
データ競合は様々なものがあってマルチスレッドでは当然発生するだけでなく
スレッドを利用しなくても部分参照が可能な言語ではデータ競合が容易に発生してしまう
後者の例はこのスレ既出でベクター型においてその何番目かの要素の参照を持っているときに
要素追加が行われると再配置によりダングリングを引き起こしたり
要素挿入が行われると再配置がなくてもズレて意図せず異なる要素を指してしまうデータ競合が起きる
>>369の例の別の人の購入データになってしまったりするバグも様々なデータ競合により引き起こされることが多い
このように色々なデータ競合がプログラミングで発生するが
Rustではデータ競合が発生せずコンパイルエラーとなる
これは非常に大きな強み
GC言語を含めた多くの言語で発生する普遍的なバグがデータ競合
データ競合は様々なものがあってマルチスレッドでは当然発生するだけでなく
スレッドを利用しなくても部分参照が可能な言語ではデータ競合が容易に発生してしまう
後者の例はこのスレ既出でベクター型においてその何番目かの要素の参照を持っているときに
要素追加が行われると再配置によりダングリングを引き起こしたり
要素挿入が行われると再配置がなくてもズレて意図せず異なる要素を指してしまうデータ競合が起きる
>>369の例の別の人の購入データになってしまったりするバグも様々なデータ競合により引き起こされることが多い
このように色々なデータ競合がプログラミングで発生するが
Rustではデータ競合が発生せずコンパイルエラーとなる
これは非常に大きな強み
371デフォルトの名無しさん
2023/04/22(土) 19:37:17.80ID:pFB+K5t4 >>370
> 369の例の別の人の購入データになってしまったりするバグも様々なデータ競合により引き起こされることが多い
データ競合が発生しなくても、単なる論理ミスでも発生するから、Rustでも
ちゃんと正しい論理を書かなければ発生する。
> 369の例の別の人の購入データになってしまったりするバグも様々なデータ競合により引き起こされることが多い
データ競合が発生しなくても、単なる論理ミスでも発生するから、Rustでも
ちゃんと正しい論理を書かなければ発生する。
372デフォルトの名無しさん
2023/04/22(土) 19:40:54.01ID:iD47eBZH ポインタは究極の共有オブジェクトだから、同様に管理する習慣が付けば、データ競合のミスは減りそうだよね
373デフォルトの名無しさん
2023/04/22(土) 19:50:59.03ID:2MwGVm8+ >>371
それはビジネスロジックの論理バグ
プログラミング言語が何であろうと関係なく生じるのでこのスレの目的である言語の比較に無関係
そしてプログラミングのデータの取り扱いで発生する論理バグがデータ競合
データ競合はバグを引き起こしうるためプログラマーが回避しなければならない
Rustはコンパイルが通ればデータ競合がないことが保証される
任意のプログラミング言語に対してRustが有利
それはビジネスロジックの論理バグ
プログラミング言語が何であろうと関係なく生じるのでこのスレの目的である言語の比較に無関係
そしてプログラミングのデータの取り扱いで発生する論理バグがデータ競合
データ競合はバグを引き起こしうるためプログラマーが回避しなければならない
Rustはコンパイルが通ればデータ競合がないことが保証される
任意のプログラミング言語に対してRustが有利
374デフォルトの名無しさん
2023/04/22(土) 20:01:02.96ID:pFB+K5t4 メモリやデータ競合に関係したバグの送りにくさRustは有利ではある。
ただ、言語に求められるのはそれだけではない。
ただ、言語に求められるのはそれだけではない。
375デフォルトの名無しさん
2023/04/22(土) 20:07:00.96ID:2MwGVm8+376デフォルトの名無しさん
2023/04/22(土) 20:10:28.97ID:YMOkCFj1 Visual Studio でC++のMFCや C#のWPFのようにGUI開発がサポートされたら新規ソフトはRustになっていきそう
逆に現状のままなら開発元のMozilla以外はLinuxカーネルみたいなマニアックな用途だけで終わりそう
逆に現状のままなら開発元のMozilla以外はLinuxカーネルみたいなマニアックな用途だけで終わりそう
377デフォルトの名無しさん
2023/04/22(土) 20:13:15.69ID:pFB+K5t4378デフォルトの名無しさん
2023/04/22(土) 20:17:17.43ID:ZakZodsv let mut hoge: Vec<Vec<String>> = vec![Vec::with_capacity(3); 4];
のとき
hoge.len() は 4
hoge[0].len() は 0
hoge[0].capacity() は 3 を期待していたのですが何故か常に 0 になってしまいます
Why?
のとき
hoge.len() は 4
hoge[0].len() は 0
hoge[0].capacity() は 3 を期待していたのですが何故か常に 0 になってしまいます
Why?
379デフォルトの名無しさん
2023/04/22(土) 20:58:04.53ID:SKSgk+MB vec![expr; n]は内部でclone使うんだけど、Vecのcloneはcapacityまでは複製しないみたい
複製はできるだけ余剰メモリをカットしたい気がするから仕様だろうな
fn main() {
let a: Vec<String> = Vec::with_capacity(10);
let b = a.clone();
println!("{}, {}", a.capacity(), b.capacity()); // 10, 0
}
複製はできるだけ余剰メモリをカットしたい気がするから仕様だろうな
fn main() {
let a: Vec<String> = Vec::with_capacity(10);
let b = a.clone();
println!("{}, {}", a.capacity(), b.capacity()); // 10, 0
}
380デフォルトの名無しさん
2023/04/22(土) 20:58:54.89ID:+yUQZ3bR データ競合を防ぐのは簡単で「multiple readers or single writer」を守れば防げる
どの言語でもそのような形になるようにプログラマーが解決する
ただしRust以外の言語はデータ競合があっても検出できずに競合を起こしたまま動いてしまいバグとなる
>>377
存在しない
>>378
vec!は回数分のcloneするだけ
そしてcloneはcapacityを保持しない
だからその0となる挙動は仕様通りで正しい
その3となる挙動にしたいなら例えば
Vec::from_iter((0..4).map(|_| Vec::with_capacity(3)));
あるいはrepeat_withでtake(4)
どの言語でもそのような形になるようにプログラマーが解決する
ただしRust以外の言語はデータ競合があっても検出できずに競合を起こしたまま動いてしまいバグとなる
>>377
存在しない
>>378
vec!は回数分のcloneするだけ
そしてcloneはcapacityを保持しない
だからその0となる挙動は仕様通りで正しい
その3となる挙動にしたいなら例えば
Vec::from_iter((0..4).map(|_| Vec::with_capacity(3)));
あるいはrepeat_withでtake(4)
381デフォルトの名無しさん
2023/04/22(土) 21:09:18.75ID:iios9sCz やっぱりC++のstd::variant欲しいっすな
Refに対応したCow作ったけどなかなかだるい(というか標準で対応してくれの感が激しかった)し
こんどはRc<RefCell<T>>と&Tのenumが欲しい
わざわざ作るのもだるい
Refに対応したCow作ったけどなかなかだるい(というか標準で対応してくれの感が激しかった)し
こんどはRc<RefCell<T>>と&Tのenumが欲しい
わざわざ作るのもだるい
382デフォルトの名無しさん
2023/04/22(土) 21:09:58.95ID:XW9UuYWq 制約は安全性を高めるためなんだろうけど率直に言ってウザいからな
他人に書かせるならRustを選ぶかもしれんがw
自分で書くものにはRustは不要かな
他人に書かせるならRustを選ぶかもしれんがw
自分で書くものにはRustは不要かな
383デフォルトの名無しさん
2023/04/22(土) 21:26:41.96ID:suBXXmuN マルチスレッドの主な用途は数値計算なんだけど、数値計算だと
データ競合が起きるような場合はシミュレーション結果がおかしくなるので
テスト段階で分かることが多い。また、脆弱性とも関係無い。
脆弱性が問題になるのは、主にブラウザ。
自分のマシンのセキュリティーホールに悪さをするアホはいない。
つまり、脆弱性とはネットと関係する場合にのみおきると言っても過言ではない。
だから、シミュレーションとかは脆弱性とは関係が無いので、
データ競合が起きたら、結果がおかしくなるだけ。
データ競合が起きるような場合はシミュレーション結果がおかしくなるので
テスト段階で分かることが多い。また、脆弱性とも関係無い。
脆弱性が問題になるのは、主にブラウザ。
自分のマシンのセキュリティーホールに悪さをするアホはいない。
つまり、脆弱性とはネットと関係する場合にのみおきると言っても過言ではない。
だから、シミュレーションとかは脆弱性とは関係が無いので、
データ競合が起きたら、結果がおかしくなるだけ。
384デフォルトの名無しさん
2023/04/22(土) 21:26:48.13ID:2MwGVm8+ >>377
ついに嘘つき敗北宣言『あるけど言わない。』を出したのか
ついに嘘つき敗北宣言『あるけど言わない。』を出したのか
385デフォルトの名無しさん
2023/04/22(土) 21:29:51.72ID:2MwGVm8+386デフォルトの名無しさん
2023/04/22(土) 21:30:53.79ID:suBXXmuN >>384
いや、有る。
いや、有る。
387デフォルトの名無しさん
2023/04/22(土) 21:36:25.12ID:suBXXmuN ここの人達は、自分と意見が合わない人を馬鹿だと思ってる気がするけど、
それは違うぞ。
俺は貴重な意見を言っている。
まあ、日本全国探しても貴重だろう。
だけど、全部は大事なところは言わん。
それは違うぞ。
俺は貴重な意見を言っている。
まあ、日本全国探しても貴重だろう。
だけど、全部は大事なところは言わん。
388デフォルトの名無しさん
2023/04/22(土) 21:38:49.06ID:2MwGVm8+389デフォルトの名無しさん
2023/04/22(土) 21:39:07.62ID:OFX5zT+6 無能である上に突っ込まれるのが怖くて意見表明すらできない
負け犬極まれりだな
負け犬極まれりだな
390デフォルトの名無しさん
2023/04/22(土) 21:41:53.93ID:suBXXmuN >>388
>データ競合はタイミングなどで稀にしか発生しないものも多い
数学的に考えているから、細かいミスが取れた後は大丈夫。
脳内で証明済みのアルゴリズムを使うから。
才能の無い人は誰かが考えたアルゴリズムを真似て使うのだろう。
俺はそんなことはしてない。
>データ競合はタイミングなどで稀にしか発生しないものも多い
数学的に考えているから、細かいミスが取れた後は大丈夫。
脳内で証明済みのアルゴリズムを使うから。
才能の無い人は誰かが考えたアルゴリズムを真似て使うのだろう。
俺はそんなことはしてない。
391デフォルトの名無しさん
2023/04/22(土) 21:42:53.35ID:suBXXmuN392デフォルトの名無しさん
2023/04/22(土) 21:46:36.12ID:XW9UuYWq393デフォルトの名無しさん
2023/04/22(土) 21:49:17.49ID:suBXXmuN >>392
姿を隠して情報収集ってか。
姿を隠して情報収集ってか。
394デフォルトの名無しさん
2023/04/22(土) 21:50:20.64ID:+yUQZ3bR >>390
データ競合を引き起こしてきたプログラマーたちは皆そのように言っている
「自分はデータ競合を引き起こさないように(アルゴリズムを考えて)コードを書いた」
しかし実際にはデータ競合が起きた
データ競合はRustのようにプログラミング言語で防いだほうが好ましい
データ競合を引き起こしてきたプログラマーたちは皆そのように言っている
「自分はデータ競合を引き起こさないように(アルゴリズムを考えて)コードを書いた」
しかし実際にはデータ競合が起きた
データ競合はRustのようにプログラミング言語で防いだほうが好ましい
395デフォルトの名無しさん
2023/04/22(土) 21:51:10.61ID:suBXXmuN >>394
俺とそいつらの頭脳は同じではない。
俺とそいつらの頭脳は同じではない。
396デフォルトの名無しさん
2023/04/22(土) 21:54:28.66ID:suBXXmuN Mozillaは、凡庸な技術者しかいないからRustが必要になった。
それだけの話。
もっとも、普通の企業はそんなもんだろうが。
それだけの話。
もっとも、普通の企業はそんなもんだろうが。
397デフォルトの名無しさん
2023/04/22(土) 21:55:58.32ID:XW9UuYWq データ競合起きたら意図と異なりデタラメな結果になるので
すぐ分かると思うよ
すぐ分かると思うよ
398デフォルトの名無しさん
2023/04/22(土) 21:57:39.05ID:XW9UuYWq399デフォルトの名無しさん
2023/04/22(土) 22:00:29.73ID:SKSgk+MB >>385
文字列全体(String)とその一部の参照(&str)を同じ構造体に詰めないとか
オブジェクト指向言語に慣れた人だと辛いと思う
厳密にはC++でも難しい(&strの初期値で悩む)けどこっちはまだごまかせるし
上の方でもちょっと書いたけど行ロックを意識したDBのテーブル設計に近い印象
とりあえず全項目を1つのテーブルに突っ込むみたいな方法だと途中で引っ掛かるから
大雑把な人には面倒な言語かもしれない
文字列全体(String)とその一部の参照(&str)を同じ構造体に詰めないとか
オブジェクト指向言語に慣れた人だと辛いと思う
厳密にはC++でも難しい(&strの初期値で悩む)けどこっちはまだごまかせるし
上の方でもちょっと書いたけど行ロックを意識したDBのテーブル設計に近い印象
とりあえず全項目を1つのテーブルに突っ込むみたいな方法だと途中で引っ掛かるから
大雑把な人には面倒な言語かもしれない
400デフォルトの名無しさん
2023/04/22(土) 22:03:16.47ID:suBXXmuN >>397
俺の経験から言ってもそう思う。
テスト時に働かないような「if 文」を入れたりしない限りは。
バグが取れない人は、変なところに if 文を入れている。
数学的な理想世界では基本的には if は存在しないことがおおい。最小と最大の
付近以外では。
だから、数学的に考えられる人は if 文は最低限しか入れないで済む。
このルールを守っていれば、滅多なことで妙なバグは入らない。
俺の経験から言ってもそう思う。
テスト時に働かないような「if 文」を入れたりしない限りは。
バグが取れない人は、変なところに if 文を入れている。
数学的な理想世界では基本的には if は存在しないことがおおい。最小と最大の
付近以外では。
だから、数学的に考えられる人は if 文は最低限しか入れないで済む。
このルールを守っていれば、滅多なことで妙なバグは入らない。
401デフォルトの名無しさん
2023/04/22(土) 22:11:27.43ID:+yUQZ3bR402デフォルトの名無しさん
2023/04/22(土) 22:15:02.54ID:suBXXmuN >>401
いや、Microsoftは、「凡庸な技術者」もいるが、優秀なのも居る。
いや、Microsoftは、「凡庸な技術者」もいるが、優秀なのも居る。
403デフォルトの名無しさん
2023/04/22(土) 22:19:29.86ID:2MwGVm8+ >>399
それはString内容が変わったり空になったら意味のないデータになったり無効メモリを指すから、非GC言語でその設計はよくないね
Rust本スレで話題があったようにもう少し詳細な用途毎にstring_cacheやtyped_arenaを使ったりそういう自作設計をして安全と効率を両立させるべきかと
それはString内容が変わったり空になったら意味のないデータになったり無効メモリを指すから、非GC言語でその設計はよくないね
Rust本スレで話題があったようにもう少し詳細な用途毎にstring_cacheやtyped_arenaを使ったりそういう自作設計をして安全と効率を両立させるべきかと
404デフォルトの名無しさん
2023/04/22(土) 22:35:35.61ID:XW9UuYWq■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【無言】中国怒らせた高市首相→1週間だんまり、国民に実害も説明なし 中国問題を避けてスルー… ★5 [BFU★]
- 「日本はパンダがいなくなる状況に直面するだろう」 中国メディア、専門家の見方伝える [♪♪♪★]
- 【速報】10月の消費者物価3.0%上昇 [蚤の市★]
- 止まらぬ「日本売り」 高市財政への懸念で進む金利上昇と円安 ★2 [蚤の市★]
- ネット殺到「高市総理の責任」「完全に高市リスク」「負けるな」中国が水産物輸入停止→流石に総理批判の声も「どう責任取る?」 ★12 [樽悶★]
- 【コメ】価格「5キロ4316円」で最高値を更新…「おこめ券」が解決につながらない根本的な理由 コメ農家が危機感をあらわにする「離農」 [ぐれ★]
- 【悲報】米国務省「米国は台湾海峡における平和と安定を望む。いかなる一方的な現状変更の試みにも反対する」タリバンの声明を受け [974680522]
- 中国父「高市、今回はこの辺にしといたるわ!」 世界の供給源としての信頼維持のためレアアース制裁見送りの公算 [271912485]
- 高市早苗、会食せず議員宿舎に籠って勉強の毎日「飲んでる暇があれば、政策を練り、資料を読みたい」 [485187932]
- 愛国保守、日本を本気で潰しにかかる [819729701]
- 【悲報】Suica、セキュリティを突破されたのが販売されはじめる [347751896]
- 東大名誉教授「中国は誤った宣伝を繰り広げ、対立を煽り、経済の失敗による国内の不満を日本に向けている」 [903292576]
