結局C++とRustってどっちが良いの? 2traits
■ このスレッドは過去ログ倉庫に格納されています
「C++の色々配慮してめんどくさい感じは好きだけど、実務になったらメモリ安全性とか考えて今後Rustに変わっていくんかな」 「うだうだ言ってないで仕事で必要なのをやればいいんだよ、趣味なら好きなのやればいい」 っていうスレ。 前スレ: 結局C++とRustってどっちが良いの? https://mevius.5ch.net/test/read.cgi/tech/1677286186/ bindgenでC/C++のheader変換させると warning: type `ho_ge` should have an upper camel case name help: convert the identifier to upper camel case: `HoGe` みたいな余計な御世話なメッセージが出捲るんだが これを抑制する方法って無い? >>794 (´・∀・`)ヘー これは致命的に遅いね >>798 勉強になります .to_string() とか .to_str() とか .to_str().expect("やりなおせ") とか .to_str()? とか .as_str() とか 一貫性がないな >>799 抑制する方法もエラーメッセージに出てなかったっけ? #![allow(non_snake_case)] #![allow(non_camel_case_types)] #![allow(non_upper_case_globals)] で出来たけど #[allow(non_snake_case)] #[allow(non_camel_case_types)] #[allow(non_upper_case_globals)] にしろって書いてあるサイトもある どっちなんだろ 2つ以上のC/C++のprojectから bindings1.rs bindings2.rs みたいに造って同時にinclude!()すると 定義の衝突とか出るけど header1.hとheader2.hのどっちにも #include <iostream> みたいなの書いてあるとそうなるんかな 面倒だな DDR4-SDRAMのCASレイテンシーは、15クロックではなく、15(ns)程度だった。 3GHzのCPUだと、45クロックという事になる。 >>805 いろいろ間違ってるで SDRAMのCASレイテンシってのはナノ秒じゃなくクロックサイクル数 それもCPUクロックじゃなくRAMクロックのサイクル数 >>805 これネタ? プログラム組めないならAIDA64で測ってみなさい Trialでもmemory latency出るから >>801 Rustは一貫性があるようにガイドラインで命名ルールも定められている as_xxxとto_xxxの違いは基本的に as_xxxはコストなく別の型とみなす to_xxxはコストかけて別の型を作るかみなす その例ではもちろんstrとStringは別の型 基本的にas_strとto_stringが使われる as_strは内部でstrとみなせるデータを持っている時にそこを指すだけなのでコストがかからない場合 to_stringは任意の型からStringを作り出すのでコストがかかる to_stringはtrait ToStringのメソッドだがtrait Displayを実装することで自動的に実装される 唯一の例外がto_str これは外部からのデータに対して存在する strは必ずvalidなUTF8であると保証されている 一方でOsStrやそれを使っているPathは必ずしもvalidなUTF8であると保証されない そこでUTF8チェックのコストが生じるのでto_strとなる FFIであるCStrからも同様にto_strとなる >>752 =805 ? moveもレイテンシーも分かってないRust使いがいるけどホームグラウンドはPythonかよ! 1クロック君も分かってないんだから あんまり人のことは言わんほうがええで Python界隈のCodonを以前評価したけど速度面でC/C++と同等なのは単純なケースに限られるようだった しかも多分皆が最初にみたAckermannの例はgccがclangを凌駕するパターン(再帰Fibonacciなんかもそう) 良いとこだけ記事にした方がいいねもらえるという情報ジレンマ.. どうせCPUじゃなく、GPUだのFPGAだのにオフロードするんだしw >>811 1クロック君 = ID:bU1qZ3nv のことか? 流し読みだと805は1クロック君で、>>752 =move君(C++,Rust,Python)とコムソートの話をしてるのね Rustユーザ-> >>563 みたいな数独パズル状態でどん詰まり傾向、途中LinkedListは遅い発言を受けるも >>581 でやっと動くが何もしない 1クロック君->呼ばれて登場、いつもの虚言連射 自分の思い込みと異なる現実を見たくないから意地でもコード書かない move君->(いろいろ分かってないので、1クロック君の虚言でも)何かしら動くコードにしてideoneに置く、慣れないC++で C++側->面白がってコード弄る、ベンチ晒す、けど全員離脱 move君はそれでも勉強になったとお礼 move君、いい奴なんじゃね? あらゆるところに関所がある まるで江戸時代だ 裏山に抜け道を見付けて分け入っても 突然藪から棒に番人が現れる ところがそんな番人も unsafe印籠を魅せれば一撃で退散だ unsafe万歳!!! こんなことなら最初から 表通りでunsafe印籠を出しておけば良かったんだ きっと番人たちも思っているはず さっさと最初からunsafe印籠魅せやがれ 無駄な手間取らせやがって こんなのがエコシステムとか失笑もの C++のバイブルeffective C++でやってることを何も考えなくても できるのがRustだよな C++のconstを更にウザくした感じをデフォルトにした? まぁ安全なんだろうけども >>817 間違い:何も考えなくてもできる 正解:考えないとエラーが出る これが先週のLinkedListチャレンジの結末である Rust → どん詰まり傾向、1になればゴール 慣れないC++で → 慣れてなくとも独力で0を1にして動くコード提出、その先は先輩たちがサクッと引きあげ ちょっとした車輪ならぱぱっと組めて当然なのがC++ (俺はまだまだだけどw だからこそ、メモリ関係のバグ・デバグに気を取られたくない unsafeの取り込みは急務 よろしくゴサシュー ×Rust → どん詰まり傾向、1になればゴール 〇Rust → どん詰まり、1に出来ずに、ポエムにいいね C++でもnew/deleteなんてだいぶ前から使ってないけどな C++03時代の話を未だにしてるけど、20年も前の環境だし、Boostも1.84からC++03のサポート終了が本格化する この際、C++20まで一気にジャンプしたら良い C++17と20の間にも互換性の壁があるので、過去の資産があるならC++17でも良いかもしれない C++20は便利なので、資産が無いなら一気に飛べ 顧客には「リスク歓迎型」と「リスク重視型」いるが、Rustはいまのところ 前者が使ってる段階。 let temp = Client::RiskFriendly; >>824 C++20になったらこれに対応できるようになるって話はどうなったんだっけ? [Ruby] a.sort().reverse().map{|x| x.to_s}.join("-") [JavaScript] a.sort().reverse().map(x => x.toString()).join("-") [Rust] a.iter().sorted().rev().map(|x| x.to_string()).join("-") よく表れる偉そうな人は プロジェクトでは活躍できているの? >>828 既存のイテレータの問題を改善するためにC++20でstd::rangesが導入された しかし限界というか期待外れというか無理があって使いやすいものにならなかった >>826 リスクを恐れずに新しいものを好む人、失敗しても特になんとも思わない人が 試している状態だということ。 >>831 それは5年以上前の話 現在は様々なインフラがRust製に置き換わりつつある段階 例えばRustで書かれたAWSが安全に問題なく高速に作動し、その上に世界中の各社のサービスが動いていて、世界中の人々が恩恵を受けている >>832 ただ、プログラミング業界において、まだ、使用者数が1%未満くらいしかない。 イノベーター理論によれば、2.5%位までが「イノベーター層」、次の20% 位が、アーリーアダプター層で、それらを合わせた23%位が、「リスク歓迎層」 いわゆる「人柱層」であり、その後に「キャズム」と呼ばれる溝が有ると言われている。 だからRustが普及するためにはまだまだずっと先が有る。 >>833 大勢に影響ないが、数値はちょっとずれていて、ちゃんと調べてみたら、 イノベーター層: 2.5% アーリーアダプター層: 13.5% ----キャズム---- アーリーマジョリティー層 34.0% だったわ。 ソースコードはAWSの0.001%も使われとらんと思うぞw 有料商品だとリスクを恐れて買わない人が多いけど、Rustは無料だから 試すのはタダだから、金銭的には損はしないが時間とストレージ容量は損する。 ジュースみたいに飲んで美味しいわけでもない。 Rustを試す場合、ストレージが結構食うのと、「パス汚染」の問題や、いつのまにか 大事にしていた開発の複雑なツールチェイン環境が 「おかしくなるかも知れない問題」が有る。 経験法則として、ツールチェインが壊れることは辛すぎる。 Rustは、確かにニーズは有ることはあるが、緊急レベルが低いのかもね。 それとターゲット層が狭いかも。 Rustを使いたがってる層って、なぜかサーバーサイドで使おうと思ってる人が多いが、 複雑で遅くなるような処理はMySQLやSQLiteみたいなDBMSがやってしまう。 だから自分でやる部分は余り速度が必要なかったりする。 Rustは安全性と速度の両方重視だが、この場合、速度は不要であり、安全面だけ しか残らないがだとすると、JavaやRubyなどでも互角と言えてしまう。 しかも分かり易さは後者の方が勝ってる。 SNSを見ても、なぜかRustをフロントやデスクトップアプリで使おうとしている人は少ない。 そもそもデスクトップアプリが絶滅危惧種になりつつあるが。 多分、GAFAMが全部需要を吸い取っているからかも知れんが。 そもそも、サーバーサイドやフロントは、CもC++も余り使われてこなかったが、 SNSでは、なぜか、そっち側でRustを使いたがってる人が目立つ。 そもそも、デスクトップやゲームでCやC++が強い。だから、C++の優位性や 慣れ親しみが有る人と層が被ってない。 なのに、彼らは「C/C++をRustが置き換える」と主張している。 彼らにはそもそも自分がCやC++を愛した時期があったのかと問うてみたい。 C++を使いこなした上で、さらにそれより便利だからRustを使おうとしている ならまだしも、C++とは縁遠い人達がRustを礼賛している様に思えてならない。 もともとC++が大嫌いな状態で、C++が消えてなくなればいい、と思っている 層がRustを嬉々として使いたがっている様に見えるのだ。 そして彼らはC/C++を一切話題にしない。もし今ままでC/C++を使い倒してきた ならば、少しは触れてもいいはずなのに、彼らが好きな言語としてあげるリスト の中には、決まって、C/C++が全く触れられておらず、 JS、Go、Kotlin、Java、Pythonなどが上がってくる。 C#ですら上がって来ない事が多い。 よく見ると、彼らがリストアップする言語は、無料の環境ばかりだ。 昔から言われてきたことだが、Windowsのデスクトップアプリを作るのは、 ほぼ Visual Studio 一択 だということである、 そして、その場合、通常、C/C++(MFC、Win32)、C#(WinForms、WPF)、VB のどれかとなる。 プロは、有料のVSを購入して、C++でMFCで組むのが標準とされてきた。 BoostはURLやJSON、そしてついにMySQLが入ったぞ RegexはC++のパワーが発揮される好例だが、あまり使われてないね 文字を返すイテレータさえ用意できれば、どんなデータ構造にも正規表現が使えるんだから凄いけどね >>848 RegExの基礎の部分で、日本語周りがちょっと独特の仕様だった気がする。 UTF8やSJISには状態がない(Stateless)符合なのに、状態があるかのような 独特のC関数(?)を基礎にしている。 それは、もはやほとんど使われて無い、「Shiftじゃない方のJIS」の ShiftIn(SI), ShiftOut(SO)方式ならそうかも知れないが。 >>846 だとするとC#しか選択肢が無い事になる。 >>843 補足すると、C++が好きで、または、どこかに問題点を感じながらも使ってきたが、 さらに良いものを見つけたからRustに移行したい、というなら、C++も好きな 言語リストに入れたり、話題に触れたりするものだが、彼らは一切、 C++に触れようとしない傾向がある。 どんな言語にも欠点があるから、長年使ってきた言語であるならば、 愛着があっても、欠点も知っている。だから、もしC++を使ってきたならば、 C++の欠点を沢山気付いても、一方で、愛着も持っているはずだ。 ところが、彼らは、C++について一切触れずに、初心者用の簡易言語で あるところの、JS、Java、Kotlin、Go、C#、Pythonなどには沢山触れるが、 C++には一切触れようとしない。 >>851 キミもあまりC++を使っていないのでは? 世の中の流れが様々な方向からRustへ向かっているところをみると残るは時間だけの問題かな ロジックに弱い一部のプログラマーはRustでスマートに組めない傾向があるからその点での差別化も進むのかもしれない >>854 もしかしたらそうなのかも知れないな、と思う自分もいるが、 数値を見れば、ランキングは19位くらいで、使用者数は1%未満の状態。 それと個人的には、言語としてメンドクサイ。 >>855 Rustをメンドクサイと感じるならロジックが苦手な人なのかもしれないね 一般的にどの言語でもプログラミングする時はロジックをパズルのように解いて組み立てていくんだけど 複雑な対象かどうかでそのパズルの難易度は様々でロジックが苦手な人は難しいパズルのケースではお手上げ Rustではその解かなきゃいけないパズルが問題によって難易度が増す場合もある それと引き換えに様々な多大な恩恵が生じるわけだけどロジックが苦手な人には難しかったり面倒だったり無理だったりしてしまう でも元々のパズル自体の難度に対してそれほど難しくなるわけではないためプログラマーのほとんどはクリアできるけどね 結果的に極一部のロジックが苦手なプログラマーを切り捨てることで可読性や開発効率や安全性などを上昇させるのがRustというものの本質かもね >>856 ロジックは大好き。 ロジックではなく、Rustの字面が合わない。 ぶったぎるようでいて、多分関連ある 素直に聞かせて 上のほうでも少し出たけど、RustのOOPってどうなん 慣れればわりとなんでも書ける? 所有権関係を見習いたくて、そればっかり今まで調べてて、OOPの書き心地に目を向けてなかった >>850 たまにはATL/WTLも思い出してあげてください あれ使いこなせるようになりたいな そんなことを思いながらC++を趣味でやってる(異業種です >>858 RustやGoなど最近の言語ではOOPの癌であるクラス継承を完全に廃止してくれている点が朗報 代わりにRustでは強力なトレイトがあって非常に分かりやすく可読性もよいコードに誘導されて書き心地もよいよ ただしクラス継承という癌におかされ中毒症状というか依存症の人の一部はリハビリ期間が必要なこともあるみたい COMとか使ってたしねえ 今でもあるけど やたらややこしくしないまで含めて、継承は使ってた世代だねえ template<>だけがあるような感覚? (概要を聞いてからリファレンス見る勢 Rustのtraitは機能や能力や属性でもあるし制約条件でもあるし抽象的な型でもあるしtraitオブジェクトとしての値でもあるし traitと普通の型とは直交する存在だから多対多の関係になるけど trait自体に別のtraitが制約としてつく形でtraitの持つ機能の継承のように見せかけて継承ではないけど親子関係的になったり 実際のコードではほとんどのケースで具体型にモノモーフィゼーションされるからコストはないけど 一部のケースではtraitオブジェクトになって動的ディスパッチになる点ではC++で仮想関数を定義する基底クラス的な立ち位置でもあり >>861 templateをRustでジェネリクスとして表現する時に、そのジェネリックパラメータに対して、条件(制約)を課す指示となる「トレイト境界」としてもトレイトが登場 そのおかげで、C++のtemplate使用時の展開深入りしたわかりにくいエラーメッセージが出る前に、Rustではトレイト境界を指定するようにとコンパイラが叱ってくれて話が早いこともある 世界中で使われたはずのHaskellが跡形もないからどうだろな GC言語なんていくらでも置き換えが効くからな しかもGC言語は用途が狭く限定 ダメ言語C++が長く崩れなかったのはライバルが登場しなかっただけにすぎない 何もかも優れている非GC言語が登場してC++がようやく崩れた >>833 プロダクトライフサイクルにおける顧客割合の意味を理解してたらそんなアホみたいな比較はしない >>860 このレベルの理解力しかない複オジがRustを推すからバカにされるんだよな いい言語なのに >>860 何で継承を廃止したのかな? 新たなパラダイムを採用するにしても 継承を残しとけばC++ユーザの取り込みが進んだだろうに >>867 じゃあ、Rustのプロダクトライフサイクルにおいて、分母は何で分子は何なのさ? >>869 C++ユーザーは取り込めないし、取り込む気もないのでは C++より優れているという宣伝文句は、主にスクリプト言語を使っている人の心をくすぐるのだと思う >>870 自分で考えなよ 顧客タイプ別の割合を足せば100%になるんだからちょっと考えればわかるでしょ >>869 何でか説明してるレスに何でか聞くのってヤバいと思う そもそもRustはC++に比肩しうるような性能を持たない JavascriptやTypeScript関係の基盤やツールはRust製がかなり増えたね >>874 上手に書けば似たようなもんだろうから、性能はそんなに争わなくていいぞ ヘタクソが使ったら性能出ない、じゃどっちもどっちw >>869 Rustと関係なく昔からOOPでは 継承(is-a)より合成(has-a)が望ましい という話を聞いたことがない? 合成(has-a)の方が柔軟性が高いだけでなく 各機能ごとにコードを分けられるため 可読性も上がり保守性も良くなる 菱形多重継承の問題も避けられる 巨大な親クラスを用意する必要もなくなる 別の見方をすると 継承は複数の役割を混ぜて詰め込んでいる コードの共通化や多層性など別々の役割が混在してる それが上述の継承の様々な問題を引き起こしている それぞれの役割が個別に提供されたら継承は不要となる そして問題はなくなり可読性も保守性も向上する 以上の話はRust以前から言われてきた話 そしてGoもRustも当然のように継承は廃止した まともなプログラマーなら継承は複数の役割が混在してることに気付いてる だから継承がない言語でもそれぞれの役割ごとにプログラミングすることができる 一部のダメなプログラマーを除いて継承がない言語で困ることはない コードの可読性や保守性が上がったことで継承廃止に納得賛成する >>872 分かりませんので教えていただければ幸いです。 Rustにおける100%になるような顧客の集合(分母)とは何に当りますか。 >>881 新たなパラダイムを採用するにしても 継承を残しとけばC++ユーザの(Javaとかもかな?)取り込みが もっと進んだのではないのかな? 本当に良いパラダイムであるのなら継承を残したままC++が呑み込むと思うよ >>876 #[derive]は継承ではない 継承とは複数の役割を混在させた汚い概念 その説明については>>881 を読んでほしい #[derive]自体は手続き型マクロによる機能の付加 だから何を付加するかそのマクロ実装によって機能は変わる トレイトを自動実装させるものもあれば トレイトは出て来ず無関係にその対象にメソッドを生やすことも可能 マクロといってもRustコードの構文解析木を入出力とできるため高機能 継承といってすぐ思いつくのは、COMのIFoo2:IFoo みたいなときだけど、Rustでもできないわけじゃないでしょ >>873 説明できてるつもりなのがマジでヤバいな トレードオフを理解出来ないやつは適性ないから早めに辞めたほうが本人のためにも世の中のためにも良い crate hoge を使うとき extern crate hoge; する人と use hoge; する人がいるけど どっちがどう違うん? ちな、C++は継承全盛の時代にクソの山が築かれたので、その反省から、継承はナシでいくって発想はそんな違和感ない 現役のC++erは、そのクソの山をくぐってる(新参も過去資産を読まされるからね)から、継承するにしても注意深く設計する だから、あんま反論する気はないからね >>883 継承はコードの可読性や保守性を下げるだけの存在なので不要 継承は複数の役割が混在した汚い存在 それぞれの役割を分離して実現できる方がまともなプログラマーとってうれしい >>885 複数の役割が混在した継承という言葉や概念を用いるのはよくない そのような汚い継承というものはRustに存在しない もちろんそれぞれの役割の実現方法は別々の方法としてRustにある >>856 C/C++もRustもどっちでも良いけど Rustはアルゴリズムで悩むよりコンパイル通すことに悩む時間の方が長くなると感じる まだ慣れてないだけかも知れないのは認めるが アルゴリズムを実装したいのに集中力を削がれる >>858 >>860 traitは便利だけどC#のpartialに似てる部分もあって 実装があっちのファイルこっちのファイルに分散してて 管理出来てないとどこに何があるのか判らなくなる傾向はあると思う C/C++はヘッダーさえ追いかければどこに何が定義されているか見付け易いが Rustは時々えっこんなのここで定義してあったんだみたいな発見があるし 気付かないで再発明してから後になってえっ既にあったの?ってなるときがある >>889 伝わってねえ 継承時代のインタフェースってのがあるんだよ 特にWindowsにはね MSが全面採用って言ったんだから、できないはずないんだって >>890 それは単に慣れていないだけだよ Lispを始めた時も最初は手続き型言語以外に慣れなくて似たような感じだった Prologの時も宣言型言語の発想の転換に慣れるまでそんな感じだった 狭い範囲の言語しかやって来てないとその感じを初体験かもしれないね いずれも最初のうち慣れるまでを乗り越える >>881 >Rustと関係なく昔からOOPでは 継承(is-a)より合成(has-a)が望ましい という話を聞いたことがない? 合成(has-a)の方が柔軟性が高いだけでなく 各機能ごとにコードを分けられるため 可読性も上がり保守性も良くなる 菱形多重継承の問題も避けられる 巨大な親クラスを用意する必要もなくなる ↑ここはNimもうまくやってると思うが 規模が大きくなると型推論とかmatchで時間かかりそう >>892 申し訳ないがWindows特有の話には一切関心かない そしてそれはプログラミング言語の話でもない マイクロソフトがRustについても大量のドキュメントとライブラリ提供している それらを見ればよいのではないか >>887 extern crateはちょっと古い書き方(今でも用途ゼロではない) rustコンパイラが外部のクレートを参照するためには ソース内でextern crateを指定するかrustcに--externオプションで渡す必要があるんだけど 今はcargoがdependenciesの中身を全部渡してくれるからextern crateの出番は減ってる 今でも外側からのテストコードでdependenciesに含まれてない自分のクレートを参照する時は extern crate [テスト対象のクレート名]; みたいに使われたりする >>893 LispもErlangも慣れてるんだけどな Rustには別の面倒くさがある (難しいとは言っていない) >>889 >継承(is-a)より合成(has-a)が望ましい 使う場所が違うんでないの? composition(has-a)を使うべきところで 継承で設計するので破綻すのではないかな? 所有権システムの話と違って 継承は合成と両立できるのなら 排除する必要はなかったと思うんだよね >>895 「言語学者」だな どうにも話がかみ合わない時があるのは、こういうとこなんだろうな。。 じゃあ、WindowsからはC++はなくせない、貴方はその点には異論も関心もないということでおk? ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる