結局C++とRustってどっちが良いの? 2traits
■ このスレッドは過去ログ倉庫に格納されています
「C++の色々配慮してめんどくさい感じは好きだけど、実務になったらメモリ安全性とか考えて今後Rustに変わっていくんかな」 「うだうだ言ってないで仕事で必要なのをやればいいんだよ、趣味なら好きなのやればいい」 っていうスレ。 前スレ: 結局C++とRustってどっちが良いの? https://mevius.5ch.net/test/read.cgi/tech/1677286186/ 大手IT企業は揃ってC++ではダメだと判断してRustへ移行しつつあるのに 底辺は真逆でRustはダメでC++に拘るのはなぜ? あっちにもスレあったんだけどね、あんま流行ってなかったから マの問題じゃない、言語がイイんだ! ってgdgdやるのがいいみたいだ Google&MS「バグの70%はC/C++。Rustにする」 https://medaka.5ch.net/test/read.cgi/prog/1619943288/ ほんとにマの問題なら、>>1 で終わってしまうw >>11 DQNだから言語的になんら優位性のないC++に固執している 過去の遺産だけはC++の優位性があるがそれすら時間とともに置き換わっていく Rustは難しくない。そうだろ? 大手が本格的に移行しはじめてからでも、全然遅かねえんだよ ま、C++を捨てられないってのは、このスレだけの内緒だけどな! Rustに移行ってのは、採用された程度じゃ移行じゃない APIに、Rustの所有権・マルチスレッド関係のシグネチャが付くようになって、ようやっとだ その日はくる そして、Rustの独占は揺らぐ C++を捨てたんなら、no_mangle とか、まさか、extern "C" とかいう呪詛を唱えてないよな? 移行っていう以上、そういうの要らないんだよ C++が、こっちから適合してやっからよ 複おじはね、承認に飢えた構ってちゃんなのよ この紛うことなきクソスレを隔離スレ化して構い続けてあげれば、他スレの被害を最小限にできるって寸法よ こんなクソゴミスレを存続させる意義はここにある 君たちも>>5 は知識として覚えておいて、そこらでそれっぽい書き込みを見ても一切反応しちゃいけないぞ ディスパッチはディスパッチだろ、くらいに思ってたのに、 Rustの優位性を説明するキーワードのひとつなのね もうちょっと勉強してからそのへんはゆっくり読む罠 ついていけん C++を捨てろって言われると猛然と怒るけど、 じゃRust使わないのかって聞かれると、いやじゃんじゃん使うよ必要ならって答える それがC++er >>19 >Rustの優位性を説明するキーワードのひとつなのね 静的ディスパッチ/動的ディスパッチの違いは 基本としておさえておくべきポイントというだけで Rustに明確な優位性があるわけではないよ vtableの持ち方の違いもトレードオフだから 何に重きを置くかによってRustがやや有利な場合もあればC++が有利な場合もある >前スレ >Rust派は、Rustなら、必ず・全部安全 doubt そりゃC++よりは安全だろうけど 少なくともメモリ管理において、Rustの安全性って、数学的に保証されるものなの? >>24 定義次第だと思うのでメモリ管理以外で「安全性が数学的に保証されてる」と思ってる例をいくつかあげてみて あ、わかった Rustがsafeといっても、定義次第なんだね >>26 Rustに関係なく「安全かどうか」は定義次第だからね ていうか、こっちに定義を聞いてこられても困るんだよね この定義において、Rustはここまで安全、って言ってもらえると、それを遵守するんだから >>30 数学的に安全性が保証されてるかどうかを質問してるにも関わらず 「数学的に安全性が保証されてる」とはどういう定義なのか聞かれたら困るのか それじゃどうしようもないな 数学的に安全性が保証されてるっぽい何かがあるんだろ? ってなことだよ 根拠もなしに、安全か? そりゃC++よりマシだろうけどさw そんな難しいことを考えなくても Rustの所有権システムをC++で体験したければ インスタンスを作るときに 必ず常にmake_uniqueかmake_sharedするようにすれば だいたい同じ振る舞いになる 安全性は保証される C++ってstd::move(x)した後にx使うとコンパイラに怒られるの? コンパイラは怒らないから 静的解析ツールが必要だね C++はコンパイルとは別に静的解析とデバッグ解析が不可欠だからな Rustはコンパイラがメモリ安全からデータ競合安全まで保証してくれるのでかなり楽 デバッグ解析てなんやねん コンパイラがやる静的解析の範囲が広いというだけでRustでも静的解析・動的解析は基本不可欠 clippy, rustfix, rust-fmt, cargo-expand辺りは静的解析ツールの一種 まともにrustかけるやつって例外なくc++もかけるけどな。 Rustだって、まともにって難しいだろ、たぶん 俺は簡単に使いたい >>39 は >>36 「安全」に描こうとするとコピーが大量に発生するのか >>31 Rust は(限られた範囲において)常に安全ω(キリっ C++er あるあるシリーズ #![allow(unused)] ... = hoge().unwrap; ... = hoge()?; let p: *const [u8] = &fuga; unsafe {} >>37 C++のスマポの使い方をミスっても公式支援がない話でそれらは的外れかなあ clippyはRust公式リント rustfixはRustコンパイラのよる提案の適用 rust-fmtは清書 cargo-expandはマクロ展開 >>41 Rustはムダなコピーを発生させずに参照を使って安全にメモリ管理できる言語 もしRustで不可能なケースがあったらそれはC++でも不可能で元から無理筋 >>44 それはRustの実装が一つしかないのを公式と言っているに過ぎない C++でデバッガが用意されていない開発環境は無い? もしくは使われていないのでは? >>44 誰もが使ってるツールにわざわざ説明つけてるところ見ると基本の静的解析ツールも知らなかったんだな 複オジは所詮このレベルだから全く信用できない >>45 C++は選択ができる 値とポインタ(スマートポインタ)と参照(左辺値と右辺値) 冗長に書くも効率的に書くもプログラマ次第 素人にはオススメしない >>49 それはどちらも同じ 所有権を持つ: C++のスマポ、Rustの変数 所有権を持たない: C++とRustの参照 ただしライフタイムが管理できるRustの参照の方が強力かつ安全 >>50 「ライフタイムが管理できるRustの参照」って何? 単に参照先が死んでることをコンパイラで弾くことを「管理」って言ってるの? Rustの宣伝文だけ読んで他言語を知った気になり Rustの宣伝文を5chにコピペし続けるだけの人生 >>50 C++の参照とRustの参照はかなり違うぞ C++の参照はちょっとミスるとダングリングになる 「数学的」連呼してる割には名前に直交性が無いな .iter .indexed_iter .iter_mut .indexed_iter_mut .outer_iter .outer_iter_mut not exist .indexed_iter_mut not exist .enumerate_iter_mut .enumerate_pixels_mut いちいち覚えてられるか? 違ったので訂正 誤 not exist .indexed_iter_mut 正 not exist .indexed_outer_iter_mut あ。「数学的」連呼してたのは、C++側の俺 そして、あんまり、数学的な安全の論拠ってのはみつからない ありゃあC++で真似するんだよ 手本にしない手はない >>56 各ライブラリで命名方針が異なるのは、プログラミング言語の比較の話と全く無関係じゃね? あと、enumerate_pixels_mutをその提案のenumerate_iter_mutとしてしまったら、肝心なピクセルが消えて意味不明じゃん。 雑談としては、そのへんも「きれい」になってくれるとありがたいね これはC++も同様 直交性の意味がよく分からなかった index_of(先頭から検索)とlast_index_of(末尾から検索)は直交性がないことになるのかな 標準と非標準の関係で考えると自然な命名だと思うけど かわいそうだから答えてやるか 数学的な保証が云々ってたぶんRustBeltプロジェクトのことだよね https://plv.mpi-sws.org/rustbelt/ Rust 安全 論文、で上手く引き当てられなかったんだよ 仕事サボって、ちょっと読んでみるw >>63 いや、いいんだ。「それっぽいの」って俺も言った。 >>62 unsafeを使ってsafeなインタフェースを作っている部分、すなわち人間が安全性を保証しなければならなかった部分を、数学的に保証する試みがあるのか そこも気を付けて読んでみるけど、 unsafeを撲滅しようと思ったら、SoCのサポートが必要ってのが今のところの俺の考え そう考えないと、C++も永遠にsafeに成れないことになってしまう unsafe部分にバグが、っていう古い記事が出てきたりするんだけど、 どうせ、safeでいいものまでunsafeでいっぱい書いたんでしょ、と思ってる これは個人の推測 学術的とか、論理的とか、適当に読み替えてくれよ、俺がうまく言えなかったのがいけなかっただけ >>61 last_index_ofはlast occurrenceのindexを示すだけで検索方向を示すものでは無いと思う >>56 >>59 .indexed_pixel_mut も欲しいです >>70 はあ? indexed_iter_mutがあるのはndarray crateの話 enumerate_pixels_mutがあるのはimage crateの話 pixelのイテレータとrowのイテレータがあるためiterではなくpixelsおよびrowsと名付けている >>56 が無関係な両ライブラリをごっちやに取り上げてその意味も分からず批判しているだけにすぎない >>72 Rustは継承がなくトレイト合成なんだから当然だろ >>73 間違ってはいないだろ まあ、ちゃんとキャストできるようにできてるというか 日本人はtraitとtoiletの区別がつきにくい rustのcrateはdependenciesで入るのが多過ぎるし大き過ぎるわ 要らないものまで無理やり入れさせられてる気分になる dependenciesに5個程度指定するだけで 依存crateが100個近くになるのも珍しくない nodeとは比べ物にならないくらいひどいよ しかもビルドすると500~1GB超の容量使うからノートの内蔵SSDを使ってると残す必要のないのは積極的にcleanしないときつい そんだけファイルの読み書きするなら IOの速度に影響されそうだね マイコンでも大人気と聞いたんだが、どうなってるんだ 容量使うのはインクリメンタルビルド用の中間生成物で配置するものとは違うよ C++もPCHファイルを生成するとアホほどでかかったりするが…世の中うまくいかんな C++なら明示的インスタンス化を使おうよ 使っている人をほぼ見ないけども こう書いておけば、インスタンス化した関数に、こんな風に溶け込むだろうな、とか思って書いてたりはする 時間があれば、生成コードを汗で確認する びっくりするほどスパゲッティな出力になってて、びっくりすることがある まあ実力不足を痛感する瞬間 ああ、callで呼ぶようなものはなんでも関数って言っちゃうねつい そこにこれ載ってた [RFC] Lifetime annotations for C++ https://discourse.llvm.org/t/61377 Rustは勝利した しかし、Rustはその勝利を独占できない >>100 こう書いてあるね 提案された有効期間注釈に基づく静的分析では、C++ コード内のすべてのメモリ安全性の問題をキャッチすることはできません。 具体的には、すべての時間メモリの安全性のバグ (反復子の無効化によって引き起こされるバグなど) をキャッチすることはできず、 もちろん、有効期間注釈は空間メモリの安全性 (たとえば、C スタイルの配列の範囲外のインデックス作成) には役立ちません。 詳細な議論については、以下のRustとの比較を参照してください。 >>99 Rustを使えるならばRustを使ったほうが良いと明記されているね ソース Carbon公式FAQ https://github.com/carbon-language/carbon-lang/blob/trunk/docs/project/faq.md#why-not-rust Why not Rust? If you can use Rust, ignore Carbon. If you want to use Rust, and it is technically and economically viable for your project, you should use Rust. In fact, if you can use Rust or any other established programming language, you should. Carbon is for organizations and projects that heavily depend on C++ >>101 -Wlifetime とかと組み合わせろってことじゃないん スマポだけでは解けない課題にこれが要るんだろ (勉強中なので)知らんけど 動きました。ほんとうにありがとうございました。 use std::ffi::c_void; #[link(name = "user32")] #[no_mangle] extern "stdcall" { fn MessageBoxA(hWnd: *const c_void, lpMsg: *const u8, lpTitle: *const u8, flg: u64) -> u64; } fn main() { let msg: &[u8] = &vec![65u8, 66u8, 67u8, 0u8]; let lpmsg: *const u8 = &msg[0]; let ttl: &[u8] = &vec![97u8, 98u8, 99u8, 0u8]; let lpttl: *const u8 = &ttl[0]; println!("{}", unsafe { MessageBoxA(0 as *const c_void, lpmsg, lpttl, 3) }); } >>104 こうしろよ let msg: &[u8] = &vec![65u8, 66u8, 67u8, 0u8]; ↓ let msg: &[u8] = b"ABC\0"; さらに*constにするならこれだけでいい let msg: &[u8] = &vec![65u8, 66u8, 67u8, 0u8]; let lpmsg: *const u8 = &msg[0]; ↓ let lpmsg = b"ABC\0" as *const _; Haskellでrustみたいに 型引数だけじゃなく型引数を引数に取るデータ型に対しても型制約書けたりできるんですか? ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる