闘え
※前スレ
C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/
C vs C++ vs Rust Part.2
https://mevius.5ch.net/test/read.cgi/tech/1639539350/
探検
C vs C++ vs Rust Part.3
レス数が950を超えています。1000を超えると書き込みができなくなります。
2022/01/27(木) 22:19:47.56ID:avZQ9Wm7
851デフォルトの名無しさん
2022/03/30(水) 20:22:32.28ID:/krHLZdG >>834
Rustだと以下のようになる
> ・using
RustもC++と同じくRAIIなのでusingは不要
let mut file = File::create("a.txt")?;
file.write("test")?;
エラー時は?演算子で即returnとなり例外処理と類似状態になる
スコープを抜ける時に自動的にデストラクタdrop()が呼ばれる
何もしなくてもファイルなら自動closeされてロックなら自動解除される
> ・$"X = {X}"
Rustでは標準マクロ利用でほぼ同様の形式
format!("x={x}")
> ・null合体演算子
Rustは安全重視のため各型にnullやnilといった値が無い状態というものがない
そこで関数型言語と同様に代数的データであるenumを用いてジェネリックにT型に対してenum Option<T>型を使う
Option<T>型はT型の値tが存在する場合Some(t)と存在しない場合Noneの2つのenum値をとる
なのでnullに対応するものはNoneとなるが型が異なるので明白に区別できてミスがあればコンパイル時に検出可能
Rustだと以下のようになる
> ・using
RustもC++と同じくRAIIなのでusingは不要
let mut file = File::create("a.txt")?;
file.write("test")?;
エラー時は?演算子で即returnとなり例外処理と類似状態になる
スコープを抜ける時に自動的にデストラクタdrop()が呼ばれる
何もしなくてもファイルなら自動closeされてロックなら自動解除される
> ・$"X = {X}"
Rustでは標準マクロ利用でほぼ同様の形式
format!("x={x}")
> ・null合体演算子
Rustは安全重視のため各型にnullやnilといった値が無い状態というものがない
そこで関数型言語と同様に代数的データであるenumを用いてジェネリックにT型に対してenum Option<T>型を使う
Option<T>型はT型の値tが存在する場合Some(t)と存在しない場合Noneの2つのenum値をとる
なのでnullに対応するものはNoneとなるが型が異なるので明白に区別できてミスがあればコンパイル時に検出可能
852デフォルトの名無しさん
2022/03/30(水) 20:25:10.41ID:/krHLZdG >>834
> ・null合体演算子
Rustでは>>851という状況なのでnull合体演算子についても少し概念が違ってくるが
xがNoneの時にDEFAULT_VALUEとしたい場合
x.or(Some(DEFAULT_VALUE)) でOption<T>型を得る
x.or(Some(DEFAULT_VALUE)).unwrap() でT型を得る
x.unwrap_or(DEFAULT_VALUE) が上記の簡易版でT型を得る
例えばC#での x ?? y ?? z を全てOption<T>型で表すと
Rustでは x.or(y).or(z) となりほぼ同じシンプルな表現
ちなみに?演算子によるNone時の即retun Noneも可能で
例えば各メソッドがOption<T>型を返すとするとこれでT型を得られる
let output = input.method1()?.method2()?.method3()?;
> ・null合体演算子
Rustでは>>851という状況なのでnull合体演算子についても少し概念が違ってくるが
xがNoneの時にDEFAULT_VALUEとしたい場合
x.or(Some(DEFAULT_VALUE)) でOption<T>型を得る
x.or(Some(DEFAULT_VALUE)).unwrap() でT型を得る
x.unwrap_or(DEFAULT_VALUE) が上記の簡易版でT型を得る
例えばC#での x ?? y ?? z を全てOption<T>型で表すと
Rustでは x.or(y).or(z) となりほぼ同じシンプルな表現
ちなみに?演算子によるNone時の即retun Noneも可能で
例えば各メソッドがOption<T>型を返すとするとこれでT型を得られる
let output = input.method1()?.method2()?.method3()?;
853デフォルトの名無しさん
2022/03/30(水) 20:27:16.59ID:WCI7hBXJ854デフォルトの名無しさん
2022/03/30(水) 20:31:07.93ID:UJJsLtPb それは例外そのものの型のことでしょ。
基本的にはexceptionの派生や孫で作られてるものが大半だからwhatでメッセージ受けるわけだが、
何のエンコードかは定かではない。
基本的にはexceptionの派生や孫で作られてるものが大半だからwhatでメッセージ受けるわけだが、
何のエンコードかは定かではない。
855デフォルトの名無しさん
2022/03/30(水) 20:33:36.81ID:qIK9n1MF >>842
根本的な理解がない、残念君のご様子。
> std::ofstream fs("a.txt");
コンストラクタでOpenする場合、失敗すると例外がスローされるから、関数内
または上位でtry〜catchかな。 C#やJavaで毎回NULL参照チェック書いてるか?
いずれにしろ、オープンされていないオブジェクトが
> fs<<"test"<<std::endl;
に渡されることはない。 こうした処理は、オブジェクトのシリアライズ処理を実装
した関数内へ記述して、参照渡しでオープン済のオブジェクトを渡すのが一般的。
根本的な理解がない、残念君のご様子。
> std::ofstream fs("a.txt");
コンストラクタでOpenする場合、失敗すると例外がスローされるから、関数内
または上位でtry〜catchかな。 C#やJavaで毎回NULL参照チェック書いてるか?
いずれにしろ、オープンされていないオブジェクトが
> fs<<"test"<<std::endl;
に渡されることはない。 こうした処理は、オブジェクトのシリアライズ処理を実装
した関数内へ記述して、参照渡しでオープン済のオブジェクトを渡すのが一般的。
856デフォルトの名無しさん
2022/03/30(水) 20:43:31.08ID:/krHLZdG Rustにはnullも例外もなく
どちらも代数的データ型であるenumで表現するため
シンプルかつ安全性をコンパイル時に保証できる
どちらも代数的データ型であるenumで表現するため
シンプルかつ安全性をコンパイル時に保証できる
857デフォルトの名無しさん
2022/03/30(水) 21:06:36.60ID:UJJsLtPb RustでC#のdynamicみたいなことやるにはどうするの?
858デフォルトの名無しさん
2022/03/30(水) 21:23:30.04ID:yBbOBLyf >>849
全然ちゃうわww
全然ちゃうわww
859デフォルトの名無しさん
2022/03/30(水) 21:25:28.30ID:9xKIjqbP >>857
C#はdynamic型という間違った方法を取ったため
C#は実行時エラーおよび実行時例外が発生し安全でない
Rustは型とは直行するトレイトがあるため
複数の様々な型に対して共通する振る舞いをトレイトとして実装できる
これらはコンパイル時にチェックされ実行時の安全性が保証される
更に加えてトレイトの利用方法は用途に向けて2種類用意されている
1つは利用時にimpl Traitで宣言する静的なトレイト利用であり
複数の様々な型に対して各々の静的に異なるコードが適用され高速である
もう1つは利用時にdyn Traitで宣言する動的なトレイト利用であり
複数の様々な型に対して実行時にダイナミックにディスパッチし柔軟である
2種類ともにコンパイル時にチェック確定するため
Rustではこれら実行時にエラーや例外が起きることはない
C#はdynamic型という間違った方法を取ったため
C#は実行時エラーおよび実行時例外が発生し安全でない
Rustは型とは直行するトレイトがあるため
複数の様々な型に対して共通する振る舞いをトレイトとして実装できる
これらはコンパイル時にチェックされ実行時の安全性が保証される
更に加えてトレイトの利用方法は用途に向けて2種類用意されている
1つは利用時にimpl Traitで宣言する静的なトレイト利用であり
複数の様々な型に対して各々の静的に異なるコードが適用され高速である
もう1つは利用時にdyn Traitで宣言する動的なトレイト利用であり
複数の様々な型に対して実行時にダイナミックにディスパッチし柔軟である
2種類ともにコンパイル時にチェック確定するため
Rustではこれら実行時にエラーや例外が起きることはない
860デフォルトの名無しさん
2022/03/30(水) 21:55:25.20ID:qIK9n1MF > Rustではこれら実行時にエラーや例外が起きることはない
実行時にメモリが足りなくなったら、Rustで書かれたプログラムは
どんな挙動を返すの?
実行時にメモリが足りなくなったら、Rustで書かれたプログラムは
どんな挙動を返すの?
861デフォルトの名無しさん
2022/03/30(水) 21:57:54.53ID:UJJsLtPb それだと使えないなぁ。
862デフォルトの名無しさん
2022/03/30(水) 21:58:03.62ID:qIK9n1MF863デフォルトの名無しさん
2022/03/30(水) 22:00:39.04ID:T6u2kz/X 毎度のことながら複オジのアホ解説読むと
Rust勧めてるのはこのレベルの人なのかと悲しくなる
無知にも程がある
Rust勧めてるのはこのレベルの人なのかと悲しくなる
無知にも程がある
864デフォルトの名無しさん
2022/03/30(水) 22:05:28.12ID:qUkXH45r >>860
それちゃんとよく読めよ
C#のdynamic型に対応するものの話だろ
ちなみにRustではメモリアロケータも変更可能&自作も可能でベアメタル含めて任意の環境に対応できる
だからメモリ不足時の対応も自由にできてOS等も書ける
もちろん一番単純な対処としてはpanic
それちゃんとよく読めよ
C#のdynamic型に対応するものの話だろ
ちなみにRustではメモリアロケータも変更可能&自作も可能でベアメタル含めて任意の環境に対応できる
だからメモリ不足時の対応も自由にできてOS等も書ける
もちろん一番単純な対処としてはpanic
865デフォルトの名無しさん
2022/03/30(水) 22:07:51.84ID:jqrh8rWF866デフォルトの名無しさん
2022/03/30(水) 22:11:11.16ID:bu0twkVZ867デフォルトの名無しさん
2022/03/30(水) 22:14:11.74ID:UJJsLtPb 対象なオブジェクトがrust内にあるわけでも存在してるかさえわからない状態なんだから、
実行時にはエラーや例外が発生すると思うのだが...
実行時にはエラーや例外が発生すると思うのだが...
868デフォルトの名無しさん
2022/03/30(水) 22:25:39.59ID:ALQUZfnd869デフォルトの名無しさん
2022/03/30(水) 22:26:22.84ID:qIK9n1MF >>866
お前がナー
お前がナー
870デフォルトの名無しさん
2022/03/30(水) 22:31:08.47ID:YEeL7eMZ >>867
それはC#でdynamic型を使って問題を解決している例ではないのでは?
例えばWebのDOM操作など色んな異なる型が返ってくるときのためにC#ではdynamic型を使う
Rustではそういう時にトレイトを使うので色んな異なる型が返ってきても対応できる
それはC#でdynamic型を使って問題を解決している例ではないのでは?
例えばWebのDOM操作など色んな異なる型が返ってくるときのためにC#ではdynamic型を使う
Rustではそういう時にトレイトを使うので色んな異なる型が返ってきても対応できる
871デフォルトの名無しさん
2022/03/30(水) 22:34:21.72ID:qIK9n1MF872デフォルトの名無しさん
2022/03/30(水) 22:37:02.42ID:qIK9n1MF873デフォルトの名無しさん
2022/03/30(水) 22:42:11.12ID:OkNrkUse874デフォルトの名無しさん
2022/03/30(水) 22:47:22.15ID:4xlnCCQ3 >>860
君は頭が悪いな
C#のdynamic型は失敗仕様であるという話だぜ
メモリが十分にあっても実行時エラーや例外で死んでしまう
コンパイラが検知できない仕様なためミスがあっても通してしまうからだ
君は頭が悪いな
C#のdynamic型は失敗仕様であるという話だぜ
メモリが十分にあっても実行時エラーや例外で死んでしまう
コンパイラが検知できない仕様なためミスがあっても通してしまうからだ
875デフォルトの名無しさん
2022/03/30(水) 22:50:27.28ID:NgOFxdTU876デフォルトの名無しさん
2022/03/30(水) 23:09:24.22ID:4bDt5Vb4 dynamic自体は名前がわかってるreflectionをいちいち書くのダルいから妥当な導入ではある
ジェネリクスにC++20のrequiresみたいな制限があればdynamicなんていらなかったのは確かだが
ジェネリクスにC++20のrequiresみたいな制限があればdynamicなんていらなかったのは確かだが
877デフォルトの名無しさん
2022/03/30(水) 23:15:44.80ID:SheiVyTd 実行時になってようやくエラーを引き起こし得るdynamicはC#の設計ミス
C++やRustは異なる解決をしている
C++やRustは異なる解決をしている
878デフォルトの名無しさん
2022/03/30(水) 23:59:52.46ID:Lj4LP6Zg dynamicってそもそもリフレクション+式木でしょうが
こんなもん使うな
ジェネリック使え
こんなもん使うな
ジェネリック使え
879デフォルトの名無しさん
2022/03/31(木) 00:03:05.89ID:EY1WgKK4 tagged-unionだよ
880デフォルトの名無しさん
2022/03/31(木) 00:24:36.68ID:LBSBAbTE ミスった時にコンパイルエラーを出せない仕様はよくないな
>>859
Rustでの対応は3種類だな
(1) ジェネリックにトレイト境界で制約して静的にモノモーフィゼーション
(2) ジェネリックにトレイト境界で制約して動的にディスパッチ
(3) enumでタグ付け収容して処理時分岐
いずれもプログラミングでミスれば実行時ではなくコンパイル時に早期エラー発覚できる
>>859
Rustでの対応は3種類だな
(1) ジェネリックにトレイト境界で制約して静的にモノモーフィゼーション
(2) ジェネリックにトレイト境界で制約して動的にディスパッチ
(3) enumでタグ付け収容して処理時分岐
いずれもプログラミングでミスれば実行時ではなくコンパイル時に早期エラー発覚できる
881デフォルトの名無しさん
2022/03/31(木) 01:54:42.49ID:sTE3Pr3t882デフォルトの名無しさん
2022/03/31(木) 15:47:20.37ID:TWJkYixT883デフォルトの名無しさん
2022/03/31(木) 16:56:25.59ID:+qzJxbYZ >>882
上にも書いたけど自由度は高いと思うけど忘れたり間違えたりしそうで怖い
上にも書いたけど自由度は高いと思うけど忘れたり間違えたりしそうで怖い
884デフォルトの名無しさん
2022/03/31(木) 17:43:45.66ID:TWJkYixT デストラクタを正しく書く方が簡単で間違いと考えてる?あんまり理解できんな。
885デフォルトの名無しさん
2022/03/31(木) 18:24:33.50ID:wBL3yx/w886デフォルトの名無しさん
2022/03/31(木) 18:47:26.32ID:d1Z8MU3o887デフォルトの名無しさん
2022/04/02(土) 20:19:43.92ID:Yphv2UuC https://discourse.llvm.org/t/rfc-lifetime-annotations-for-c/61377
clangの独自拡張としてだけどC++にlifetime入れようという議論があるんだね
clangの独自拡張としてだけどC++にlifetime入れようという議論があるんだね
888デフォルトの名無しさん
2022/04/02(土) 20:54:43.62ID:ezdDFz2p ライフタイム導入すればコンパイル時点でバグを発見できて
実行時の無駄なデバッグを減らせるし
メモリ関係の未知のセキュリティバグもコンパイル時点で検出できるもんな
実行時の無駄なデバッグを減らせるし
メモリ関係の未知のセキュリティバグもコンパイル時点で検出できるもんな
889デフォルトの名無しさん
2022/04/02(土) 22:41:04.77ID:5MtdHF70 これ以上C++を接ぎ木してこねくり回すの止めにしたら
890デフォルトの名無しさん
2022/04/03(日) 11:55:08.48ID:W9pHkRzU >>887
でもrustと同じならdoubly linked listは表現出来ないんでしょ?
でもrustと同じならdoubly linked listは表現出来ないんでしょ?
891デフォルトの名無しさん
2022/04/03(日) 12:04:52.85ID:llhYZSlD >>889
C++ってかわいそうな運命だよなあ
C++ってかわいそうな運命だよなあ
892デフォルトの名無しさん
2022/04/03(日) 16:13:05.78ID:9lFqLTmO >>890
それはlifetime関係なくてxor mutabilityの話だよね
それはlifetime関係なくてxor mutabilityの話だよね
893デフォルトの名無しさん
2022/04/03(日) 16:37:52.29ID:W9pHkRzU >>892
なるほど
なるほど
894デフォルトの名無しさん
2022/04/03(日) 17:12:35.56ID:Qom6hzMo >>890
Rustでは出来るよ
Rustでは出来るよ
895デフォルトの名無しさん
2022/04/03(日) 17:28:58.27ID:FsLhH6TX >>885
そんなの一行書くだけろ。。むしろ意図通りのデストラクタが動いてるか怪しい挙動するデストラクタのが問題起こりまくりだわ。
そんなの一行書くだけろ。。むしろ意図通りのデストラクタが動いてるか怪しい挙動するデストラクタのが問題起こりまくりだわ。
896デフォルトの名無しさん
2022/04/03(日) 17:44:36.67ID:77d+30yb >>895
> そんなの一行書くだけろ。。
できないプログラマーの典型で草
一行書くだけだから確実にできると言うならバグは無くなるわ
> むしろ意図通りのデストラクタが動いてるか怪しい挙動するデストラクタのが問題起こりまくりだわ。
それはお前の能力が足らんだけ
> そんなの一行書くだけろ。。
できないプログラマーの典型で草
一行書くだけだから確実にできると言うならバグは無くなるわ
> むしろ意図通りのデストラクタが動いてるか怪しい挙動するデストラクタのが問題起こりまくりだわ。
それはお前の能力が足らんだけ
897デフォルトの名無しさん
2022/04/03(日) 17:49:59.46ID:rc6NcMYZ >>895
defer使えば怪しい挙動は絶対しないとでも?
defer使えば怪しい挙動は絶対しないとでも?
898デフォルトの名無しさん
2022/04/03(日) 17:57:55.57ID:9lFqLTmO デストラクタでリソースが解放されることを保証するのはデータ構造を定義する人だけど
deferの場合はデータ構造を使う人の責任になる
データ構造を定義する回数と使う回数では普通は後者の方が多くなるから
deferの方が間違いを起こしやすいと
deferの場合はデータ構造を使う人の責任になる
データ構造を定義する回数と使う回数では普通は後者の方が多くなるから
deferの方が間違いを起こしやすいと
899デフォルトの名無しさん
2022/04/03(日) 19:34:48.12ID:W9pHkRzU >>894
実行時にオーバヘッドが出る形でしか実現できないやん
実行時にオーバヘッドが出る形でしか実現できないやん
900デフォルトの名無しさん
2022/04/03(日) 20:40:47.40ID:9lFqLTmO901デフォルトの名無しさん
2022/04/04(月) 09:02:06.19ID:14cK0a9Z >>900
LinkedListってunsafeで実装されてるんだけど静的にメモリセーフティを実現する言語機能があるRustでそれをするっておかしいよね?
それって行儀よく実装するとオーバーヘッドが出ることの裏返しだよね?ちょっとは頭を使おうか?
LinkedListってunsafeで実装されてるんだけど静的にメモリセーフティを実現する言語機能があるRustでそれをするっておかしいよね?
それって行儀よく実装するとオーバーヘッドが出ることの裏返しだよね?ちょっとは頭を使おうか?
902デフォルトの名無しさん
2022/04/04(月) 09:14:12.42ID:y2zkcNcq903デフォルトの名無しさん
2022/04/04(月) 09:31:58.76ID:WSInp7AV >>901
linked listに限らず何でもunsafeで作られているよ
unsafeは悪ではなく、安全なインタフェースを備えた型やモジュールの内部に閉じ込めるもの
その結果Rustではプログラム全体の安全性を保証できる
悪なのはプログラム全体がunsafe状態なC/C++
linked listに限らず何でもunsafeで作られているよ
unsafeは悪ではなく、安全なインタフェースを備えた型やモジュールの内部に閉じ込めるもの
その結果Rustではプログラム全体の安全性を保証できる
悪なのはプログラム全体がunsafe状態なC/C++
904デフォルトの名無しさん
2022/04/04(月) 09:56:40.12ID:88Lrr0N7905デフォルトの名無しさん
2022/04/04(月) 10:04:31.11ID:y2zkcNcq906デフォルトの名無しさん
2022/04/04(月) 10:09:11.84ID:9r+bgOYm >>903
それってRustの型システムに基づいて行儀よく実装するとオーバーヘッドが出ることへの反論になってないよね?
つまりRustの型システムはdoubly linked listを含めたあらゆるデータ構造をオーバーヘッドなく実装できるほどの表現力がないってことだよね
それってRustの型システムに基づいて行儀よく実装するとオーバーヘッドが出ることへの反論になってないよね?
つまりRustの型システムはdoubly linked listを含めたあらゆるデータ構造をオーバーヘッドなく実装できるほどの表現力がないってことだよね
907デフォルトの名無しさん
2022/04/04(月) 10:23:50.48ID:y2zkcNcq >>906
safe rustの範疇ではあらゆるデータ構造を表現できないのはその通り
なのでunsafeというescape hatchを用意している
rustはpureな言語ではないのでコンパイラですべての安全性を保証することは最初から狙ってないよ
safe rustの範疇ではあらゆるデータ構造を表現できないのはその通り
なのでunsafeというescape hatchを用意している
rustはpureな言語ではないのでコンパイラですべての安全性を保証することは最初から狙ってないよ
908デフォルトの名無しさん
2022/04/04(月) 10:34:53.41ID:M7C/Fpbq >>906
それは違う
例えばVec(ベクタ)はRustが標準ライブラリで提供している型だが
LinkedList(二重リンクリスト)もRustが標準ライブラリで提供している型である
VecもLinkedListも内部でunsafeを用いているが安全なインタフェースのみを公開している
その両者に違いはなくRustによる安全性の保証に何も問題を及ぼしていない
それは違う
例えばVec(ベクタ)はRustが標準ライブラリで提供している型だが
LinkedList(二重リンクリスト)もRustが標準ライブラリで提供している型である
VecもLinkedListも内部でunsafeを用いているが安全なインタフェースのみを公開している
その両者に違いはなくRustによる安全性の保証に何も問題を及ぼしていない
909デフォルトの名無しさん
2022/04/04(月) 13:39:53.90ID:RabHiWd3 オーバーヘッドwってことでいいじゃん
中途半端な知識でムキになるから無駄なやり取りが続くんだよ
中途半端な知識でムキになるから無駄なやり取りが続くんだよ
910デフォルトの名無しさん
2022/04/04(月) 15:17:06.36ID:ilb8jjlp >>908
> VecもLinkedListも内部でunsafeを用いているが安全なインタフェースのみを公開している
ホントかなぁ。 ベクターやリストが管理するオブジェクト参照を、別の参照ポインタ
に代入して、ベクターやリストを破棄した後で参照を使うとぬるぽになりそうだけど?
これを防ぐには、ベクターやリスト自体はもちろん、各要素や生ポインタを含めて
あらゆる変数に参照カウンタを設けた上で、参照数が0になったタイミングでオブ
ジェクト自動破棄する必要があるが、まさにオーバーヘッド。
> VecもLinkedListも内部でunsafeを用いているが安全なインタフェースのみを公開している
ホントかなぁ。 ベクターやリストが管理するオブジェクト参照を、別の参照ポインタ
に代入して、ベクターやリストを破棄した後で参照を使うとぬるぽになりそうだけど?
これを防ぐには、ベクターやリスト自体はもちろん、各要素や生ポインタを含めて
あらゆる変数に参照カウンタを設けた上で、参照数が0になったタイミングでオブ
ジェクト自動破棄する必要があるが、まさにオーバーヘッド。
911デフォルトの名無しさん
2022/04/04(月) 18:59:43.72ID:RDBERkGC rustって、unsafe使っていても
メモリ安全のチェックはしてくれるって事であってる?
メモリ安全のチェックはしてくれるって事であってる?
912デフォルトの名無しさん
2022/04/04(月) 19:11:22.90ID:vi3Hd2oR913デフォルトの名無しさん
2022/04/04(月) 19:18:31.93ID:UrWVuubJ rustって、制限きついなら制限緩い他の言語に変換しやすいとかある?
914デフォルトの名無しさん
2022/04/04(月) 20:04:42.98ID:0mSmJ0PC 標準ライブラリに問題がないって言い切れるの?
コンパイラとか標準ライブラリを盲信できるほど完成度高いんですかね
盲信してると不具合の発見に支障が出そう
コンパイラとか標準ライブラリを盲信できるほど完成度高いんですかね
盲信してると不具合の発見に支障が出そう
915デフォルトの名無しさん
2022/04/04(月) 20:07:34.39ID:Aq9lII9f 嫌なら使わなければいいだけやろ
916デフォルトの名無しさん
2022/04/04(月) 20:19:31.81ID:VNZL7sLo >>910
そんなRustの初歩くらいは学んでからレスしようぜw
そんなRustの初歩くらいは学んでからレスしようぜw
917デフォルトの名無しさん
2022/04/04(月) 20:23:28.80ID:y2zkcNcq >>914
プログラムがバグった時にまず自分のコードを疑うべきと言える程度には信頼できると思うよ
プログラムがバグった時にまず自分のコードを疑うべきと言える程度には信頼できると思うよ
918デフォルトの名無しさん
2022/04/04(月) 20:28:34.57ID:88Lrr0N7 >>916
オーバーヘッドなのは否定できてなくて草
オーバーヘッドなのは否定できてなくて草
919デフォルトの名無しさん
2022/04/04(月) 20:41:28.56ID:y2zkcNcq >>910
> ベクターやリストが管理するオブジェクト参照を、別の参照ポインタ
> に代入して、ベクターやリストを破棄した後で参照を使うとぬるぽになりそうだけど?
以下のようなコードを意図してるんだと思うけど rust だとコンパイルエラーになるよ
let v = vec![Box::new(1), Box::new(2)];
let ptr = &v[1];
drop(v);
println!("{ptr}");
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=f4b4be3e93f71ec0828c6039dd156cb7
> ベクターやリストが管理するオブジェクト参照を、別の参照ポインタ
> に代入して、ベクターやリストを破棄した後で参照を使うとぬるぽになりそうだけど?
以下のようなコードを意図してるんだと思うけど rust だとコンパイルエラーになるよ
let v = vec![Box::new(1), Box::new(2)];
let ptr = &v[1];
drop(v);
println!("{ptr}");
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=f4b4be3e93f71ec0828c6039dd156cb7
920デフォルトの名無しさん
2022/04/04(月) 20:48:51.57ID:ZmDtAG5s921デフォルトの名無しさん
2022/04/04(月) 21:00:31.84ID:V8HUi7lD 殆どの言語が標準ライブラリはバグってたりセキュリティの穴見つかったりして更新し続けてるがな。
922デフォルトの名無しさん
2022/04/04(月) 21:11:15.35ID:y9KalPQq メモリ安全性に関していえば
Rustなら不具合の可能性があるのはコンパイラとライブラリのunsafe領域だけだけど
(しかもそれらはそこそこの人数でチェックされている)
C/C++の場合ありとあらゆる箇所で可能性があるからな
盲信とかでなく単純に引く確率が低い
Rustなら不具合の可能性があるのはコンパイラとライブラリのunsafe領域だけだけど
(しかもそれらはそこそこの人数でチェックされている)
C/C++の場合ありとあらゆる箇所で可能性があるからな
盲信とかでなく単純に引く確率が低い
923デフォルトの名無しさん
2022/04/04(月) 21:11:46.66ID:yn3hKO4L libcにもバグあるしそれどころか
カーネルもヤバい問題発覚することがある
もうパソコンを窓から投げ捨てよう
カーネルもヤバい問題発覚することがある
もうパソコンを窓から投げ捨てよう
924デフォルトの名無しさん
2022/04/04(月) 21:41:12.90ID:dNgOu4No >>921
だからそれお前が見つけたのか?
だからそれお前が見つけたのか?
925デフォルトの名無しさん
2022/04/04(月) 22:18:49.72ID:yJV2c6am 初心者ほど「コンパイラのバグ」などと言い出す
ダニング=クルーガー効果である
ダニング=クルーガー効果である
926デフォルトの名無しさん
2022/04/04(月) 23:05:18.52ID:jLJ2cB6c927デフォルトの名無しさん
2022/04/05(火) 06:13:13.50ID:l+kYPJyP そろそろ飽きろよこの流れ
928デフォルトの名無しさん
2022/04/05(火) 09:01:35.21ID:rwKxODkm >>926
Rustはunsafe内のメモリ関連のバグまでは検出しないけど?
例えRustには無知だとしてもunsafeという語感からだけでunsafe内では何も保証されないってことは推測できるよね?
Rustはunsafe内のメモリ関連のバグまでは検出しないけど?
例えRustには無知だとしてもunsafeという語感からだけでunsafe内では何も保証されないってことは推測できるよね?
929デフォルトの名無しさん
2022/04/05(火) 09:22:45.52ID:i/q849BZ930デフォルトの名無しさん
2022/04/05(火) 11:55:20.23ID:Md/fZtCu 2038年問題を再発させるコードが多数の場所にコピーされてしまっている
ttps://gigazine.net/news/20220330-2038-problem/
> エイドリアンさんが調べた限りでは、下記のリポジトリにて問題のあるコードが使用されていたとのことです。
>
> O3DE
> Dokany
> Ceph-Dokan
> libarchive
> ghc::filesystem
> ImageMagick
> Cxbx-Reloaded
> ReactOS
>
> また、下記のリポジトリについては記事作成時点で既にエイドリアンさんの指摘を受けてコード修正済みとなっていました。
>
> OpenRCT2
> DuckStation
ttps://gigazine.net/news/20220330-2038-problem/
> エイドリアンさんが調べた限りでは、下記のリポジトリにて問題のあるコードが使用されていたとのことです。
>
> O3DE
> Dokany
> Ceph-Dokan
> libarchive
> ghc::filesystem
> ImageMagick
> Cxbx-Reloaded
> ReactOS
>
> また、下記のリポジトリについては記事作成時点で既にエイドリアンさんの指摘を受けてコード修正済みとなっていました。
>
> OpenRCT2
> DuckStation
931デフォルトの名無しさん
2022/04/06(水) 03:36:26.34ID:A9app5rs932デフォルトの名無しさん
2022/04/06(水) 03:42:32.00ID:ryRy0Ktk933デフォルトの名無しさん
2022/04/06(水) 04:46:14.51ID:MueoLJZZ エスパーさせんな、コードで示せ
934デフォルトの名無しさん
2022/04/06(水) 09:00:45.09ID:Z4fh8uHR >>931
見事な恥の上塗りでワロタ
見事な恥の上塗りでワロタ
935デフォルトの名無しさん
2022/04/06(水) 09:22:57.25ID:A9app5rs936デフォルトの名無しさん
2022/04/06(水) 09:29:13.74ID:OcEMaDN/937デフォルトの名無しさん
2022/04/06(水) 10:57:59.47ID:X0SajXCN >>931
エラーになるよ
use std::{thread, time::Duration};
fn main() {
let v = vec![Box::new(1), Box::new(2)];
thread::spawn(|| {
thread::sleep(Duration::from_secs(100000));
let ptr = &v[1];
println!("{ptr}");
});
drop(v);
}
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=6ffcf2e259e138e27d653db6fdd4fc98
エラーになるよ
use std::{thread, time::Duration};
fn main() {
let v = vec![Box::new(1), Box::new(2)];
thread::spawn(|| {
thread::sleep(Duration::from_secs(100000));
let ptr = &v[1];
println!("{ptr}");
});
drop(v);
}
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=6ffcf2e259e138e27d653db6fdd4fc98
938デフォルトの名無しさん
2022/04/06(水) 11:01:15.13ID:BAnc7YwE >>935
C++相当のコードか擬似コードでもいいからお前が言う操作のコードを出せ
スレッド間操作か参照の使い方周りでC++でもぶっ壊れるやつな
Rust使いの誰かがコンパイルの通しようがないって教えてくれるだろうよ
C++相当のコードか擬似コードでもいいからお前が言う操作のコードを出せ
スレッド間操作か参照の使い方周りでC++でもぶっ壊れるやつな
Rust使いの誰かがコンパイルの通しようがないって教えてくれるだろうよ
939デフォルトの名無しさん
2022/04/06(水) 11:41:09.81ID:A9app5rs >>397
それ、同じmain()スコープの中で宣言しているローカル関数だからでは?
普通、そんな書き方せんでしょ。
thread::spawnで起動している、無名関数を、引数ありの独立した関数として
定義して、参照渡しとしてスレッド実行した場合、コンパイル時の静的解析
ではエラー検出できない。
それ、同じmain()スコープの中で宣言しているローカル関数だからでは?
普通、そんな書き方せんでしょ。
thread::spawnで起動している、無名関数を、引数ありの独立した関数として
定義して、参照渡しとしてスレッド実行した場合、コンパイル時の静的解析
ではエラー検出できない。
940デフォルトの名無しさん
2022/04/06(水) 11:55:40.05ID:KqMgG2U/ 流石にこのレベルの人を叩いて悦に入るのはやめようぜ
941デフォルトの名無しさん
2022/04/06(水) 12:00:23.11ID:a0CdlgS1942デフォルトの名無しさん
2022/04/06(水) 15:45:42.18ID:MueoLJZZ thread::spawnには引数無しのクロージャしか渡せません
pthread_createとかで明示的にvoid *を渡すのに相当する処理は、Rustだとこの引数無しクロージャにキャプチャさせる方法で実現されます
で、それをやってるのが>>937です
pthread_createとかで明示的にvoid *を渡すのに相当する処理は、Rustだとこの引数無しクロージャにキャプチャさせる方法で実現されます
で、それをやってるのが>>937です
943デフォルトの名無しさん
2022/04/06(水) 16:11:31.38ID:Dn8F6G2j >>924
VCいじってりゃ嫌でもforループ前の初期化バグにぶち当たるわ。
最適化オプション下げるとか、for内でやるのをやめるとかいろいろ修正方法はあるが。
むしろいままでコンパイラバグに当たらない方が不思議。
お前仕事してんのかって疑われるレベル。
VCいじってりゃ嫌でもforループ前の初期化バグにぶち当たるわ。
最適化オプション下げるとか、for内でやるのをやめるとかいろいろ修正方法はあるが。
むしろいままでコンパイラバグに当たらない方が不思議。
お前仕事してんのかって疑われるレベル。
944デフォルトの名無しさん
2022/04/06(水) 16:23:15.68ID:2Jp54xD1 forループ前の初期化バグってどんなの?
945デフォルトの名無しさん
2022/04/06(水) 17:07:47.57ID:X0SajXCN >>931
こういうこと?これもエラーになる。
use std::{thread, time::Duration};
fn main() {
let v = vec![Box::new(1), Box::new(2)];
thread::spawn(|| sub(&v[1]));
drop(v);
}
fn sub(ptr: &i32) {
thread::sleep(Duration::from_secs(100000));
println!("{ptr}");
}
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=d90b955b8539696c776b1d44b0e8c5a9
ちなみにこれはコンパイルが通る
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=38157f3760d2ce9dde7d9d22c74195ad
これは通らない
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=38157f3760d2ce9dde7d9d22c74195ad
こういうこと?これもエラーになる。
use std::{thread, time::Duration};
fn main() {
let v = vec![Box::new(1), Box::new(2)];
thread::spawn(|| sub(&v[1]));
drop(v);
}
fn sub(ptr: &i32) {
thread::sleep(Duration::from_secs(100000));
println!("{ptr}");
}
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=d90b955b8539696c776b1d44b0e8c5a9
ちなみにこれはコンパイルが通る
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=38157f3760d2ce9dde7d9d22c74195ad
これは通らない
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=38157f3760d2ce9dde7d9d22c74195ad
946デフォルトの名無しさん
2022/04/06(水) 17:09:04.34ID:X0SajXCN >>945
URL間違えた
コンパイル通るやつ
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=10577ae2a6cdd42a9815971f82772c3a
コンパイル通らないやつ
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=9080880c0cab4626cd94cf4806b2e5a2
URL間違えた
コンパイル通るやつ
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=10577ae2a6cdd42a9815971f82772c3a
コンパイル通らないやつ
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=9080880c0cab4626cd94cf4806b2e5a2
947デフォルトの名無しさん
2022/04/06(水) 17:18:09.35ID:vFuVta1u >>943
具体的に書けよw
具体的に書けよw
948デフォルトの名無しさん
2022/04/06(水) 18:45:31.77ID:A9app5rs >>945
> こういうこと?これもエラーになる。
Rustの文法がよう判らんけど、おおむね合ってると思う。
ちなみに、C/C++だと大規模プログラム開発を想定して、ソース分割による分割
コンパイルや、ライブラリ化という仕組みがあるわけだが、Rustの言語仕様って
そのあたりどうなん?
例えば、スレッド関数「fn sub(ptr: &i32)」が、「fn main() 」を別のファイルに
(例: main.cpp, sub.cpp のように)実装してビルドするとか、スレッド関数の
「fn sub(ptr: &i32)」だけをライブラリ(dllまたはlib)化するとかできるの?
そもそも、Rust でライブラリを書いたり、Rust で書いたプログラムって、他の
言語で書かれたライブラリ(OpenCVとか)とリンクできるのか?
> こういうこと?これもエラーになる。
Rustの文法がよう判らんけど、おおむね合ってると思う。
ちなみに、C/C++だと大規模プログラム開発を想定して、ソース分割による分割
コンパイルや、ライブラリ化という仕組みがあるわけだが、Rustの言語仕様って
そのあたりどうなん?
例えば、スレッド関数「fn sub(ptr: &i32)」が、「fn main() 」を別のファイルに
(例: main.cpp, sub.cpp のように)実装してビルドするとか、スレッド関数の
「fn sub(ptr: &i32)」だけをライブラリ(dllまたはlib)化するとかできるの?
そもそも、Rust でライブラリを書いたり、Rust で書いたプログラムって、他の
言語で書かれたライブラリ(OpenCVとか)とリンクできるのか?
949デフォルトの名無しさん
2022/04/06(水) 18:47:00.11ID:4TDuv4YW pythonのライブラリとかgithubにいくらでもあるけど?
950デフォルトの名無しさん
2022/04/06(水) 18:52:54.88ID:X0SajXCN >>948
モジュール分割は普通に備えてる
というかC/C++のモジュール分割は貧弱な方で、大半の言語はまともな仕組み備えてるよ
Rustでライブラリ作ってCから呼び出したり、CのライブラリをRustから呼び出すこともランタイムとかめんどくさいこと考えずに普通にできる
モジュール分割は普通に備えてる
というかC/C++のモジュール分割は貧弱な方で、大半の言語はまともな仕組み備えてるよ
Rustでライブラリ作ってCから呼び出したり、CのライブラリをRustから呼び出すこともランタイムとかめんどくさいこと考えずに普通にできる
951デフォルトの名無しさん
2022/04/06(水) 22:27:56.00ID:MiVqlX0M Rustのモジュール分割はC/C++の分割コンパイルとはちょっと違う気がする
C/C++だとソースファイルごとにコンパイルしてオブジェクト(.o)作ってからリンカでまとめるけど
Rustは最初にcrate内のソースを1つにまとめてから一気にコンパイルする感じ
(見えない部分で分割してるっぽいけどソースファイル単位じゃないしプログラマは意識しない)
C/C++の.dllとか.libに対応するのはRustだとcrateになるからsubだけライブラリ化するなら
ファイルを分けるというよりプロジェクト(crate)を分ける感じになるかな
C/C++の.oに相当する中間ファイルはRustだと存在しないはず
C/C++だとソースファイルごとにコンパイルしてオブジェクト(.o)作ってからリンカでまとめるけど
Rustは最初にcrate内のソースを1つにまとめてから一気にコンパイルする感じ
(見えない部分で分割してるっぽいけどソースファイル単位じゃないしプログラマは意識しない)
C/C++の.dllとか.libに対応するのはRustだとcrateになるからsubだけライブラリ化するなら
ファイルを分けるというよりプロジェクト(crate)を分ける感じになるかな
C/C++の.oに相当する中間ファイルはRustだと存在しないはず
レス数が950を超えています。1000を超えると書き込みができなくなります。
ニュース
- 債券・円・株「トリプル安」に…長期金利1.755%まで上昇、円は対ユーロで史上最安値 [蚤の市★]
- 中国側が首相答弁の撤回要求、日本側拒否★2 [夜のけいちゃん★]
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★5 [ぐれ★]
- 【中国外務省】日中関係悪化は高市氏に責任と名指しで非難… ★6 [BFU★]
- 映画「鬼滅の刃」の興行収入急減、日本行き航空券大量キャンセル…中国メディア報道 [蚤の市★]
- 【音楽】Perfume・あ~ちゃんの結婚相手「一般男性」は吉田カバンの社長・吉田幸裕氏(41) 高身長で山本耕史似 [Ailuropoda melanoleuca★]
- 【高市悲報】日経、株安円安止まらない😭ああ…あ… [359965264]
- 日本メディア「外務省局長が頭下げてる画像が拡散されているのは中国のプロパガンダ!」日本メディアも使いまくってるのに [624898991]
- ホテル業界、高市のせいで中国から大量キャンセル 「大変厳しい状態。一刻も早い収束を願います」 [271912485]
- 【正論】玉木雄一郎「高市さんの答弁は米軍が攻撃を受けた場合を前提としており、撤回するのは難しい」特定野党を完全論破 [519511584]
- 【朗報】ケンモジさん、『男磨きハウス』に出演してイケオジに大変身wwwwww [153490809]
- 鈴木農水大臣「コメの価格が上がってるのは新米に切り替わったからです」 [256556981]
