結局C++とRustってどっちが良いの?
レス数が1000を超えています。これ以上書き込みはできません。
C++の色々配慮してめんどくさい感じは好きだけど、実務になったらメモリ安全性とか考えて今後Rustに変わっていくんかな? うだうだ言ってないで仕事で必要なのをやればいいんだよ
趣味なら好きなのやればいい >>3
そうなんだけど、今後の流れが気になったので もう10年ぐらい前ぐらいからここはじめネット、SNSで
何か急にある言語をプッシュして他を異様にディスるムーブメントある場合
それは情報商材売りたい勢のゴリ押しってのが判明してる
そんなものに右往左往してたら話にならんよ c -> c++ のが自然に学べるってのはあるけど、c++の余計な仕様を覚えるのもどうかなってのはある。
rustからいきなり入る奴が本当に理解できるのか正直わからん。 結論から言うと
少しずつRust縛り(必須)となっていく
C/C++だと気付かないうっかりミスが紛れ込んでセキュリティにも影響してきた確固たる暗い実績が様々なソフトウェアにある
Rustはコンパイル時点でエラーや警告として示し防止する
この差を非常に大きくそしてそれを満たすのは現状Rustしか現実的な選択肢がなく代替候補もない
Rustを書ける人員を揃えることができたところから既に移行は少しずつ始まっており着実に進んでいる
市場的にも公的にもRust製とC/C++製どちらがセキュリティ含めて信頼できるか明確なためいずれは必須指定要件となるだろう >>9
詳しい説明ありがとうございます。
少しずつRustも勉強していこうと思いました。 >>6
Rust,Python,UnrealEngine とりあえずC/C++は小さなワンチップマイコンからスパコン富岳、そしてハードウェアの高位合成まで使える共通言語になってるから、使えれば利用できる範囲が広いかな?
オブジェクト指向が求められてCからC++が出てきたように、C/C++の構文スタイルをとりながらメモリ安全を実装したものが出てくるかもね。
学習コストとしても文法的に新規性が少ない方が好まれるだろうし。 >>13
C/C++系言語の可能性を試みる時間は既に終わった
ここ10年間でC/C++拡張やその系統では無理だと結論が出たためGAFAMなどIT大手がこぞってRustへ舵をきった アーリーアダプタ(?)的な人って、新しいものが出てきたときに良い面ばかりを
見てしまう癖が有るらしい。それでしばらくして別のものが出てくると絶賛し、
前のものを批判に変える。 大昔のRustはそうだったが実績を積み重ねて今はIT大手どこもが採用する言語となった
世界中のインフラが次々とRust製へ変わりつつある
例えばAWSなどのクラウドもそう 企業の中の一部で使われてきたというだけであって、言語そのものを良く見てみると
そこまですばらしい言語ではないと思えるぞ。 >>19
https://japan.zdnet.com/article/35183866/
Amazon Web Services(AWS)は、同社のエンジニアたちがプログラミング言語「Rust」を
使っている大きな理由として、エネルギー効率の高さを挙げる。
AWSは早くからRustを採用し、Rust Foundationの創設にも携わった。
現在もRustの普及に熱心に取り組んでいる。
AWSのソフトウェアエンジニアで、Rustの普及に取り組む
Shane Miller氏と主任エンジニアのCarl Lerche氏の投稿によれば、
Rustはメモリー安全性を高め、セキュリティ関連の不具合を減らす役に立つだけでなく、
PythonやJavaよりもはるかに「エネルギー効率に優れている」という。
Amazonは、2025年までにデータセンターの100%を再生エネルギーでまかなうという目標を掲げ、
データセンターの環境負荷の軽減に取り組んでいる。
Rustの採用はその一翼を担うという。
Rustで構築されたAWSサービスの例としては、
コンテナーアプリ用のサーバーレスプラットフォーム「Lamba」を支える「Firecracker」、
「Amazon Simple Storage Service(S3)」「Amazon Elastic Compute Cloud(EC2)」、
コンテンツ配信ネットワーク「Amazon CloudFront」、
LinuxベースのコンテナーOS「Bottlerocket」がある。
「CやRustが他の言語よりもエネルギー効率に優れていることに驚きはない。
衝撃的なのは、その違いの大きさだ。CとRustを広範に採用すれば、
控えめに見積もってもコンピュートに使用されるエネルギーの量を50%削減できる可能性がある」と
Miller氏は述べ、その根拠として、C、GoogleのGo、Lua、Python、Ruby、Fortranなどをはじめとする
複数の言語のエネルギー効率を相対的に示した研究結果を紹介している。 >>20
それでどれくらいがRustで書かれているのかな? >>20
>CやRustが他の言語よりもエネルギー効率に優れていることに驚きはない。
実に疑わしい。
Cは高級アセンブラ。
基本的に効率がよいプログラムがエネルギー効率も良いはずで、だとしたら、
高級アセンブラより効率がよい言語が存在しないといけないことになるが、
あらゆる言語が高級アセンブラを越えることは不可能であるはずなので、
矛盾しているように思える。 >>23
[補足]
手書きアセンブラだと超えることが出来る場合が有る。
C言語レベルで最も良いアルゴリズムで書いた場合、最終的にはコンパイラの
バックエンドの最適化次第ということになる。
そしてバックエンドは Rustもclang(C)も同じLLVMのものを使っているので、
Rustがclang(C)が到達できないように効率がよくなる可能性は数学的に
有りえないはず。
Rustでできるなら、Cでも出来るはずだからだ。 >>24
[補足2]
C言語は、ノイマン型コンピュータでできる限りどんなアルゴリズムでも
使えて、使えるアルゴリズムに制限が無い。
だから、発見されている中での世界最良のアルゴリズムを使うことができる。
そしてその場合に、世界最速になれない可能性があるとしたら、
バックエンドの最適化層の最適化の能力が人間の手作業の最適化に劣る
ような場合だけである。
それに対してRustがCを速度で上回るというのは数学的に矛盾している。
むしろ、Rustのsafeモードでは、使えるアルゴリズムに強い制限が掛かっている。 >>24
もちろんRustとCと全く同様の低レベル記述もできるしCと同様にインラインアセンブラが書けてRust変数との連携もできるしそれらを安全に閉じ込めることができる
一方でRustはプログラム全体の安全性を大域的にコンパイラが保証することが出来るため仮に局所的にunsafeな部分かあっても人間はそこだけに注力できる点でCとは異なり決定的で革新的な変化をもたらした
そしてRustとCが他のプログラミング言語と決定的に異なるのはガベージコレクション(GC)無しで動きプログラミング言語の中で最も高速であり電力消費面でもCPUメモリリソース面でも最も有利な言語である >>26
>安全に閉じ込めることができる
Rustでは、これは不可能なケースが有ることが分かってる。 Rustでそういうことができるのは、一部のアルゴリズムだけで、閉じ込めきれない
アルゴリズムが存在することがいくつも知られている。 >>27 >>28
プログラム全体に非安全が散らばっているアルゴリズムを考えることは可能だがバカな行為
非安全な部分を局所的に閉じ込めて安全なインターフェイスを公開するライブラリを作るのが正しい道
そうすればRustはプログラム全体の安全性を規模に関わりなく保証することができるためGAFAMなど大手ITを筆頭にその方法へと次々に切り替え始めた >>29
ですから、そのように閉じ込めることが絶対に出来ないアルゴリズムが存在しているのです。 Rustの安全性って言語を乗り換える際に払うコストほど
大きなメリットはないのでね
Rustは使う人も少ないし仕事も全くない
CのUNIXやC++のMFCのようなものがないと
Rustをやろうという人は増えないだろう 結局どっちも使えるくらいのやつじゃないとどっちにしろまともな仕事にはならん。
どっちかだけと言ってるやつは仕事になってないやつだろ。 両方使いこなせるようになると一目瞭然で
Rustは洗練されていてモダンな便利な機能も含めて開発効率も良い
もちろん安全性の保証なども付いてくるため比較するとRustが大差で有利
唯一の問題はまだRustを使える人が少ないこと
しかし着実にRustも使える人が増えていってるため
人数を揃えられたところからRustを使うところがどんどん増えている
この流れは逆になりようがない 最近だとpythonユーザがAIの流行で増えたように
Rustも牽引する何かがないと増えることはないよ Cじゃないとダメだと長年C++を拒絶していたLinuxもRustの導入を始めた
Google ChromeやMicrosoft Edgeで使っているChromiumもC++での多発するセキュリティ問題に耐えかねてRust採用を発表した
クラウドTOPのAmazonも>>20の記事にあるようにインフラをRust製にしている
Meta(旧Facebook)もRust製の基幹システムに変えたとの記事が出ている
この世界的な動きは日本でも少しずつ進み始めている >>18
>>33
ほんそれ
C/C++ 使えるがどうしても Rust 嫌いって人は
Nim を使うと幸せになれる >>37
>Cじゃないとダメだと長年C++を拒絶していたLinuxもRustの導入を始めた
$ wget 'https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.2.1.tar.xz'
$ tar xJf linux-6.2.1.tar.xz
$ find linux-6.2.1 -name *.c | wc -l
32329
$ find linux-6.2.1 -name *.rs | wc -l
37
37ファイルもある!
最後の | wc -l を取るとRustが何に用いられているか分かるよ!
いずれにしても>>37が列挙しているように
現状ではRustにキラープロダクトは無いので
増えることはないと断言できる >>36 >>38
Rust嫌いは無知が多いな
NimもPythonもGCのあるプログラミング言語であり代替になれない
超遅いPythonは論外としても
NimはNull安全すらなくC/C++と同様に安全性を保証できない言語 >>40
無知はお前さんじゃないかな?
都合の良い記事ばっかり検索して貼っとらんで
>>39のようにソースを見なさい Linux Kernel 6.1はRustyというコード名前だしRust宣言だね
https://codezine.jp/article/detail/17038
> Linus Torvalds氏は、Linux OSのカーネルの最新バージョンである「バージョン6.1」を公開したと2022年12月11日に明らかにした。
> バージョン6.1は、カーネルの記述にRust言語を一部使用した最初のバージョンとなる。
> 従来、LinuxカーネルはC言語とアセンブリ言語で記述していたことから、Rustの採用は大きな変化と言える。 >>43
C++は中途半端でクソなことがLinux界でも結論出たのは大きいな
人間チェックで安全を保証するCか
コンパイラによるチェックで安全を保証するRustか、どちらかしかないな ところRustってllvmだと思うけどRustでドライバ書きたい場合は
カーネルはclangでビルドするのかな?
gccとバイナリ互換じゃなかったような気がするんだけども?
というかカーネルってclangでビルドできるようになったのかな? >>46
そのことだよ
C++は中途半端でクソだから使う意義がないので採用しないとLinux界からも却下されていた
ところがRustは意義があるとして採用された 37 / (37 + 32329) = 0.0011431749366619293
00.11% だからな...
プログラムの隆盛を見るとCにおけるUNIX
C++におけるMFC
PythonにおけるAIのようなキラープロダクトが出て
コードを書ける人が増えないと
メモリ安全ごときでRustが流行ることはあり得ない >>18
Rustを本格的に始めたら言語仕様が秀逸だと分かった
これまでの言語の既成の固定観念に引きずられてるうちは分からなかったことが見えてきた 仕事でCを使ってきた
Pythonは苦労せず使えるようになった
でもrustは無理くさい
書き方が違いすぎるのと脳が老化して覚えられないw >>52
モダンな言語なんでもいいけど
何らか抽象的なプログラミングをサポートしている言語でそういう保守性の高い書き方したことがない場合
どの言語でもまずは抽象的なプログラミングに慣れて習得しないままだと
仮に長年プログラミングやってきたとしても初心者止まりのままになっちゃうのでどこかへ進むとよいかも
CやってきたのならばRustはあとその部分を習得するだけだね >>52
C/C++のリプレースで使われることで騒ぐしかないんじゃ、できること自体はCと変わらないってことだしね。
小規模なプログラムだと一番のウリのメモリ安全も利益感じられないし。
制御関係とかでC++のClassや継承とかは部品の組み合わせと対応させられて便利だったけど、Rustでは継承はバッサリ切り捨てちゃったみたいだしなあ。
そういえば、脳科学者が言うには脳は老化しない、何歳になっても海馬は大きくなるらしいよ。
自分はChatGPTで掛け合い漫才しながらチュートリアル眺めてるけど、以前三日坊主だった時の壁は越えられた気がする。 >>45
なんで二択なんだよ
Nimがあるじゃないか Rustってドライバとかにも使えるの?
組み込みで使われてる? >>52
脳の老化じゃなくて過学習が始まった年頃なんじゃね GoogleのCarbonが完成したら覇権とりそう
あとはZigとかはどうなんだ Rustは継承じゃなくて合成みたいだけど、そもそも継承ってそんなに危険だったっけ? >>57
上でも言われてたけどNimでGC無効メモリ手動管理でやったらどれくらい使い物になるんだってのは気になる
まあふつうNimならもうメモリ管理せずにORCでやるだろうけど >>55 >>57
C#もNimもGCが基本の言語
このスレに持ち出すのは場違い
>>60
Carbonは公式ページに「Rustを使える状況ならばRustを使った方が良い」と明記されてる位置付けの言語
CarbonはC++記述遺産のメンテ用が目的
Zigは手動でメモリ解放する言語
Rustは自動でメモリ解放する言語
そしてRustではメモリ安全性がコンパイル通れば保証される信頼性が大きな差 >>58
もちろんRustはC言語と同じく低レベル記述も可能
必要ならばインラインアセンブリもサポートしておりRustの変数を使ってその場でasm挿入記述もできる
組み込みもRustのメインターゲットの一つ
https://www.rust-lang.org/ja/what/embedded >>63
>C#もNimもGCが基本の言語
>このスレに持ち出すのは場違い
ここはどういう場なんでしょうか?www >>65
スレタイ見ればわかるようにガベージコレクション使う遅い言語は対象外だと思うよ >>66
>スレタイ見ればわかるように
飛躍し過ぎていて「結局C++とRustってどっちが良いの?」で
GC使う言語がスレの対象外になるのがサッパリわからん より良いものを否定し
伝統ばかりに固執する人らに
過去の栄華はあっても
未来など無い >>67
プログラミング言語は大きく2つに分かれていて
GCのある遅くてメモリ消費も多い言語と
GCのない速くてメモリ消費も少ない言語に分かれる
そこには決定的な違いがある
次にスレタイというのはいちいち説明しなくても
例えば「Vue vs React vs Angular vs Svelte Part.11」というスレはそれら比較対象からJavaScriptフロントフレームワークのスレだと分かる
そしてここはスレタイが非GC言語の既存代表例C++と非GC言語の新興代表例Rustの比較的となっているから
基本的にその両者が対象でおまけとしても同じ非GC言語のCやZigなどが対象ギリギリかなと思う Cと名前が似てるだけで狭い範囲でしか役に立たないC#の話をされてもそりゃ困るわな
最低限ガベージコレクション無しと低レベル記述可を備えた最高速クラス言語じゃないと比較の土俵にも上がらんわ 一言で言えば、リアルタイム性を要求されるアプリケーションでも使える言語ってことだね。 >>67
猫と犬とどっち飼ったらいいかな?
の質問に「金魚が良いよ」と回答しても意味ないだろ 書こうと思えばどの分野でも書くことができるプログラミング言語だね
例えばC#やPythonではまともなOSを作ることができない
GoogleがRustで書かれたセキュアなOS「KataOS」を発表
https://japan.zdnet.com/article/35194751/ >>72
高い性能や高い応答性くらいの意味でリアルタイム性という用語を使ってるのかもしれないけど意味違うからね >>69,74
そういうのは飛躍と言う
お前が>>1でそのつもりでこのスレを立てたのならスレタイは不適切 >>72
「リアルタイム性」も知らんようだし
お前はRustについてGCのあるなしくらいしか語れないのかな?
ちなみにこの板読んでる人でGCを分からん人はほぼいないと思う そういうアホ相手にしか反論できない時点で辛そう
最近は新たなものが出てくるとRust製
Webpackの後継となる新バンドルツール「Turbopack」が登場。Rust製のネイティブアプリケーションでWebpackの700倍高速に!
https://www.publickey1.jp/blog/22/webpackturbopackrustwebpack700nextjs_conf_2022.html >>1です。色々と混乱させてしまってすみません。
C++で今まで作られてきたものがどれだけRustに変わっていくのか気になってスレ立てしました。
メモリ安全性という観点だとRustになりますが、C++にはRustより優れている点があって、今後もまだ残り続けるのかどうかです。 VB6やCOBOLみたいに進化を止めたゴミにならない限りはC++も残り続けるでしょう
今のところC++がそういったゴミになる兆候は無いと思います
Rustが優れているかどうかは一切関係がありませんね C++は残り続けるけど徐々にメインストリームはRustかそれと同等のメモリ安全性を備えた言語に移っていく
既存のコードベースが大きいから急激には変化しない
残る理由はCOBOLが残っているのと同じで優れてるという理由からではない 試しにChatGPT先生にRustにキラーアプリがあるか聞いたらSolanaやRayonだって
>SolanaやRayonがUNIXやMFCのようにプログラミング言語を新たに習得しようと
>する人を爆発的に増やすことは、現時点では考えにくいと言えます。
>UNIXやMFCが広く普及した理由の一つは、それらが当時の主流であったプラッ
>トフォームやアプリケーションの開発に必要不可欠であったためです。一方、
>SolanaやRayonは、それぞれ特定の分野において高いパフォーマンスを発揮す
>るためのライブラリやプラットフォームであり、必ずしも全ての開発プロジェ
>クトに必要不可欠なものではありません。
>また、Rust自体がまだ比較的新しい言語であるため、多くのプログラマがRust
>を習得する必要性を感じているわけではありません。ただし、Rustの安全性や
>パフォーマンスが注目されるにつれ、より多くのプログラマがRustに興味を持
>ち、学習する可能性はあります。
>つまり、SolanaやRayonがプログラミング言語を新たに習得しようとする人を
>爆発的に増やすことに貢献するかどうかは、それらが必要不可欠なライブラリ
>やプラットフォームとして広く普及するかどうかにかかっていると言えます。 例えばRustで書かれたOSをAndroidやiOSの後継にするとか
携帯に匹敵する新たな情報端末が出現して
それがRustで制御されているとか 質問がバカだと回答もバカになるいい例
ググり力と同じくジピり力が求められる 「ジピり力」かぁw 大事だね
SolanaやRayonが返ってきた質問は以下
>あるプログラミング言語が流行るにはC言語におけるUNIXやC++のMFC、最近だ
>とpythonがAIによって流行ったようにキラープロダクトが重要だと思います。
>キラープロダクトがあれば、その言語を習得したプログラマが一気に増えます。
>Rustにそのようなキラープロダクトはありますか?
Rustの爆発的普及にはキラープロダクトが不可欠 >>79
C++は今も違法増改築を続けて無数に部屋(仕様)が作られていくような言語
そして新たな増改築が決まっても、完成(実装)されなかったり、新たな部屋の存在が知られていなかったり、ほとんどの部屋は極一部の人しか使われていない
結果的に良い機能があっても使われないのは無駄に大きく重複もある複雑な言語仕様のせい
例えばC++20で導入されたstd::rangesはRustでいうとIteratorなどの基本的なデータ取り扱い機能で超重要だが今後も広まらないのだろう
歴史的な事情でC++の全容は複雑怪奇となっていて理念の一貫性もなくどうしようもない状態
Rustは洗練された言語仕様となっていてC++と比べれべるとシンプルで分かりやすい
全体の理念も統一されており特に安全性に関する保証が与える信頼性はこのセキュリティ重視の時代に完全にマッチしている
今後Rust人口が増えてくると企業案件でC/C++が使われてきたものはRust指定(必須)となっていくだろう >>86
普及して長いことたてばRustもご多分に漏れずいずれ複雑怪奇になるってw
若いと分からんかもしれんが
C++は複雑怪奇に見えるかもしれんが規格変更には慎重の方だと思うよ
ところでRustって規格あるの? 仕様しかない? C++もスマートポインタでメモリ安全を取り込んできているけどね。なんでも飲み込む奴だからなあ。 例えばstd::shared_ptr相当のものは
90年代中盤から後半にかけて使われ始めたと思うけど
(boost::shared_ptrはいつからだっけ?)
std::shared_ptrが規格に入ったのはC++11
規格の拡張は無節操というより慎重というかクソ遅いよ >>86
Javaが出た時に聴いたことあるような文句だな
割とマジでフラッシュバック >>79
それは分類が非常に簡単
既に作られており穴も発見されないものをわざわざRustに移植する意味はない
穴が多く悩まされてるものはChromiumのようにRust併用やRustへ切り替えが進んでいる
新たに作ったり大きく作り直す場合はRust一択 >>89
C++はスマートポインタがあっても言語システムとして安全を保証する枠組みがない
まともなIT企業からRustへ移動し始めている根本的な理由がそこ >>93
Rustプログラマを支障なく確保できなければ企業は
試験的採用こそすれど本格採用はしない
Rustプログラマが多い -> Rust生態圏が良くなる ->
Rustプログラマが増える -> (最初に戻る)
※Rust生態圏が良くなるとはライブラリやtipsが増えRustの仕事が増えること
この好循環を作らないことにはRustが流行りだすことはないだろう
そのためのキラーコンテンツ
>>37で上げてるようなソフトはしょぼすぎて該当しない
>>83くらいの状況になれば変わる Rust自体がプログラミング言語史上でも革新的なキラーコンテンツ
まともなIT企業からRustを導入していっている理由がそこにある
非GC言語でメモリ安全性を言語システムが保証する初で唯一のプログラミング言語がRust なんだかんだで置き換えられずにユーザ空間ソフトの基礎ライブラリになってるC言語の奴らすげーよな とりあえずC/C++は今ところほぼ全てのCPUで環境が整備されているし、
メーカーさんのサンプルにしても、過去の資産も(FreeRTOSだのもArduinoなんかも)膨大。
それらが全て使われなくなったり、他の言語でで書き換えられるということが仮に
にあるとしても相当先の話になるだろう。
と考えると、C/C++はほぼ基礎教養かな?
あとは実務で要求されたものを身につけるっていう感じなんだろうな。
パラパラ眺めた範囲ではRustもC++知っていればさほど難しくなさそうだけど
個人で趣味レベルでやってますといっても、実務経験ないとキャリアとしてのアピール度は低いしな >>98
Cの基礎は必要だがC++は要らん
特殊な組み込み環境などでない通常利用ならば対応していてRustが使える ルビキチも自分の実績とは関係なく人工衛星がどうのと褒めそやす奴だった
これもいずれはあのような壊れたレコードに成り果てるのだろう Firefoxだけかと思っていたらChromeもRustなのかよ
Google Chrome、プログラミング言語「Rust」の採用を発表
https://news.mynavi.jp/techplus/article/20230113-2561774/ >>102
それでRustプログラマが増えることはないな
>>83くらいの状況にならんと >>99
その「特殊な組み込み環境」とやらでもC/C++は使えるからね。
C++はフルには要らんかもだけど、
クラスと継承は組み込みとかでも便利に使われてたりするね。
できることが大差ないとすると、仕事でRustを使えと言われない限り、個人レベルで積極的に使う理由に乏しいかなぁ。
個人でメンテできる程度だとメモリ安全ってそれほど重要ポイントではないし。
PythonにとってのAIみたいに、こういうアプリケーションなら、C/C++より遥かに楽で簡単に実現できるというものが必要なのではないかな。
今の段階じゃ、メモリ安全にするために制約やチェックを厳しくしたC/C++ってだけって感じだもの。 Rustは後発なアドバンテージで
洗練されたモダンな言語仕様のため非常に書きやすい
これが一番大きなメリット
おまけとしてメモリ安全性の自動保証とデータ競合なしの保証
これらにおかげでC/C++で書いてた時に無駄に必要だった実行時デバッグが激減して消えた
Rustは開発効率が大きく向上する >>95
Dが出た時に聴いたことあるような文句だな
割とマジでフラッシュバック >>106
どこが似てんだよ何も区別付かないアフォ altJSブームが落ち着いたせいで下火になっちゃったけど
やっぱりHaxeは復活すべきだよな >>107
凄い似てるよ
Javaが出たときにも聞いたぞ
「C/C++を置換する!」は人間の性なんだろうw
長くやってると何度も見るし結果もだいたい分かる >>110
しかも、Javaの普及速度は物凄く速かったが、Rustは伸びてない。 >>91 >>110
プログラミング言語の一般的な基礎知識を持たない人がRustのアンチをやっているのかしら
JavaがCやC++に置き換わらなかった理由の一つはJavaがガベージコレクション必須の言語だからですよ
CやC++の置き換えとなるためにはGCを必要としないプログラミング言語でないとダメなんですよ
GCを必要としない言語も数少ないながら今までいくつか出て来たのになぜCやC++を置き換えられなかったか分かりますか?
CやC++で問題となってきたのはメモリ操作の安全性とデータ競合の安全性です
それらを完璧に対応して言語自体が安全性を保証する言語が今までなかったからですよ
Rustが初めて対応して初めて真にCやC++を置き換えられるようになりました
だからIT大手各社がライバル関係を超えて共同してRustを支援そして採用しているのですよ >>112
>>77
お前はそればっかりだなw
そんなものはこの板の住人が知らん訳ないやろw
GCくらいしか語る知識がないんだろうな >>113
その>>77を見てみましたがリアルタイム性の話ですか
それは直接はプログラミング言語とは関係ない話ですが少し関係がありますね
言語に関わらず作成したシステム側の話でOSからゲームのようなアプリまで必要とされる時間的制約があることをリアルタイム性と言います
もちろんガベージコレクションはリアルタイム性の障害となりますのでそれを軽減する手法を取ったりリアルタイム性を必要としないタイミングでGCを実行します
しかしそれでも現実的なOSや基幹システムでGC言語の利用は厳しいでしょう
そのためOSなどの記述にはCやC++やRustが使われます
メモリ安全性などの保証をプログラマーではなく言語システムに任せることができるRustがベストとなります エアプするにしてもせめてthe embedded bookくらいざっくり読んでからにすればいいのに >>114
リアルタイム性の話ではなく
GCの話しかしないことを言っている
GCくらいしか語る知識がないと俺は推測している C++とRustの比較スレだからGCない言語が前提だもんな
Javaとか持ち出す>>110や>>111はアホすぎ ここは純粋にC++とRustの比較スレ
しかし無関係なGC言語を持ち出してくるバカがいてそれを邪魔をしているようだ 実務経験の乏しい人が言語機能だけで頭でっかちなアピールしてるのを見ると狙ってアンチ活動してるのかと勘繰りたくなるよね
まぁ隔離ファイト続けてくれ それらの言語を実際に書いて使っていればガッべージコレクションのある言語がC言語系を置き換えできないことくらい分かるはずだもんなー WinAPI/ATL/MFCの系譜をWinFormsが現れて.NETが置き換えていった歴史は無かったことにされたらしい CやC++に置き換わる言語の話でWinAPIやWinFormsを持ち出してくるとは頭おかしいな C#もGCないネイティブでビルドするオプションがあったら天下取れたかもな
VB6はGC無かったのになぜこうなった >>125
君はてをにはがおかしい
寝ぼけた頭で脊髄反射で書き込むのはやめたほうがいいな >>127
何処が可笑しいか指摘してくれ
おれには判らん >>129
「CやC++に置き換わる言語の話」なんて誰もしていない
「CやC++に取って代わる」あるいは「CやC++を置き換える」と言いたいのだろう
あるいは本気で「CやC++に置き換わる言語の話」をしているのなら今度こそ本当に頭がおかしいな >>126
VB6はトレースGCではないけど参照カウンタGC方式のGC言語
VB6オブジェクトは裏で参照カウンタが自動的に使われていてそれにより使われなくなったメモリを回収している
ちなみにC++のshared_ptrなども参照カウンタ方式だが裏で勝手に使われることはなく必須でもなくプログラマー裁量なのでC++はGC言語ではない Rustに期待している人のフラストレーションを解消したいなら
フルスクラッチでOSを書くくらいしか方法はないだろうね
OSの普及は更に至難の技だけども (実務経験ゼロ + 論理的思考力の欠落 + 自己愛性パーソナリティ障害) * Rustへの執着 = 通称複製おじさん |
| 彡⌒ミ
\ (´・ω・`)またGCの話してる
(| |)::::
(γ /:::::::
し \:::
\ >>133
フルスクラッチの新たなOSを普及させるのは難しいだろうが
>>74に記事があるようにGoogleがRustのみで新OSを作ってるな
あとAndroidもLinuxもWindowsもRustの一部採用を始めて
この流れはOSに限らず全てのシステムでRust化が進んでいくのだろう
GoogleとMicrosoftがRust言語でOS開発
https://xtech.nikkei.com/atcl/nxt/column/18/00692/042700054/ >>137
次第に現行プロジェクトを置換して増えていくなんて展開はありえないっての
AndroidやWindowsをRust製のOSで置換するくらいしかストーリとしてはない
Linuxに入っているRustコードは>>39で書いた通り 私はRustで年収1億稼ぎましたみたいな話はないのかよ
マイナープロジェクトでちょっと使われたら勝利なのかよ Winnyの作者みたいに逮捕されるかと思ったら怖くて無理 Rustで検証してうまくいったらそのままCにコンバートすれば余計なチェックコードが削れてる速く動く
とかね。 >>133
それよりもグラフィックソフト作ったほうが広まると思うけどね
Blender参考に3Dモデリングソフトつくってよ >>144
それでは心が満たされないんだよ
GCの話しかしない人とか >>143
GCの有無はその言語がカバーできる範囲の差となり優劣関係が明白
GCのない言語は全てをカバーできる >>146
UEとかのゲームエンジンは当たり前だがついてる
うまく付き合ってくほうが大事 本当にGCの話しかしないんだね
GC以外のことを語る知識がない
GCはこの板見てる人はほぼ誰でも知っているだろう 色んな言語のライブラリがC++(や最近はRust)で書かれているのを考えると
C++とRustが王者決定戦になるのは当たり前じゃね? 入力にゴミデータを与えるとゴミしか出力されないことの好例 いつのまにかPythonやJavaScriptのライブラリがRustで作れるようになってるのな |
| 彡⌒ミ
\ (´・ω・`)またGCの話してる
(| |)::::
(γ /:::::::
し \:::
\ ふと思ったんだけど、Rustのmutableな構造体の中にimmutableなフィールドって持てるんだっけ? >>157
そういえば、C++のcv属性は、論理和方式で、constは足し算の様に0から1に
変わるが、mut 属性はそうはならないだろうから、どうなるんだろうな。
constは意味的に考えてもcastしない限りは、、constなものはいくらやっても
書き込めるようにはならない、というのは安全性から当然なんだけど、
mutだとそうはいかない。 >>158
mutとconstは逆さまの働きみたいだから、どっちで行くかは言語設計者の自由と
思われがちだけど、constな構造体のメンバは勝手に全てconst扱いになるという
単純な論理に出来るけど、mut方式の場合は、constキーワードも別に必要になりそう。 >>157
他の言語と同じでsetter相当をなくしてgetterだけにすればいい
専用のラッパーを作る方法もあるができて当然の機能なので誰もやらないだろうね >>159
C++でconstを誤用しているのとは異なり
Rustではconstを正しく定数の意味で使っているので注意
つまりconstは定数でありコンパイル時に静的に定まる
もちろんconstとは別の概念としてmutableとimmutableがあり、これらは可変性の有無を表す
さらにそれらと別の概念として所有権があり、所有権を持っていればimmutableであろうと関係なくmutableな変数へ移すことで可変性を得られる
一方で所有権を持たないimmutableな参照からは可変性を得られない >>161
>C++でconstを誤用しているのとは異なり
誤用なの? >>162
そうだよ
実行するたびにあるいは関数を呼ぶたびに値が変わりうる変数(=静的に値が定まらず変わりうること)に対して、
変数がimmutableであることを間違えてconstと付けてしまった
そのためC++では定数(=静的に値が定まること)の場合は苦肉の策でconstexprと変な名前を付けることになった >>163
C++では単に値が`constant'って意味で使っただけではないのかな?
それを誤用とは言わんと思う
ところで何でconstexprではないconst変数は
静的に定まらないことになってるの? >>164
もちろんC++は整数などに限ればconstで静的な定数となるが
それ以外C++のconstは定数ではなく静的にコンパイル時に定まらない
そのため真のconstを表すためにconstexprというキーワードを新たに用意する本末転倒な状況となった 以下の2つは矛盾してないかい?
>>163
>実行するたびにあるいは関数を呼ぶたびに値が変わりうる変数(=静的に値が定まらず変わりうること)に対して、
>変数がimmutableであることを間違えてconstと付けてしまった
>>164
>もちろんC++は整数などに限ればconstで静的な定数となるが
2つ目はなるんだっけ? >>165
>そのため真のconstを表すためにconstexprというキーワードを新たに用意する本末転倒な状況となった
「本末転倒」とは違うと思うよ >>166
C++で何らかのクラスのインスタンスを作ってconstに入れることを考えてみるとわかりやすいよ
もちろんこのconstのインスタンスはコンストラクタの引き数の値によって変わるから静的な定数じゃないよね
つまり単なるimmutableな変数に過ぎないわけだけどC++はそれに対してconstと間違えて名付けちゃった
だから本当の定数に対してconstexprと名付けることになった有名な話だよ >>168
>つまり単なるimmutableな変数に過ぎないわけだけどC++はそれに対してconstと間違えて名付けちゃった
C++のconstは単なる`constant'の意味で
静的な定数という意味でないというだけなのでは?
本当に「間違えて」名付けたのかな?
俺にはC++のconstにあなたが「間違えて」静的な定数という意味を
期待しているだけに見えるのだが? >>169
環境によって実行毎に、または、関数の引き数によって関数が呼ばれるごとに、>>168の示してる例だと値が変わりうる
その変わりうるものに対して、C++がconstと付けたのは失敗としか言いようがないのではないか
そしてC++は本当にconstantなものに対して、後からconstexprと付けざるをえなかったことが、C++の失敗を誰の目にも明らかにしている >>170
>環境によって実行毎に、または、関数の引き数によって関数が呼ばれるごとに、>>168の示してる例だと値が変わりうる
これはどいう状況か分かりにくい? ソースで書いてみて >>171
関数に渡ってきた毎回変わりうる引き数を使ってそれを渡してインスタンス作成してconstに突っ込む場合でもよい
あるいは環境変数やargv使ってインスタンス作成でもよい
いずれも毎回インスタンスの値が変わりうるため定数ではないがC++ではconstと付けてしまった
そして本当の定数にconstexprと付けた >>172
曖昧さを避けたいのでソースで書いて
反論する ただし*const Tのconstだけはコンパイル時定数の意ではなく、C++と同じで書き換えを行えないという意味です
一貫性がありませんね >>169
数字でも物理でも定数は静的に定まるものだよ
でもC++はconstをimmutableの意味で間違えて名付けてしまいました
そして定数を表すためにconstを使えなくなりconstexprと名付けたという誰でも知ってる有名な話だよ >>175
>でもC++はconstをimmutableの意味で間違えて名付けてしまいました
とあなたが思っているだけではないかな?
C++のconstにあなたなが「間違えて」静的に定まるものを期待しているだけでは? 言われてみれば数字や物理で定数は静的に定まる値だな
どうせC++で静的に定まる値を示すキーワードも必要となるんだから素直にそれをconstにしておくべきだったか
設計ミスだな immutableとconstantの違いを区別できていない人がimmutableに対してconstと命名してしまったのかな
そのためconstantに対してconstと命名できなくなってconstexprと命名したと 同じ言葉や字句でも言語ごとにその概念が指すものは異なる
相対主義的に考えなさい
相手の価値観を理解しなければ説得力は生まれません ・y = ax (a=10である)
aをimmutableと呼ぶかconstantと呼ぶか
・y=f(a) (a=10である)
f(a)をconstantと呼ぶかconstant expressionと呼ぶか
まあ考え方次第だよな >>182
上はxが実行時に値がわかる変数なんでしょ?
それならconstantには成りえないんじゃない? >>183
かかるaについてなんと呼ぶかって話だから別にxについて気にする必要は無いよ >>182
あと例を出すにしても
整数は特殊でconstexprでなくconstでも静的定数になる例外だから例として最も不適切 自演してRustゴリ推し他言語叩きをしてるのは
複製おじさんと呼ばれてるRustスレでは有名な荒らし
しかもそいつが「RustJP公式 」の中の人で間違いなさそうって話だから手に負えない >>187
「RustJP自称公式 」なのでなんの問題もない y = ax
y も a も x も変数としか言いようがない aを10としたときにコンパイル時
最適化してしまうかaという入れ物残しとくか更にはf(a)も計算して結果だけ使うか 整数はconstやconstexprの有無に関係なくコンパイル時に最適化されるから整数を持ち出して来ても意味がない
C++ならクラスのインスタンスを生成する場合などを考えるとわかりやすい
コンパイル時点でそのインスタンスを定数化できる時にconstexprを使い静的に定数となる
そうでなく実行時にならないと値が定まらない変数となる時はconstexprを使えない
その変数がimmutableつまり生成以降は値を変更できない時はconstを使う constというものの表現を語るうえで言語依存しない形で書いただけなので
少数でも文字列でも適当に読み替えてね >>192
C++の命名ミスだな
定数にconstと命名すべきであり
immutableな変数にconstと命名すべきでなかった 結果的に後からみればC++の命名ミスなんだろうが歴史的経緯で仕方ないだろ
昔はimmutableとconstantの概念の区別が曖昧だった どうしても`immutable'を使いたければマクロ定義すれば?
#define immutable const Rustはconstをimmutableとcompile-time constantの両方の意味で使うので一貫性が無い
>>174 >>200
Rustでconstは常に静的な定数を表す
*constはconstとは全く別のものであり予約語を最小限にするための使い回し組み合わせ
両者は種別も異なるため混乱することもない
constは定数の定義なのでこの位置に来る
let foo: i32 = 12345;
const FOO: i32 = 12345;
*constは生ポインタの型を示すのでこの位置に来る
const BAR: &i32 = &FOO;
const BAZ: *const i32 = &FOO;
このように両者は全く別物で出現位置も異なり共存もでき混乱することもない
この生ポインタはunsafe Rustでしか使わないため通常は出て来ない
そのために新たな予約語を消費するのは馬鹿げているため既存の組み合わせという合理的な選択をした constはCからの流れだしな。
元々Cがシステムプログラミング向けだったことを思えば、「リードオンリーセクションに置け」っていうくらいのつもりだったんだろ。
定数は#defineで指定しろって感じかな。 >>201
> この生ポインタはunsafe Rustでしか使わないため通常は出て来ない
safeの範囲で普通に使うけど
参照の同一性比較とか書いたことないの? >>203
参照の比較は生ポインタ直接比較ではなくstd::ptr::eqを使うのが行儀良いマナー
参照を渡せば*constに自動でcoerceされるためコードに*constを記述する必要はない Rustは優秀なんだろうけど、言語仕様が難解なのと、「〜の分野ならRust」と言えるものがないから広がりにくいんだろうね それにRustは左翼的な弱者救済的な雰囲気が漂う。
VBも同じ理由で使ってるだけで駄目プログラマとみなされていったから、
同じようにRustを使ってるだけで駄目プログラマ決定されてしまう気がする。 Excelもそうだ。Excelを使ってるだけで弱者扱いされてしまうようになっている。
VBもそうなったから、中味はそう変わってないのに名前を変えてC#にされた。
しかし、だんだんと、C#もVBと同じように馬鹿プログラマ専用言語とみなされる
ようになってきてる。
Rustもきっとそうなるだろう。 Rustも悪くないけど日本語のドキュメントが酷すぎるかなあ。
たとえば第七章のパッケージとグレートの話とかでも
-------
最初に学ぶモジュールシステムの要素は、パッケージとクレートです。 クレートはバイナリかライブラリのどちらかです。 クレートルート (crate root) とは、Rustコンパイラの開始点となり、クレートのルートモジュールを作るソースファイルのことです
--------
英文の方は版が新しいこともあってか
The first parts of the module system we’ll cover are packages and crates.
A crate is the smallest amount of code that the Rust compiler considers at a time. Even if you run rustc rather than cargo and pass a single source code file (as we did all the way back in the “Writing and Running a Rust Program” section of Chapter 1), the compiler considers that file to be a crate.
と、いう具合で以下だいぶ丁寧に解説してる。
パッケージにはa library crateとあるから一つだけなの?とChatGPTに尋ねたら複数入ることもあると断言されたけど。 面倒ならとりあえずDeepLに掛ければ良いのにね
> モジュールシステムで最初に取り上げるのは、パッケージとクレートです。
>
> クレートは、Rustコンパイラが一度に考慮する最小のコード量です。cargoで
> はなくrustcを実行し、1つのソースコードファイルを渡したとしても(第1章
> の「Rustプログラムの作成と実行」でやったように)、コンパイラはそのファ
> イルをクレートと見なします。 >>209
ひどすぎるのには同意するが
それはボランティアによる非公式な翻訳で
識者による監修や査読がされてないから
質が低いのは当然といえば当然
一部専門用語を除くと機械翻訳のほうが
それよりはマシな訳になることが多いので
多少英語が苦手でも公式を見たほうが断然効率がいいよ >>209
7章の最初のページ見ればそれぞれどういう関係なのか一目瞭然
単数形複数形の違いを丁寧に訳してなければ重要な意味が日本語訳では消えてるかもね
・Packages: A Cargo feature that lets you build, test, and share crates
・Crates: A tree of modules that produces a library or executable
・Modules and use: Let you control the organization, scope, and privacy of paths
・Paths: A way of naming an item, such as a struct, function, or module >>209
そのページは原文の2年半以上前の状態止まってる
日々改善されてるOSSで数年単位の遅れがあると全く役に立たないから
現状はRustの日本語ドキュメントは無いものと思っておいたほうがいい >>213
原文のいつの状態を反映した訳なのか全然管理できてないらしいからね
アップデートは望み薄 規格がないので二流感が拭えない
かと言ってC++が登場したときのように
今はプログラミング言語の実装が
いくつも出てくる状況でもないのかな? >>215
C++での混乱と失敗を繰り返さないことが重要 >>214
マジかよw
たかだか100個程度のファイルが管理できないってどんだけよ 実装が複数あることはメリットもあるがデメリットも多くユーザを混乱させてきた
一方で言語仕様とその実現方法が確定して枯れた時は複数実装のメリットが上回る
Rustについては更なる理想の言語に向けて公開todoリストも多くまだ発展段階なので複数実装は向いていない
もちろん従来的な使い方ならば現状のRustで既に十分に利用できる >>218
ユーザーフォーラムのしかもたった二人の回答を「公式コミュニティの見解」にしてしまうオツムの人達だからさ一般常識があると思ったら大間違い >>219
3行目は全否定しておく
CやC++に複数の実装があった第一の要因は開発ツールが売れたという背景がある
Rustに限らず開発ツールは最早ビジネスとしては成り立たなくなってしまった >>220
あれ痛いよね
でもピン留めして晒し上げるのはさすがにどうかと思うわ Rustは公式が提供するcargoやrust-analyzerで開発環境は十分だもんな
もちろんrust-analyzerはLSPなのでVScodeなどの既存の統合開発環境で使える >>220
Rustユーザーの大半は英語のドキュメントを直接見てるからな
同じRustユーザーというだけであのリテラシーレベルと同類扱いされるのは誠に遺憾 >>212
一目瞭然ってことはないよ。
わかってるやつにはわかるっていうレベル。
特にmodule and use以下で戸惑うと思うよ。
Rustはプログラミング言語としてはCとかで神経使っていたところで楽させてくれる感じだけど、新人を呼び込むにはドキュメントがまずいかなあ。 前にもこれどこかで同じレスしたことあるけど
Javascriptってドキュメントすっごい充実してるよな
2000年以前はHTMLとJavascript一緒になった解説本の最後の方に申し訳程度に乗ってたくらいで
あとは某とほほサイト見るくらいしかなかったけど
最近ちらっとみたらすごいのな
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/find
これは適当にクリックした特に選んでない一例だけど
ちょっと過剰なくらい説明と例が乗っててスゴイと思ったわ
Rustにここまでを要求したほうがいいとも思わんけど
いつかみんなが使う言語になったときはそうなってるのかもしれん C++は既に意味不明な域に来ていて、誰も新規に習得しようとはしないだろう >>226
ほんと。自分もノーマークだったけどすごいね。
Rustも「英文ドキュメント読め」みたいに突っぱねいようにしなくちゃね。
Rustのサイトで各国語にトランスレートされたもののリンク先の更新日付を眺めてると、中国語版に負けてる感じだね。 MDNもMDNで英語読まないとやってられない記事はちょいちょいあるけどね
CSSのpositionとか 少なくとも手解き用として、TheBookの日本語版ではねえ。
で、メモリ安全ってことだけをひたすらリピートするだけでは、新しい人は来ないでくださいと言ってるようなもん。
まあ、その方がチンケな優越感に浸れて良いのかもしれないけど。 メモリ安全ってのは個人が始める動機としては弱い
スマートポインタで充分なんだし
チームで書くときにメモリ管理が怪しい奴が混ざり得るときに
Rustで書くことを強制されるってシチュエーションはありえるかもね >>234
両方書いてると差は歴然
Rustは可読性もよいし開発効率もよく
特に実行時デバッグが激減するのも大きい
やむをえない場合を除いてC++を使い続けるメリットはない >>235
>Rustは可読性もよいし開発効率もよく
そんなのは人によるとしか言えない
所有権に割と馴染みがあるC++プログラマはともかく
他の言語からだと文法の解離に抵抗はあるだろうね
これからプログラミングを始めようという人は
特にRustだからという抵抗はないだろう
実績が増えればRustからって人が増えるかもね C++はコンパイラ買う時にデバッグツールもあって、そこでメモリリーク含む大体の解析が出来ることが多いから、今の所メモリ安全で困ったことはないな。
それよりもRustはまだ新しいから、何かしら思わぬ脆弱性が潜んでいることも考えて、まだ弄りながら様子見って感じ >>236
初心者や素人はC++でもRustでもなくBASICやPythonをやっていればいい
C++もRustも書きこなせる人なら自明なようにRustがはるかに効率いい >>237
デバッグツールを持ち出さなくてもRustはコンパイル時点でほとんど解決する点で圧倒的に優れている
Rustはメモリ安全性だけでなくデータ競合がないことがコンパイル時点で保証される
ポインタ以外の汎用的なヌル安全とエラー処理忘れ防止もRustは標準ライブラリ全体でOptionとResult利用により保証される
C++と比べて開発効率が段違いに良くなる C/C++のメモリリークと隣合わせなスリルがいいんだよ
Rustなんて補助輪付きの言語はプロのプログラマッには温すぎる
コーディングに自信がない奴や素人向けだな、Rustは >>241
C/C++はプログラマとして成長させてくれるよね >>239
変わった言語なので
まず初めに学んだほうが先入観がなく覚えられるよ
そのためにも日本語のドキュメントは
整備したほうが良い >>243
その通りでC++は無駄なデバッグ時間が必要となるけど
テストで発見できなかった分はデバッグもされず実行時のセキュリティ含めたバグとして残ってしまう
Rustならばコンパイル時点ですべて排除できる
>>244
勉強不足すぎだ
C++のスマポで解決できることはRustで解決できることのほんの一部にすぎない >>249
>勉強不足すぎだ
>C++のスマポで解決できることはRustで解決できることのほんの一部にすぎない
他は? >>250
そんなことも知らずにこのスレで書き込み続けているのかよ
他の人たちの書き込みを読んでないのかよ >>250
既にたくさん書いて伝えた
理解できなかったのか? >>253
本当にGCしか知らないんだな
>>249
>勉強不足すぎだ
熨斗をつけてそのままお返ししよう >>255
GC言語も使うしC/C++/Rustも使う
速さと省メモリの点でGC言語は不利だから使い分ける >>249
>勉強不足すぎだ
>C++のスマポで解決できることはRustで解決できることのほんの一部にすぎない
だから他は? >>244
C++スマートポインタは
unique_ptrは使わずともRustでは標準で全て自動解放されるよ
shared_ptrはRustではスレッド内で使えるRcとスレッド間で使えるArcに分かれていて効率的だよ >>260
別にunique_ptrやshared_ptrでええがな
難しくないよ
>shared_ptrはRustではスレッド内で使えるRcとスレッド間で使えるArcに分かれていて効率的だよ
効率的をも少し詳しく! C/C++でスレッドセーフな並列処理を作ろうと思ったら一苦労だけど、Rustだとそうでもないんかな。 >>261
shared_ptrは常に排他制御されコストが高い
共有を増減すると排他制御のコストがかかる
さらに単なる受け渡しも要注意でmoveしないとそのコストが無意味に余分にかかってしまう
一方でRustは排他制御するArcとしないRcの2つが用意されていてそれらの問題なく使い分けられる
>>262
Rustはコンパイルが通った時点でデータ競合がないことを保証されるのでかなり楽 shared_ptrは排他制御してリファレンスカウンタの増減を行うからスレッドセーフ
その代わり重い >>263
なるほどね
std::shared_ptrには参照カウンタの排他制御をオフにする機能はなかったかな?
boost::shared_ptrだと美しくないけどBOOST_SP_DISABLE_THREADSマクロで切り替えられる
最近使ってないがLoki::SmartPtrは確かテンプレートパラメータで切り替えできたかな? Rustでは共存可能
スレッド内のみの共有はRc
スレッド間での共有はArc
切り替えでなく最初から二種類が用意されるべき >>267
同意
std::shared_ptrもLoki::SmartPtrみたいに
テンプレートパラメータで切り替えできれば良いのにね
ただしstd::shared_ptrを規格に入れた時点で
既にboost::shared_ptrもLoki::SmartPtrもあったことを考えると
参照カウンタが競合する機会はほとんどないという見立てで
実装を単純化したのかなと予想する
誰か経緯を知らんかな? 苦肉の策としては
#include <memory>
#define BOOST_SP_DISABLE_THREADS
#include <boost/shared_ptr.hpp>
template <typename T> using Arc = std::shared_ptr <T>;
template <typename T> using Rc = boost::shared_ptr <T>; shared_ptr単独では完全なスレッドセーフではない、という問題もある。
shared_ptrで排他制御される対象はreference counterの増減だけであり、指している値の読み書きはもちろん排他制御されない。
したがってshared_ptrはスレッドセーフだから安心だと誤解していると、危険なプログラムが出来上がるリスクがある。
C++ではプログラマーがこれらの誤解や見落としやミスを全くしないことを求められ、それに依存するためプログラムの安全品質は危うい。
Rustではその点も安全で、Arc<T>はTへの書き込みが出来ないため、排他制御の問題は起きない。
書き込みしたいならば、Arc<Mutex<T>>やArc<RwLock<T>>など必要となる排他制御の種類に合わせて選び、組み合わせて利用する。
それら組み合わせにより、Tへの書き込みができるようになるが、必ずロックで排他制御されるため問題は起きない。
たとえプログラマーが見落としやミスや使い間違えをしても、Rustコンパイラがエラーを出し、該当箇所を教えてくれるため、常に安全性が保証される。 >>270
Mutex <T>を書けば良いのではないかな? >>270
>shared_ptrで排他制御される対象はreference counterの増減だけであり、指している値の読み書きはもちろん排他制御されない。
>したがってshared_ptrはスレッドセーフだから安心だと誤解していると、危険なプログラムが出来上がるリスクがある。
想定してるレベルが低すぎる
マルチスレッドで書くやつにそんなやつはいない
議論が無理やり過ぎ >>272
その件に限らずすべてにおいて、勘違い、見落とし、ミスなどは発生する。
複雑化したときにmutex忘れも、shared_ptr忘れも、間違えてunique_ptr使いも、その他のミスも、何でも実際に起きている。
Rustではそれらが起きてもコンパイラが通さないことで、常に安全性が保証され、無駄なデバッグを避けられる。
C++では無駄なデバッグを招くか、もしくは、そのままリリースしてセキュリティの穴が生じてしまう。
現実にC++が多数の問題を引き起こしてきた。 >>273
「Rustはコンパイルが通っていればマルチスレッドで
競合問題が起きないことが保証される」
これで正しい? 正しいとすれば
マルチスレッドを習得したときの苦労を考えると有用なので
新しくプログラミングを始める人には勧めたい動機になる
俺自身は困ってないので使おうとはあんまり思わんけどね Rustが流行るとすればどの分野になるんだろうか?
一番は安全装置とかに使われる小規模な組み込みソフトかな。
CPUとか開発環境とかがまだ整ってないだろうから、ゆっくりだと思うけど 普及するのにはキラープロダクトが必要
UNIX(C)やMFC(C++)や.NET(C#)のように
大手がプロダクトに採用してトップダウンで流行らせるしか
普及の道はないと思う
ゆっくり普及なんてのはないと思う Visual Studio Rust .Netがでるまで待とう あらためてJavaって良い言語だなって思うわ
ここ十数年だと人類一番の功績じゃね
良い点:
シンプルさ。C#で言う値型を入れようかどうか迷ったときもあったんだろうけど(想像)、
プリミティブと参照型変数の二個だけでやってくという線引がセンスある。
悲しい点:
立てまし。個人的にはジェネリクスもいらんかった。
C++のテンプレートを潔く排除して出てきたのすごいすっきり感あった。
でもあとでジェネリクスは押し負けて?付いてきちゃったけど。
あと貧相な貧相なラムダ式。クロージャを期待したけど結局はanonymous classのといっしょ。
異論は無いと思う >>275
Rustはマルチスレッド時でもマルチタスク時(=グリーンスレッドをRustではタスクと呼ぶ)でも
データ競合を起こさないことが静的に保証されている
唯一のプログラミング言語 Ownershipの元ネタのCycloneはやってねーのけ? Rust、コンパイル遅いっていうけどどれ程なの?C++と比べて遅い? コンパイル後の実行デバッグ時間が激減したのでトータルで要する時間は減少した 現状はバカがイキる為だけに持ち上げられるRust
万一普及したとしてバカが使いこなせるはずもなく 今まで C++ で制御して成功率 99.99% だった
ロケットをわざわざ Rust で描き替えて墜落しても
Rust は悪くない悪いのは GC のせいだと言い張るのが
Rust 信者 >>277
Android(Java)
iOS(Objective-C++) プログラミング言語「Rust」は世界のセキュリティレベルを底上げする
https://wired.jp/article/rust-secure-programming-language-memory-safe/
Androidでは今、暗号鍵を管理する機能の多くがRustで書かれているとGoogleのクライダーマーカーは話す。
たとえば、暗号化したインターネット通信の機能である「DNS over HTTPS」、新バージョンの超広帯域無線(UWB)チップスタック、
そしてグーグルの独自のチップである「Tensor G2」で使用される新しい「Android 仮想化フレームワーク(AVF)」 などもRustで書かれている。
また、BluetoothやWi-Fiなどの通信接続に使われるスタックも、Androidの開発チームによってRustへの変換が積極的に進められている。
理由は、これらが業界の複雑な標準規格に基づいており、脆弱性を多く含む傾向にあるからだとGoogleのクライダーマーカーは付け加える。
つまり最も狙われやすい、あるいは最も重要なソフトウェアの部分からRustに書き換えて、
そこから徐々にRustで書く範囲を広げることで段階的にセキュリティ上の恩恵を受けようという戦略である。 >>280
デッドロックは静的検出はできないでしょ? 段階的に置き換えることができるだけのお金と能力のあるエンジニアを確保できるアメリカの大企業ならいいんだろうけどね
両方無い日本企業には無理無理カタツムリ まず初めにの人はRustは選ばんと思う
Rustがターゲットとしているところで
プログラミングをやるなら
現状でCの習得は避けて通れない
となると学習コストの問題で
文法がほぼ包含関係にあるC++を選ぶことになる
OSの基盤からRustにしないと一向に増えないよ >>3で終わってんだよこのスレ
うだうだ続けたい奴はコード書く能力もないからここで自己顕示欲発揮しちゃうんだろw 能力ある人からRustへ移行していってる
>>294
ほとんどのシステムは複数のプログラムから構成されているため
それら各機能をグレードアップで更新するときにRustへ書き換えることで進んでいる
もちろん新規システムは最初からRustで書くことが多くなっている Rustユーザが増えるストーリーは
トップダウンで基盤を整備するしか有り得ない
Cと文法が乖離してるのはメリットもあるだろうけど
普及にはデメリットとして働いている セキュリティ観点から新規システムはC/C++禁止でRust必須が要件になっていってる
この動きはそれが出来るところから着実に進んでいるので止めようがない >>300
>新規システムはC/C++禁止でRust必須が要件
どこで? デファクトスタンダードの強さは
MSを見ていればまぁ自明だわな 今日のMicrosoftの発表が面白い
発表デモでなぜかPythonからRustへ
https://www.msn.com/en-us/news/technology/microsoft-s-new-bing-ai-chatbot-arrives-in-the-stable-version-of-its-edge-web-browser/
2023/03/15
本日マイクロソフトは、Edgeウェブブラウザの安定バージョンのサイドバーに、新しいBing AIチャットボットが含まれるようになったことを発表しました。
デモンストレーションで、AIにStack Overflowのヒントを調べながらコードのスニペットを書くように依頼しました。
AIはPythonコードをRustに変換することができました。 Rust普及はMSの動向が鍵だよ
自然に増えるもんじゃない Microsoftは自社製品のRust化を進めると同時に普及も進めてるね
日本語ドキュメントも充実してる
Rustを使用したWindowsでの開発
https://learn.microsoft.com/ja-jp/windows/dev-environment/rust/overview 「C++とCの概要」の位置に来ないと普及には程遠い RustがC++と同じ土俵へ採用されてしまった時点で
何もかも優れているRustの勝利
疑われる「C++」の安全性、今後の動きはどうなる
https://japan.zdnet.com/article/35199018/ 次の10年はRustが取った、となると、APIがRustになる
ならば、RustなAPIにC++がきちんと接続できるようになってもおかしくない
そうすると、Rustが実績を積んだ「正しい縛り」を、C++でも使えるようになってくるんではないだろうか
もうそういう試みある? >>311
既にRustとC++の相互呼び出しは実現されているが
Rustから見てC/C++部分は当然unsafe扱い
最終的にC/C++部分が無くなる形で完成することになる OSもアプリケーションも、pure Rustになるんだろ、理想論としては
だとしたら、境界面であるAPIには、縛りにかかる属性情報が露出するはず
C++がそれに対応できないなら、今後C++ではアプリケーションを書けないことになってしまう 慣れて使いこなせるようになると、
Rustの方が書きやすいとほとんどの人が言うほど差があるのだから、
C++がいずれ消えるのは間違いない。 >>298
>能力ある人からRustへ移行していってる
まるでKENYAの作文だな Rustからインラインアセンブラでレジスタいじって安全性が担保されつつC++と遜色ないならもういらんわな ここでぐちゃぐちゃ言っても何も変わらないからさっさとC/C++で書かれた森羅万象の移植やってこいよ >>317
もちろんRustの変数を使う形でインラインアセンブリをRustでは記述できるが
当然ながらRustコンパイラによる保証範囲外となるunsafe部分になる
Rustはunsafe部分のみ人間が安全性を担保すれば全体についてはRustコンパイラが保証する形で役割分担できる
その点でプログラム全体が常にunsafe状態となってしまうC/C++とは根本的に異なる まぁRustでスクラッチから書かれたOSでWindowsやiOSやAndroidを取っ替えるか
スマホみたいな何らかの新しいハードウェアが誕生して
それがRust製で書かれたOSで制御されている状況にならんと普及はせんよ >>321
頭の弱い子ですね
JavaやPerlやJavaScriptやRubyやPHPやPythonなどで書かれたOSは普及していませんが
それらの言語は普及しました >>322
JavaやPerlやJavaScriptやRubyやPHPやPython使ってるところで普及はするかもね
じゃこれで良い? ニッチと言って分かるかな? マイコンでRustを使う試みは結構普及してるみたいだね Rustは電気ドリルや3Dプリンタのような道具なんだから、本当に良いと思えば
自分が使って生産効率を上げたり良い作品を作って披露すれば良いだけなのに、
信者達が無理やり広めようとしているのが嫌だ。
困るのは、C++を使ってる人を馬鹿にすること。 C++をディスってC#を上げまくっていた人達が、Rustに鞍替えした模様。
彼らは5chやtwitterで徹底的にRustを褒めまくっている。
どうしてそんなことをするのか。思想家や哲学者なのか。
マルクスもそういう感じで結果、大勢の人々を苦しめた。 Rustはポテンシャルはあるけど現状で普及するパスが見えていないですから
Rustを愛する者にとってはそこがフラストレーションなのでしょう
普及するパスが見えたら解消すると思うよ C++が怠っていた部分を成し遂げたんだから、Rustは誇っていい
エンジニアが本職なら、C++でもRustでも、なんでも読み書きできないといけないだろう
まあ、じきにC++も追いつくだろ 問題はC 本当に優秀なプログラマなら、C++でもRustでもどっちでも簡単に使えるので、
必要あらば、どっちでも使うだろうが、C++でもメモリーエラーなんて滅多に
起こさないし、起きても原因究明して直せるから、敢えてRustに行く動機もない。
別にRustが使えないからC++を使ってるわけじゃないのに、Rust使う人の方が
憂愁みたいに言われるのはおかしい。 >>329
「Rustは誇っていい」という意味が分かりにくい。Rustを作った人はちょっと
誇っていいかも知れないが、Rustの解説本を書いている人や、Rustを道具として
使っている人が誇っていいわけではない。 ああ、うん
Rust(言語と言語チーム)は誇っていい
その一派につらなる「信者」が誇るのは…まあ人の常かなって >>333
>その一派につらなる「信者」が誇るのは…まあ人の常かなって
信者が誇って良い分けないと思うが。 Rust派先鋒衆がいうのは、Rustに移れば、大多数の脆弱性は自然につぶれるのに、
C++に固執するのがもうクズ。っていう発想 それもわかるんだけどね
なんでも書けてこそのC++ 縛りを記述できないなんて、欠陥でしかない
だから、C++の進化には期待してる 遅々たるものになるかもしれないけど >>335
>Rustに移れば、大多数の脆弱性は自然につぶれるのに、
>C++に固執するのがもうクズ。っていう発想 それもわかるんだけどね
本当に優秀ならば、C++でも脆弱性がが入らない。
mozillaやgoogleの社員がタコなだけ。 >>314
C++からRustライブラリを呼ぶ場合もRustからC++ライブラリを呼ぶ場合も
文法違いすぎて大変そうだけどどうしてるんかな?
Cのライブラリを呼ぶのはどのプログラミング言語からでも余裕だけども
JavaとC++もかなり歪だよね? >>336のような勘違いしてる自信過剰なダメな人たちが今までセキュリティの穴を多数あちこちで生じさせてきた
人間は必ずミスをするという当たり前のことも受け入れられない人はキチガイのみ >>336
一人で作るもんでもないからねえ、大人数だと、体調の悪いヤツとかも混じるだろ
コンパイラに任せたいってのはわからんでもない
俺も、(たとえば)gccとヘッダライブラリに任せて、自分は気楽にごりごり書きたいw >>338
自信過剰も何もC++書ける人だとなぜに
スマートポインタで失敗するのか理解不能だよ
原因は生ポインタ使ってるからなんだろうけど
それなら生ポインタをプロジェクトで禁止にするだけで充分
あとマルチスレッドにおけるデッドロックはRustで検出できるのかい? ボローチェッカだっけ? CとC++で実装できんのかな? ていうか、Rustがもたらそうとしてるのは、プログラミングパラダイムだから、
C++でおんなじように書ければいいんだよ ハズしてたらコンパイルエラーになってくれてだな
Rustは実績を積んだ C++は早くその成果を取り込むべき
ラムダといいコルーチンといい、C++が他に学んだ前例はいくらでもある
>>341
まじそれ >>338
それはプログラマーのレベルが少なくとも俺よりは低いから。 >>343
お前みたいな優秀なヤツが、【わざと】脆弱性を仕込んだコードをコミットしたりするんだよw
他人は信用できねえ
俺クラスになったら、自分自身が一番信用できねえww use 描くだけでコンパイル中にダウンロード始まって
何分も待たされたらそりゃ遅いわ!!!ぷんぷんって
怒るアホも出て来るだろうね >>334
Rust(人気)は俺が育てた!(AA略) >>341
現状では無理
C++33くらいで可能になるかもね >>340
>あとマルチスレッドにおけるデッドロックはRustで検出できるのかい?
コンパイルエラーになるかという意味ならならない
その辺はGoとかと一緒でイディオムで対処 >>348
メモリ安全だけだとあんまり有り難くないな
もしミスってもデバッガで直ぐ分かる訳だし >>349
メモリ安全だけでなく
C++とは異なりRustはデータ競合を完全に防げる
C++とは異なりRustは広義のヌル安全であることも大きい 様々なプログラミング言語と比較してもRustは美しい側に入るとともに
言語機能が強力で可読性が高い
とくにパターンマッチング
これはC++でも導入しようとしているが進んでいないだけでなく
C++で出ている提案では強力でなく可読性もよくないようにみえる
Rustはパターンマッチングが非常に強力で可読性の向上の最大要因となっている >>351
Rustかどうかは別として10年後くらいには
今Rustが実現してるやり方が標準的なものになるのは間違いないから
考え方やメリットデメリット、限界をある程度学んでおいた方がいいかもよ
Rust自体はいいところもあれば悪いところも沢山あるので実際に使うかどうかは状況次第 結局Rustがもひとつ流行らないのって
①エコシステム
②ライブラリ
なんじゃやいの?
①は流行ってきたら充実するものでニワトリと卵だけど、②はどうなん?
②が中々充実しないのは何かRustのライブラリ書いてやろうと言う人が出てこない理由あるんかな? 採用宣言が大手から出たんだし、そのへんは急ピッチで進むっしょ
>>353
10年後には、いまRustが提示しているものを踏まえた、さらにスマートなものが出ているかもしれない
でも、それを理解するには、ここから10年間、Rustの成果を学び、踏まえるのがいい だから俺はいま学ぶぜ
願わくば、10年後にも、しぶとい感じでC++が現役であってほしいな C++は次々と新たな機能を増やし続けてきたが増築工事だから色んな点で限界が多い
例えば話が出ている広い意味のnull安全はC++がoptionalの導入をとっくに行っているが
・なかなか普及しない
・既存ライブラリの仕様とのチグハグ
・パターンマッチング機能の導入がまだなので使い勝手が悪い
などの問題が山積みであまり使われていない
C++の他の機能導入でも似たような状況が多い
Rustが美しく書きやすく読みやすいのはそれらの多くが最初から解決されているからだと感じる
C++をさっさと棄てるのが現実解であると理解できた C++はなんでも書けるかわりに、いまや考えなしに勝手に組み合わせると めちゃくちゃになるんだよね
Rustには引き算の美学の成果が入ってる
C++も、先頭で縛りを宣言できるようにして、美しく書けるようになるべきだ 絶対に ソースコードのコンパイル・ビルドの時点ですべての問題点をエラーで全部弾いてくれたら理想的だね
大抵はテストツールまで書かないと使えない >>350
コンストラクタでlockしてデストラクタでunlockするproxyクラス作って
その一時オブジェクト経由で触れば良いだけなので何を今更という感じ
メモリ安全は別にデバッガですぐ特定できるし
マルチスレッドではRustの利点がない
デッドロックが検出できたらまぁ嬉しいが? >>354
多くの人に使ってもらおうと思ったらCで書いて
各言語のラッパーを提供するってのが多い
RustにこのCの代わりができれば良いんだけども?
もしRustユーザしかリンクできないライブラリだったら
Rustはそもそもユーザー数が少ないし
Rustで書く動機が減る >>357
多人数でやるプロジェクトにはC++は自由過ぎて
その点は書き方にある程度拘束される意義はあると思う Rustでゲームエンジンやグラフィックソフト作れたら認めてやるよ DTMに使いそうなDAWソフトとかでもいいぞ
書き方はGitHubにいろんなOSSの見本があるから簡単でしょ? SDLのRustバインディングはあるけども
Rustで本体を書いて他の言語のバインディングって出来るの?
他の言語との乖離でRustならではの部分が封じられて
あんまり嬉しくないような気もするのだが?
それともRustでライブラリ書いたらターゲットはRustだけになるのかな? >>356
>Rustが美しく書きやすく読みやすいのはそれらの多くが最初から解決されているからだと感じる
俺とは感覚が違う。Rustを美しく感じない。 これは理解できるし、はっきりそう書けばよい:
・Rustの本を書きました。Rustは良い言語なので本を買ってください。
・Rust用のライブラリを書きました。Rustは良い言語なのでライブラリを買ってください。
これは理解できないし、問題:
・C++は害悪なのでRustをみんなが使って世の中を良くしよう。
・自分がC++を使いこなせないのに、使いこなせる人が許せないから、使いこなせるRustを普及させたい。 RustはC++なんかよりずっと簡単! <- これならわかる >>367
出力をcdylibにすれば一般的なCソースのライブラリと同じ形式(soとかdll)で出力されるはず
当然FFI絡みの制約は出てくるしextern指定とかも必要だけど境界部分だけ気を付ければ内部は自由にRustできる
wgpuはRustで書かれたグラフィックライブラリだけどその機能をC/C++から呼ぶためのwrapperでwgpu-nativeがあって
さらにそのC用のwrapper経由で別言語(Pythonとか)のwrapperが作られてたりする
依存関係がややこしいけど
wgpu (Rust製、Rust用Lib出力) ← wgpu-native (Rust製、C用Lib出力) ← wgpu-py (C+Python製、Python用ライブラリ)
みたいな構造 >>359
Rustならマルチスレッドでもマルチタスク(=グリーンスレッド)でも書きやすく
さらにデータ競合を完全に防げるRustしか現状の言語では選択肢ないと思うよ
各言語で書き比べてみれば一目瞭然
そのため並行並列を使うプログラムはC++→RustだけでなくJava→Rustの移行も進んでる >>374
>>そのため並行並列を使うプログラムはC++→RustだけでなくJava→Rustの移行も進んでる
全く進んでいないのだが?w
俺の周りではC++やJavaでマルチスレッドで書く奴の方が多い
というかそもそもRustを使っている奴は一人もいないw
妄想なのか詐欺師なのか...
Linuxでも さもRustの導入が進んでるように言うが実際は>>39だし... マルチスレッドはまあ普通だけどマルチタスクはめちゃくちゃ書きにくいぞ
単純なWeb Serverくらいならいいがちょっと凝った処理を書こうとするとくっそ面倒くさい
tokio依存なのもダメなところ そここそ、OSがRust化するっていうんだから、きれいなAPIが出てきてほしいね
結局、効率を求めたらC API に肉薄することになるし Linuxの現状はRustでドライバが書けるようになったってだけだよ
誤解なきよう >>376
マルチタスク(並行)で綺麗に書ける言語はRustとGoだけだな
GoはPromise(Future)使わないあのスタイルに寄せられるのとGC言語であるため
Rustが汎用では筆頭言語になる >>376
だよな
Rustの非同期が簡単だと勘違いしてるやつはチュートリアルレベルしかやったことないやつだと思うわ >>380
自分でpollしたりするのも含めて色んなレベルで書いているが簡単だぞ
Rustで並行並列が難しいと言うならばとこが難しいのかを具体的に述べよ
そしてそのケースでRustの代わりに使える別言語があるならば述べよ Goと比較したら性能面でも劣ることが多くて同程度の性能を実現したければ手動であれこれやらないといけないからな >>381
そうやって自分が分かってない事を無料で聞き出してしまおうとする。ずる賢い。 >>382
Goが速い遅いと言ってたのは昔の話
今はGoもRust tokioも改善してほぼ同じwork stealing方式になり似たりよったりの速度
C++をあきらめてRustに対抗できるGoを持ち出すしかないほど追い込まれてるのかね
>>383
Rustで並行並列が他の言語より難しいことはない
難しいと主張するならば何が難しいのかを述べたまえ
もし本当に具体的に困ったことがあるならばアドバイスできる >>384
>Rustで並行並列が他の言語より難しいことはない
>難しいと主張するならば何が難しいのかを述べたまえ
>もし本当に具体的に困ったことがあるならばアドバイスできる
問題意識があること、気付くこと、それが大事。
あなたにはそれがない。 >>383
わかり味
こいついつも教えて君だよなぁ
総論しか書けないところみると
マニュアルだけ読み込んだペーパープログラマーがそれを隠すためのネタを欲してるようにしか見えない Goはgoroutine間のデータ競合の発見を実行時のランタイムでやるしかなく
Goはあまりお勧めできないなあ
メモリ共有せずチャネルを使う範囲ならGoでもいいけど
Rustでもチャネルはもちろん使えるし
共有メモリで安全にデータ競合を起こさず使えるからRustがいいよ >>389
Goに限らずデータ競合を実行時にしか検出できない言語ではデータ競合が時々しか起きない場合のデバッグが難しい
Rustを使うべき理由はデータ競合を静的に検出できる点にある >>391
それはマルチスレッドプログラミングのアルゴリズムをRustは強く制限しているから。
だから、その制限から外れるようなアルゴリズムは使えないので柔軟性は欠く。 そこが、新規書き起こしのRustのメリットでもあるわけよな >>393
そして、独自のアルゴリズムは使えないので、アルゴリズムの研究には向かない。 第n次LinkedListおじさんvsGCおじさん戦争 頑張ったら書けるんじゃねーの、それもsafeで
そのへんはC++もおなじ 自分も、ニッチすぎる薄いラッパなら頑張って書くし >>392
Rustで記述できないマルチスレッドプログラミングのアルゴリズムなんてものは存在しない
Rustは柔軟性が非常に高い Rustで書けないのがあると主張している人が例を出せばいいんじゃね
Rustにそんな制限はないからすべて書けるよたぶん 結局何年か後にはlinux kernelを全部rustで書くつもりなんかな 書けなくはないだろ、書きやすいかどうかだ 実際どうなん
C++は、なんでも書けるが、油断すると複雑すぎる代物ができあがる
そんで、「でも例外がくるとー」「でも異常値がくるとー」って >>399
マルチスレッドのアルゴリズムは非常に多く存在していて、ある意味では無限に
考えられる。Rustは数個しかサポートしていないから、無理。 >>402
Rustで書けない例があると主張したいなら例を出せばいいんじゃね
Rustに何か制限があるわけじゃないからおそらくなんでも書けるよ >>404
マジ?信じられん
もし本当ならそのunsafeを使わざるを得なかった例を具体的に出せばいいんじゃね unsafeをゼロにするよりも、極小なunsafeブロックを組み込んで華麗にキメてほしいね
これはC++も同様 >>400
そういう枯れた古いものをわざわざ書き直すことに熱意を燃やせる人間は少ない
新世代のデータベースやcrypt/blockchainのように金になる新しい成長分野ではc/c++よりもrustがよく使われてる
技術の自然な世代交代は既存システムの置き換えから始まるものではない >>405
次のことが成り立っていれば教えてもらわなくても自然に分かる:
・マルチスレッドの事を理解している。
・Rustのことを理解している。
・算数的直観力に優れる。 複製おじさん vs 100点おじさん
Fight! >>401
そのへんの問題もRustだと安全安心なのがいいよなー
特に例外機構を無くしたのは大成功
あとResult放置してると警告もしてくれるしな
>>404
そのunsafe使わないと書けなかったコードを出してみ
寄ってたかって添削してやろう >>410
俺は天才だから、お前みたいな凡人に無料でヒントをくれてやらない。 Rustって、削ぎ落したものは復活させません、って宣言とかしてるん? >>408
Rustをあんまり知らんけど言語間に根本的な差はなくね? >>408はいつものキチガイ
RustもC++もコードを書けたことがない
相手にするだけ無駄 >>414
今さらなに言ってるんだ?
ここにはキチガイしかいないぞ?
俺もお前もな >>416
アルゴリズムを書ける書けないの差はでない Rustほとんど知らん俺でも総合的にRustのほうがC++よりはいいだろと思う
C++より後発言語で、で、ライバルになるC++に劣っているようじゃダメだからな
で、お前らは、すごいRustで具体的に何を作っているんだ? ChatGPT先生に聞いてみた
>>404の言う通り
template <typename T>
class LockFreeStack {
public:
void push(const T& value) {
Node* new_node = new Node(value);
new_node->next = head.load(std::memory_order_relaxed);
while (!head.compare_exchange_weak(new_node->next, new_node,
std::memory_order_release,
std::memory_order_relaxed));
}
std::shared_ptr<T> pop() {
Node* old_head = head.load(std::memory_order_relaxed);
while (old_head && !head.compare_exchange_weak(old_head, old_head->next,
std::memory_order_acquire,
std::memory_order_relaxed));
return old_head ? std::make_shared<T>(old_head->value) : nullptr;
}
private:
struct Node {
T value;
Node* next;
Node(const T& value) : value(value), next(nullptr) {}
};
std::atomic<Node*> head{nullptr};
}; >>419はこれと同じのをRustで書いたらunsafeになる(だろ?)
って言いたいんだろ
偉大なるChatGPT先生が言うんだから間違いないだろな >>421
いやChatGPTは信用しない方が良い
俺はRustは良く分からんがChatGPT曰く
>Rustには、このようなロックフリーなデータ構造を提供する
>クレート(ライブラリ)が存在します。その一つがcrossbeamです。
>このクレートは、スレッドセーフで効率的なデータ構造を提供しており、
>crossbeam内でUnsafeな操作が行われているにもかかわらず、
>APIを通じて安全に使用できます。
だそうな
crossbeamってRustで書かれとらんのかな? >>422
本当は、ライブラリの中だけをunsafeにして、アプリ側はsafeに出来るケースも有れば、
アプリ側も unsafe を消せないケースもありえる。 unsafeってキーワード使えばチェックをオフにできるのね ArcとAtomicでほぼそのまま書けるけど
pointer dereferenceのためにunsafeは必須 平日の昼にID真っ赤なのは仕事か
板違いのスレで必死に毎日お疲れさん ちょうどオライリーから「Rust Atomics and Locks」という本が出てるよ
基本的な内容を説明してる本なのでC++でatomicsやmemory orderingに慣れ親しんでる人がわざわざ買うほどのものではないかもしれないけど
かなりわかりやすくまとまってるのでRustでこの辺りの機能を使ったコードを良く書く人は読んで置いて損はないと思う Lock-Freeなデータ構造を自分で作りたい人はこれを見るといい
Porting Java's ConcurrentHashMap to Rust (part 1)
https://www.youtube.com/watch?v=yQFWmGaFBjk > cargo new hoge
> cargo run
→ 3MB
main.rs に
use clap::Parser;
追加すると
> cargo run
→ 100MB 超えるんだが
どうすれば容量減らせるん? とりあえずは
cargo clean
で良いはず
最初から余計なのは造りたくないって言う話ならほんまにしらん やっぱC++にもボローチェッカ欲しい
なんならCにも欲しい
attributeとか併用したら、やってできないことはないんじゃねーの rustの読み物公式が面白いのしっかり出してるから
それ読むだけでも大分良い
後発言語らしくイイトコどりしまくってる
null無くした代わりになんでもかんでもラップしてるから若干だるいけど
すげー面白い cpp2rsみたいのがじきできるから、そしたら一発
ただ、それだと、safeではあるけど、Rustのシンプルさは(メリットとして)失うな 文法がRustなだけで
Rustのコードとして使い物にならん
ゲテモノが出て来るわ
今のGPTも酷い ああ、あと全自動とは言わない あっちこっちで、あれなおせーこれなおせーって言われるかと たしかに、C++でメモリ安全性を静的チェックするツールを作るのはなかなか難しいもんかね? valgrindはgcc関係なくないか?
rustでもメモリリークの確認に使う
有用なツールだけど静的チェックと呼べるのかは疑問 valgrindは実行時チェックだから出現レアケースだと時間内に検出できない 静的ツールだとこんなのもあるね
https://cppcheck.sourceforge.io/
スマートポインタ使えばそもそもいらんがね メモリ不安全の何が悪いかってメモリリークじゃなくて間違った場所にアクセスしちゃうことだと思うのだが Windowsで実行しています
https://doc.rust-lang.org/stable/std/process/
ここを観て
use std::process::{Command, Stdio};
let c = "cmd";
let a = "/c echo Hello, world!";
let o = Command::new(c).arg(a).output().expect("Failed to start process");
let v1 = o.stdout.as_slice();
すると v に必ず
[0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20,
0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21, 0x22, 0x0d, 0x0a]
が入ります
let p = Command::new(c).arg(a).stdout(Stdio::piped()).spawn().expect("Failed to start process");
let e = p.wait_with_output().expect("Failed to open stdout");
let v2 = e.stdout.as_slice();
としても結果同じです
Hello, world!"+改行
で余計な"が入っているのですがなぜでしょう?どのように取り除くのが正しい対処方法を教えて!! let o = Command::new(c).args(&["/c", "echo Hello, world!"]).output().expect("Failed to start process"); C++は例外処理とかもバグを生みやすくしていると思う C++にmoveや右辺値参照ができる前に挫折した連中がRustスゲーとか言うのは何か違うと思う。 失敗だか挫折だか知らんけど
失敗してもお金が減らない失敗は半分大成功だよ とりあえず3つに絞るとして
(1)ダングリングがないメモリ安全性の保証
(2)データやポインタのヌル安全性の保証
(3)データ競合がない安全性の保証
Rustはコンパイラが通れば保証されるが
C++は(2)(3)は無理として(1)についてもプログラマーがどんなに複雑化してもミスなく記述できた場合のみその自己責任で実現
そのためC++ではバグやセキュリティの穴が現在進行形で量産されている でもRustはLockFreeQueueをunsafeにしか書けないでしょ? LockFreeQueueもsafeなインタフェースを提供できている
https://docs.rs/lockfree/
中身はunsafeを使う部分が一部あるが全てコメントに理由が記述されているようにsafeな操作でありその部分の安全性のみを人が保証
Rustの最大の特徴はこのようにunsafeを使ったsafeな操作を内部に封じ込めて外部にsafeなインタフェースを提供できること
そしてそのライブラリを使った任意のプログラム全体の安全性がRustコンパイラにより保証される >>466
Rustにはunsafeを認めるんだなw アンフェアだね
C++もスマートポインタを使えばメモリリークは起こらんのだよ full safeが至上なんじゃないんだよ
それだとマイコンでrustが使えなくなるし、safe C++だって実現しなくなる C#もAOTコンパイルに対応したしもうこっちでよくねる >>468
safeじゃないRustねぇw 苦しいな
言語を覚えるのが趣味なら使えば スマポスマポいうけどさ、なら、スマポオンリーっていうpragmaつくればよくね
それとC++はなんでもかんでもnewする習慣がついちゃって、
そこはスタックに物を置きたくなるRustのほうが能率よくなっちゃってねえか >>467
違いは明白
C++はプログラム全てがunsafeエリア(=人が安全性を保証する)
Rustはプログラムのほとんとがsafeエリア(=コンパイラが安全性を保証する)
(Rustには一部の閉じ込められた局所的な部分のみunsafeが存在しそこに限定して人が安全性を保証する) C#でいいやって時代が来そうだな
.NET7でAOTコンパイル対応したから
Rustなんかより遥かに簡単だし たとえば、メモリマップドI/Oが扱えない言語は、本気でやりこもうとは思えない
ちなみに、C#はプリコンパイルできるスクリプト言語として、とても便利に日々使ってる >>474
まぁ時期対応するでしょ
使ってる人Rustより遥かに多いし >>472
後退したなw
Rustを覚えるよりもスマートポインタ使う方がずっと楽だよ
どうせC言語は覚えなきゃならんのだから
C/Rustを覚えるよりC/C++を覚える方がずっと効率的 >>473
C#はC++やRustのカバーする範囲を全く満たせないのでこのスレでは論外
C#はGCがあるし省メモリや高速性もないし更にはインラインアセンブリも書けない >>477
AOTに対応したんだから速度では勝負できるよ >>478
へー
JavaのAOTってgcjのやつはGCなかったっけ?
C#のAOTはGCなくなるんだ >>476
後退って何?
Rustはコンパイラが安全性を保証できる言語でC++は人が安全性を保証する言語で何も変わっていない
C++スマポでなんとかできる安全性の範囲は>>464のうちの(1)だけだから話にならない >>482
>後退って何?
おまいさんのディフェンスライン >>478
嘘つき
C#はGC言語なのでAOTコンパイルしようがGCは無くなりません
C#がC/C++/Rustの代わりになることはできません C++って今もvectorの要素を参照しながら末尾に要素を追加しまくると参照先がいなくなる事故は発生すると思う
最近のC++はよく知らないけどスマートポインタで防げるの? >>464
>(3)データ競合がない安全性の保証
共有データをスマートポインタに入れといて
アクセスする際には共有データではなくて
一時Proxyを経由してアクセスすればよい
Proxyのコンストラクタでロックしてデストラクタでアンロックする
RustのMutex相当で簡単に実装出来る
>(2)データやポインタのヌル安全性の保証
これはどういうこと? 静的に保証しろってことかな? >>486
vectorは連続するアドレスに領域を取ることが保証されているコンテナなので
末尾に要素をしてcapacityを超えると当然再配置が起こる
他のコンテナを使うべし >>486
もし最大要素数が決まってるなら
vectorで領域をreserveしといて
その範囲で追加ってことなら
再配置は起こらない
いずれにしても仕様を調べて使うべし >>488
>>489
サンクス
なんかスマートポインタ推されてるからリアロケーション追跡するポインタとか出来てるのかと思った >>487
C++のスマポは使い方をミスったらおしまいで実際に問題を起こし続けている欠陥品
null安全か否かは言語仕様で決まりもちろん静的に防げる
当然C++はnull安全な言語ではない
>>488
vectorの自動メモリ再配置によるダングリング発生がうっかりミスで容易に発生するC++は欠陥言語 >>491
>C++のスマポは使い方をミスったらおしまいで実際に問題を起こし続けている欠陥品
どういうミスかな? 書いてみ
>null安全か否かは言語仕様で決まりもちろん静的に防げる
これもどういうケースを言っているのか分からんので書いてみて
>vectorの自動メモリ再配置によるダングリング発生がうっかりミスで容易に発生するC++は欠陥言語
連続するアドレスに領域を取ることが保証されているコンテナはRustにはないのかな?
C++はもちろんメモリ再配置しない(領域が連続しない)コンテナを選択できる
反論したいので具体的に書いてね
無理かもしれんがもし書けるならC++のソースで例示してね ちゃんと書けば動く、は言語として甘え
C++は一刻も早く進化すべきだ >>491
欠陥言語というか他の言語たちと比べればCやC++はわずかなミスで危険なことになるから大きなマイナスかもしれないけど
省メモリで高速という他の言語では得られない巨大なプラスがあるからC++は必須の存在だったのよ
今はその巨大なプラスがありつつマイナスのないRustが登場したからC++は価値がなくなり役目を終えたけどね >>495
役目を終えたならC++で書かれた全てのソフトウェアがRustになってもおかしくないけど全くそうじゃないよな? >>496
既存システムの書き直しは時間と費用がかかるからやるとしても少しずつでしょ
多くのシステムは大規模更新時の機会にでしょ
新規に登場したシステムはRust製になっていってますね >>497
ならないと思うけどね
まぁ何言っても無駄かw そもそもC++ってCと比較しても脆弱性が下がる気がする。
なんか初心者泣かせのトラップが多すぎるんだよな。 >>499
>初心者泣かせのトラップ
むしろ知ったかがドツボに嵌る >>492
rustのvectorは再配置される可能性がある操作時は他からの参照がないことがコンパイル時に保証されるので連続領域でも問題ないよ >>503
ほう! Rustはよう知らんのでC++で聞いて申し訳ないが
以下コメントの部分(1)と(2)は
Rustで相当するコードを書いたらコンパイルが通らないということかな?
#include <iostream>
#include <vector>
#define DOUT(arg) std::cout << #arg": " << arg << '\n';
int main () {
std::vector <int> v;
v.reserve (1);
DOUT (v.capacity ());
v.push_back (10); // (1) Rustで許容 or エラー?
auto itr {v.begin ()};
DOUT (*itr);
v.push_back (11); // (2) Rustで許容 or エラー?
DOUT (v.capacity ());
// DOUT (*itr); // dangerous
return 0;
}
$ ./a.out
v.capacity (): 1
*itr: 10
v.capacity (): 2 >>504
(1)の段階では問題ないけど
(2)の段階ではitrとpush_backがコンフリクトするからコンパイルエラー >>504
当然エラーは起きない
fn main() {
let mut v = Vec::<i32>::new();
v.reserve_exact(1);
dbg!(v.capacity());
v.push(10);
let first = &v[0];
dbg!(*first);
v.push(11);
dbg!(v.capacity());
dbg!(v.len());
// dbg!(*first); // dangerousなこれを入れたときだけコンパイルエラー
}
[src/main.rs:4] v.capacity() = 1
[src/main.rs:7] *first = 10
[src/main.rs:9] v.capacity() = 4
[src/main.rs:10] v.len() = 2 >>506が正しいよ
オレはdangerousがある前提で考えてたから (2)の段階より前に参照や可変参照があっても
(2)の段階より後に使われなければ
(2)の段階より前までにそれらの参照のスコープが自動的に終わる(=ライフタイムが尽きる)
したがってコンフリクトは起きない
一方でもしdangerousの部分のコードがある場合は
(2)の段階より後に使われているため
コンフリクトが起きるためコンパイルエラー 有難う
reserve_exactの引数が定数1のときには
最終行のdangerousを入れるとコンパイルエラーを出すということだが
reserve_exactの引数が変数で実行時にしか定まらんときは
コンパイルエラーにできないと思うんだが危険じゃね? >>510
なるほどー
Rustってデストラクタはいつ呼ばれるの?
ライフタイムの終わり? あるいはデストラクタはない? >>511
指定サイズは一切関係ない
データ競合が起きないようにmultiple readers or single writerの鉄則に基づく
pushすなわち書き換えたいならば他にreader(参照)もwriter(可変参照)も生きていてはいけない
>>512
所有権を持っている変数がスコープから外れると
所有者が居なくなりデストラクタ相当が呼ばれて自動的に安全にメモリ解放される >>513
>>>511
>指定サイズは一切関係ない
>データ競合が起きないようにmultiple readers or single writerの鉄則に基づく
>pushすなわち書き換えたいならば他にreader(参照)もwriter(可変参照)も生きていてはいけない
pushしたあとはたとえcapacityの範囲内で再配置が行われてないとしても
参照を取得し直すってことかな? >>513
Rustのスコープ=ライフタイムとすると
デストラクタが呼ばれるタイミングが分かり難くないかい?
ちょっとソースをいじって後ろの方でインスタンスを触ると
呼ばれるデストラクタが呼ばれるタイミングも
自動的に後ろになるということかな?
C++ほどデストラクタに処理を書かないのかな? >>514
再配置だけでなく値が書き換わる可能性もある
それらの可能性やそれらの操作を跨いで参照を保持してはいけない
逆に言えば参照を持ち続けることができているならば指している値が変わらないことが保証される
これはバグを防ぐとともにコンパイラによる最適化の余地も広げ高速化にも寄与する >>516
なるほどね
まぁ俺は再配置が起こらないと分かるところで
いちいち参照は取り直したくはないな
Rustのデストラクタが呼ばれるタイミングは
インスタンスのライフタイムで変わりうるということで良い? >>515
デストラクタが呼ばれるのはその変数の「ブロックスコープ」のブロックを出るタイミングだから一定している ブロックスコープって多分C++のスコープと同じだよね?
ライフタイムとまた違うのかな? 複雑だなぁ >>519
誤解をしている
ブロックの途中で打ち切られる可能性があるのは参照のライフタイム
そして参照にはデストラクタはない
一方で値そのもののライフタイムつまり所有権が尽きるのは常にブロックスコープに従う
デストラクタが存在すればブロックを抜けるタイミングで呼ばれる
その後でメモリ解放が自動的に行われる デストラクタは所有してる変数のブロックを抜けるまでに呼ばれることが保証されてるけど
正確なタイミングはコンパイラが決めてるから予測はできない
例えば何かを解放しないと以降で競合が生じる場合はブロックの途中で解放されることもある
ただ
A()
B(&A)
みたいにBがAを参照してるような状況だとBが消えるまでAを動かせないから
結果的にC++と同じように逆順で解放されることになる
ライフタイム周りはコンパイラが制約を満たせる処理順を見つけて裏で調整する感じだから
最初は戸惑うかもしれないね >>521
let _ = x; で棄てる以外に
ブロックの途中でデストラクタが呼ばれるケースあるっけ? >>520,521
なるほどね
参照って読んでるのは>>506だとfirstのことかな?
参照の中にC++のstd::shared_ptrの挙動を内在させてるイメージを持った
Vecのアクセスにiteratorは使わないのかな? >>523
デストラクタにスマポもポインタも関係ない
Rustでは任意の自作型にデストラクタを実装できる
(ただしCopyを実装していないことが条件)
// 例えば整数i32型のみを持つ構造体Foo
struct Foo(i32);
impl Drop for Foo {
// デストラクタ実装
fn drop(&mut self) {
println!("drop: Foo({})", self.0);
}
}
fn main() {
let _x = Foo(123); // メインブロックを終えてからdropされる
{
let _x = Foo(456); // 内ブロックを終えてからdropされる
let _x = Foo(789); // 内ブロックを終えてからdropされる
println!("内ブロック終わり");
}
println!("メインブロック終わり");
}
【実行結果】
内ブロック終わり
drop: Foo(789)
drop: Foo(456)
メインブロック終わり
drop: Foo(123) >>522
すまん
ちょっと勘違いしてた
Dropあると明示的に捨てる必要あるな >>524
C++とRustはiteratorで指すものが微妙に異なるので要注意だがまずは折衷するとして
例えば
let mut v = vec![1, 2, 3];
for p in v.iter_mut() {
*p += 10;
}
これでイテレータを使って11,12,13 >>521
Drop scopeがブロックとは限らないだけで予測できないわけではなくね?
>>525
let x = Foo(123).0 * 2;
とか
let mut x = Foo(124);
x = Foo(456);
とか >>527
>>506の let first = &v[0]; の部分をイテレータに差し替えると
(記法は分からんが仮に let first = v.iter() かな?)
イテレータのライフタイムも参照の場合と変わらず
v.push(11);と最終行のdangerousを併存させると
capacityに関わらず問答無用にコンパイルエラーといことかな? >>528
変数が所有している値のデストラクタが呼ばれるのはブロックを抜けた直後だけど
変数が所有しない一時的な値や変数が所有しなくなる代入前の値などは
_へ棄てるのと同じくブロック途中でデストラクタが呼ばれるね >>529
もちろんイテレータは参照もしくは可変参照を持つ形となるのでsingle writer or multiple readersを満たす必要がある
それを満たせなければコンパイルエラーとなりデータ競合を防げる >>531
棄てるのは _ へ棄てなくてもいくらでも方法があり
例えばブロックを作れば
{
let _tmp = x;
}
これで_tmpへ値が移動してブロックを抜けるときに消える
他にも例えば以下の関数を定義して
fn 棄てる<T>(_tmp: T) {
// 何もなし
}
棄てる(x); とすればその関数へ値が移動して関数ブロックを抜けるときに消える
この棄てる関数は同じものがstd::mem::drop()に用意されているので意図をはっきりさせるためにはそれを使うことで可読性を持たせる >>530
細かいことだけど一時的な値は内部的に一時変数が所有してることになってて一時変数がDrop scopeを抜けていなくなるタイミングでデストラクタが実行される
let _ = Foo(123);やx = Foo(456);は代入によって値の所有者がいなくなるからそのタイミングですぐにデストラクタが実行される >>533
こういうことだわな
#include <iostream>
using namespace std;
struct A {
A () {cout << "constructor\n";}
~A () {cout << "destructor\n";}
};
template <typename T> void drop (unique_ptr <T> &&p) {}
int main () {
auto x {make_unique <A> ()};
{
auto _tmp = move (x);
}
drop (move (x));
return 0;
} >>504
そういう小さい単純な例ならばdangerousなデータ競合であると自明だが
もっと複雑化して見逃す例が実際に起きてセキュリティの穴になる デバッガですぐに分かることなので
みょうちくりんな文法を新たに覚えようという動機にはならん 不明な挙動があるのが発見されてない時点でもデバッガ使うの? 変なコード書いた本人に自覚がないから不具合として発現するのであって、正常に動くであろうと期待できてる時点でも?
時間の無駄では?
デバッガでわかるよりコンパイラでわかるなら圧倒的にそっちがベターでもあるし >>541
>不明な挙動があるのが発見されてない時点で
それはいくらなんでも無理だろw >>540
デバッガなど実行時でないと検知できないショボいプログラミング言語は滅びそう
昔はC++は神の言語と信じていたけどアドバンテージを全て失ってしまったもの コンパイル時点でチェックが入るのはRustの利点だが
C/C++と乖離した文法を新たに覚えるというコストを払おうとは全く思わん
俺がRustを覚えるとしたらシステムコールがRustで書かれたOSを
使うことになったときだけ
当分ない >>543
でもLockFreeQueueをsafeで実装できないんでしょ? 周りに使用を強制されるほどRustは普及していないので
Rust推しの諸君は自らRustを選択したのだろうけど
そんなにCでのメモリの扱い方に苦労したのかい?
Rust使う人はどちらかというと言語マニアの人達だと思ってたのだが? >>545
そういうのはすべてsafeなインタフェイスでライブラリが作られてるから
LockFree{Queue,Stack,Map,Set,Chanel}すべてsafeなインタフェイスを用いてRustプログラミングできるよ >>546
開発効率と可読性が圧倒的にRust>>>C++
Rustはコンパイル時点でミスが見つかるから効率良すぎ
可読性も大差でパターンマッチングの有無も大きい >>547
Rustでプログラミンしたいのではなくて
言語のウリとしている特徴の不備の一例として上げている
平たく言うと中途半端 >>549
すべてがunsafeなC++と違って
RustならLockFree{Queue,Stack,Map,Set,Chanel}をsafeなインタフェイスで使うことで自分の書くプログラムをsafeにできるよ
つまりRustコンパイラが書いたプログラムの安全性の保証をしてくれるよ >>550
Rustではsafeで全てを表現したいという目論見が破綻した
ということを指摘したい
これで良いかな?
更に良い言語が出るかもね Rustは例えばVecすら中身はunsafeを使ったsafeなコードだらけだぞ
LockFreeも全く同様
unsafeを使ったsafeなコードで基本ライブラリを作成しsafeなインターフェースを提供できることがRustの最大の長所
それらを使うプログラムはsafeにすることが出来てコンパイル時点で各問題を排除できる
C++が敗北した理由である >>552
>Rustは例えばVecすら中身はunsafeを使ったsafeなコードだらけだぞ
だめだめじゃん
設計が間違ってるんだよ(というか無理だったんだよ) プログラムすべてがunsafeなC++という失敗作を改善したことを設計ミスと言うのは理不尽ね >>543
C++大好きだが、神の言語とはちょっと違う希がす >>554
Rustは一過性の言語だと思うよ
C++はCを包含しているからそうそう消えないと思うが
Rustは後続の言語にオーバーライドされると思う 現代語はコロコロ変わるが古文漢文は変化しないからそうそう消えない
理系のくせにそこに気付くとはえらいね 大手が採用するといったんだから当面生きてるでしょ
C/C++は進化はよ もう負けたんだよC++は
向こうの方が宣伝がうまかった ついこないだまで、コルーチンだって書けなかっただろ
C++が「負け」てるのは、今に始まったことじゃない
キャッチアップしていってくれればいいんだよ Nimは脳汁出るんだが
Rustからは出て来ない
::が邪魔しとるんかの >>543
Cは神言語だが
C++は神じゃないどころか
クソ言語だと言うのは当初から言われてた C++はたとえリアルタイム性があっても、信頼性が求められる業務をしようとすると、どうしてもCで良いじゃんってレベルまでコーディングルールをガチガチに制約するからね。 C++のメリットが完全に無くなったな
無理に挙げるとすれば過去のプログラムと過去のプログラマーくらいか C++のメリットは自由度
自由が障壁になる用途ではメリットもクソもないw
C++で書きたいというニーズは当面残る
だからC++には進化してもらわないといけない GC無し言語でやりたいことは全部Rustでやって
C/C++には滅びて欲しい人間が増えてんだろ
プレーンCのコードぐらいRustにコンバート出来るんじゃね?
知らんけど C++中毒な人が多いからね(俺含む
捨てろと言われても無理だねえw Rustを使わないとは一言もいってない
>>563
これまで、自由になりすぎたC++をいかに縛るかっていう試みはいくらもあったが、普及しなかった
ついにRustが答えを出した C++は「いや~負けましたね~」とかいいながら、その成果を吸収すればいい 自分で自由を縛ろうというインセンティブは働かないからね
何らかの外からの圧力がない限りなかなか増えないだろうね
キラープロダクトがあれば一気に普及するだろうけど メモリ管理云々言ってる人もセールストークの受け売りで
自分でメモリ管理に苦労して「あ! Rustが解決法だ!」って
始めた人はいないだろうし C++に依存すればするほど、これgdgdだ…ってのがわかってくるもんだけど、
どう縛るのが「正解」か、なかなか答えが出なかったんだよね
スマポどころか、ハンドルや参照カウントの概念が大昔からあったけど、決定打にならなかった >>570
それは自然言語と同じで使う人のレベルによる おまいらRedoxとかどうよ? GoogleのOSは一般の人は使えるの? 自由には需要のある自由と需要のない自由があってだな
どっちも供給されなければ胡散臭いとか偽善だとか
需要ってあなたの願望ですよね、とかいうのが自由にまつわる典型的な詭弁 需要あるから>>567の言うように
「自由になりすぎたC++をいかに縛るかっていう試みは
いくらもあったが、普及しなかった」のでは?
Rustもこのままだとone of themだろうけど 規格となるに足る、縛り(の規格)の決定打がなかった
あーでもないこーでもないいって、混沌を放置したのはC++の落ち度
バイナリだって肥大化し放題だったしね Cに近いC++erは、忸怩たる思いで眺めてたものさ ここって情報古い?
https://maku77.github.io/rust/
あと
if let Ok(hoge) = fuga {
}
って本当に可読性良くなってると思ってる?(嫌味じゃなくてマジでRust推しの人の意見聴きたい) >>575
は? C++はISOもJISも規格あるやろ?
Rustに規格あるの? >>577
大手が採用するといったんだから、採用されるバージョンが、当面のデファクトスタンダードになる
それは規格といっていいよ そして規格は、管理下で進化する ダメだこりゃ
普及はもしするとしても30年くらいは掛かりそう >>576
Rustの if let でのenumパターンマッチングは、
まずRustのenumを理解する必要があるけど、例えば、
enum State {
StateA(i32),
StateB(i32),
StateC(i32, f32),
}
if let State::StateA(i) = x {
println!("StateA: {i}");
}
これをc++で書こうとするとこうなるのかな。
struct StateA { int i; };
struct StateB { int i; };
struct StateC { int i; float f; };
typedef std::variant<StateA, StateB, StateC> State;
if (std::holds_alternative<StateA>(x)) {
StateA& a = std::get<StateA>(x);
std::cout << "StateA: " << a.i << "\n";
}
この両者がたぶん同じ。
if let構文のおかげでRustは可読性が増していると思う。 >>576
>if let Ok(hoge) = fuga {
>}
>って本当に可読性良くなってると思ってる?
ResultやOptionが複数ネストしていくと可読性が低いコードはどうしてもできるけど単純なやつは何の問題もないと思ってる
ちなみに何と比べてる? >>581
C++は利便性のいい代数的データ型の導入に失敗したからしょうがない
さらにパターンマッチングの導入は未だに議論中のまま進みそうにない
結果としてそのような不便で分かりにくい記述をするしかない C++にはswitchを使うなunionを使うなという縛りがあった
CとC++を意図的に隔離すれば縛りを無視できるから問題視されないが if letとその比較対象も、言語を統一しようと思わなければ問題ないんだろう ぶっちゃけRUSTでなくてもいいんだよ
安全性のためには
schemeとかHaskellみたいな言語には定義外の動作が(基本的には)存在しないという強力な安全性があるわけだし
じゃあなんでこんなにRUSTがもてはやされるのかというと、単に宣伝がうまかっただけ safe Rustには未定義動作が存在しない
そしてunsafeを用いてsafeなインタフェースを提供する時にもそれが義務付けられている
したがってそれらを用いるRustに未定義動作は存在しない
未定義動作まみれのC/C++との決定的な違いである 間違うヤツが悪い、って世代の規格だもんな、変に不親切は徹底してるわw C++に憧れるのをやめましょう
憧れてしまったら超えられないんで >>581
Rustの代数的データ型であるenumに対して
対応するC++のstd::variantは五重苦だよな
・機能が弱い
・使いにくい
・見にくい
・使われていない
・知られていない
C++の機能強化は尽く失敗していて進化が望めない >>588
safeと限定しているところが誠実で笑える
良いと思うよ!w まぁRust使うくらいならC++使うよねってのはあるよね
これまでの資産が全然違うわ
DirectXとかOpenGLとかオーディオ系の低レイヤーのやつはやっぱりC++が強い Rust信者が全部ラッパー作ってくれるならまぁわからんでも無いけど君たちどうせ人が作ったライブラリしか使わないんでしょ? 大手が採用するっていうんだから、大手がどんどんライブラリ置き換えやるでしょ
ただラッパ書くだけじゃなくて、Rustで書けばAPIを適切に使用してるって保証されるものじゃないとね 人任せだなw
Cと共存なんて考えだと廃れて消えると思うよ
カーネルからRustにしないとな
以下の考察は俺も同じ印象を持っている
RustもJuliaやGoみたいに廃れて消えていく気がしている。
https://qiita.com/AKKYM/items/78c04840bc72d9db834d 技術的な良し悪しとしてはRustは充分だと思うけど
言語が使われるかどうかはその上の生態学の問題だからね なんでカーネルとシェルが共存する現実を学ぶことすらできないんだろうなあ
スマホにはシェルスクリプトがないから? カーネルから書かないと
諸君のフラストレーションは解消されないと思うよ 打倒するC++の最大の特徴はCを包含していること
C++覚えればCの知識は付いてくるが
CとRust両方覚えるの面倒やん?
CをリプレースしなければC++もリプレスできん >>591
C++の可読性の低さはそのような無理矢理な機能拡張の失敗にある >>600
>C++覚えればCの知識は付いてくるが
doubt >>596
>TypeScriptはずっと流行っていてこれから廃れていく気はしない。この差はなんなんだろう。。。
たいしたことやってないから >>596
Qiitaって5chと同レベルだったんだな
記事もコメントもここまで酷いとは >>606
記事はバカだけどコメントはまあいいんじゃね?
それよりも、Rustを置き換えられる言語が出現しないと、Rustの天下が続きそ。
C並みに高速で何でも書けてGCもなく、にも関わらず様々な安全性が静的に保証される言語が、Rust以外に芽も出てこなさげ。 何が続きそ。だよ
自演バレないように新文体開拓しようとしてんのマジでキモいわ コメントしたった
TypeScriptはC#やDelphiを作ったアンダースヘルスバーグが設計してるからです
以上 Rustまだ全然天下じゃないんだが…
周り見えてない人なのかな? 言うほどガベコレ悪いか?って話になるんだが君たち何を作ってんだ? 言うほど1フレーム1フレームの処理落ちが問題になることしてんの?
ゲームくらいじゃね? その点ゲームでRustは使われない
マジで何してんの?って話よな >>614
車載ソフト関係だけど、命に関わるようなシステムは最大実行時間を理論的に算出出来ないとアカんのや
GCだとそれが出来ないから論外なんや、、 >>616
ほんでその車載ソフトはRustで書かれんのか? >>617
いや、まだ言語的に対応してないからC/C++だね、、 >>618
やっぱりね
いつになるんだろうねRustが対応するの
一生来ないかもしれん >>619
そうやね
ぶっちゃけ危なそうなものはコーディングルールで縛られるし、過去トラブルや不具合対策も沢山あるから困らないんだよね。
品質保証のためにアセンブラも見るけど、C/C++はアセンブラと比べながら見やすいし 噂によると節電のためにRustを使うらしいな
電気代よりも例えば家賃の方がよっぽど高い人生だったら一生使わないのでは このままC++は消えていくだろう
アドバンテージが何も残っていない 上の方で
「Rustのライブラリはあらかた揃って退屈なメンテ作業しか残ってない状態、そんなつまらない作業誰もしないから誰もメンテしなくなってだんだん人が離れていく一歩手前」みたいなQiiitaの記事あったけど、そんなライブラリ充実し始めてる? 新規プロジェクトは大方Rustになったが
既存プロジェクトは大規模な更新でしか切り替わらないだろな どっちかって言うと今Pythonとかでちゃんと動いてる、例えばAI用のテンソル計算処理、統計処理のライブラリをRuby用のために用意し直すのっていわゆる「車輪の再発明」みたいになってしまうからわざわざRustに移植するのってどうなん的な感じで充実してこないんじゃないかという気はする
ライブラリが充実してきてみんなが使い出すかどうかって技術的な問題だけじゃなくてその言語が出てきたタイミングとか社会情勢とか背景とかそういう要素もかなり濃密に効いてて、その意味でPythonはすげぇタイミングよかったという気はする Rustで仕事してないやつらばかりだの
儲かるから流行るんだぞ 既存のものを移植するのは無駄な行為
既存のものはそのまま使えば良くそのまま使われている
新たなものはRustになっている
それだけの話 >>627
rustもキラープロダクトが出れば一気に普及する >>622
節電というか、こちらはクラウド利用だけど間接的には当たりじゃね?
GC言語からRustへだけど、CPUコストとメモリコストが激減、だからクラウド側では節電となり、Rustはエコ。
GCなく自動メモリ解放する言語Rustの出現が今までの流れを変えた。 Rustへの動きは2系統あるよな
C/C++からRustへの安全性を高める動き
GC言語からRustへの高速化&省メモリ化の動き
まれに片方の動きの意識しかない人が想像力の欠如した書き込みをしている 目的は1つだけ・手段はいくらでもあるという世界観はしつこく宣伝されてきた
逆に1つの道具で色々できるという話はあまり聞かない Rust製のTurbopackでjsのバンドルが数百倍高速になってもじゃあ俺もRust使おうとはならんのよ
AWSのバックエンドでRust使ってエネルギー効率が向上してもじゃあ俺もRust使おうとはならんのよ
理性的に考えろ オジの自演は特徴出すぎで草
こちらはクラウド利用www Windows3.1からMacOSにも流れなかったし
Cのニッチェを奪わなければRustはこの先生
きのこれない アンチは願望ばっかだな
エンジニアの上澄が認めたのだから争っても無駄 >>638
儲かってる人キタ━━━━(゚∀゚)━━━━!!
Rustで何開発してるの? >>608
Rustの提唱するパラダイムがうまくいきだしたら、他言語もこぞって取り込むと思う
アカンとなったら、次のパラダイムが提唱…されるのは先の話だろうなあ 俺生きてるかなまじで js、ptyhon、やってきて
rustは新鮮で学べてるけど
c++はやばくね、、、
依存やらのコンパイルの時点で挫折しそうなんだが
ドキュメントもわけわからんし >>640
所有権って途中から取り込めるの?
パターンマッチングとかは余裕だろうけど 余裕だろ
ただ他言語もこぞってと言ってもGC言語は対象外なのでメジャーな言語で可能性があるのはC++のみ >>643
デフォルトでコピーコンストラクタやコピー代入演算子が起動するところを
moveコンストラクタやmove代入演算子が起動するように変更するってことでしょ?
余裕な訳ないじゃん
copy by valueな言語では後方互換性が犠牲になるので導入無理だよ >>644
いろんなやり方があるけど実装ができないようなものはない
やろうとすればどのやり方にするのがいいか
細かい仕様をどうするのがいいか
そういう意思決定に時間がかかるだけ
所有権システムをあとから取り込めないなんて発想をする人がRustを宣伝してるのがむしろ驚き >>645
文章読めないのかな?
今まででのコードでインスタンスがコピーされるところを
勝手にmoveにすり替えられたら大惨事だろw
今まで書いたコードを全部書き換えることになる
つまり後方互換性が犠牲になる
C++の開発当初からの方針で最大の特徴はCを内包していること
CもC++もcopy-by-valueな言語 既にCとC++に互換性はない
しかし許された
また同じことをやってまた許されることは可能かもな まあ拡張子変えれば許されるよcpoとか
あとはsafeブロックとか? >>649
ほぼ互換性あるだろ? どういったケースのこと書いてるの? >>644
>デフォルトでコピーコンストラクタやコピー代入演算子が起動するところを
>moveコンストラクタやmove代入演算子が起動するように変更するってことでしょ?
アフォ発見! >>641
オブジェクト指向できてないからだろそれ
C#学べ >>642
パターンマッチング導入はC++23でも無理
出てる案では便利になりそうにない
こればっかりは結果論になってしまうがRustと比較するとこれまでの基本設計が失敗してる >>644
現状のスマポとmoveを用いたC++の所有権システムはRustのシンプルな記述と比べると面倒で忘れたりミスしたりしてしまうがあれが限界っぽい
後方互換性を保ったままC++を快適にするのは不可能 >>655
そいつが書いている3つの言語ともにオブジェクト指向なのでC#は不要だろう
Pythonは普通
JavaScriptはプロトタイプ方式の継承だがそれ以外は普通
Rustは継承を排除していて機能(メソッド群)毎にトレイトで合成するがそれ以外は普通 >>658
Pythonやってるやつはオブジェクト指向理解できてないやつ多いよ
JavaScriptはまぁ基本使わんし
Rustはオブジェクト指向的なことできるようにしてるけどオブジェクト指向わからんやつ向けに制限かけてるって印象 複雑になりすぎないようにするのは、それはそれでメリットでもある
C++では、やたらとややこしいクラスが上がってくる
それ〇〇使いたいだけちゃうん、みたいな
Rustが普及したら、Rust流のスマポにみんな慣れるから、自分の母語でも使うようになるよ >>659
その3つの言語をやってることから例えばウェブ方面だとしても
PythonでDjangoなどのフレームワークを使うにはオブジェクト指向は基本知識として不可欠
JavaScriptもReactなどののフレームワークを使うにはオブジェクト指向は基本知識として不可欠
Rustに対してはデタラメな印象だけで基礎的な理解すらなし
このスレで連投してる人の中で最もレベル低すぎ C++のOOPって、CRTPとかがすっと書ける、読めるレベルだからねえ
そんな難しくないけど、美しく書くには多少の経験は必要
あと、吐かれるコードにはもうちょい気を留めてほしいなと、マシン語寄りの俺は思っちゃうな
「そういう」用途ばっかりじゃないのはわかるんだけど そういや気にしてなかったけど
webも、APIがOOP式で提供されてるから、OOP無関係とは言えないけど、
自分でどんどんクラスを編み出して問題解決するC++とは、OOPに向かう姿勢は異なってくるね
クラスは簡潔なほうが、結局効率もいいんだけどねw >>663
それはPythonでもJavaScriptでも同じ
Web APIと関係なくプログラム独自の部分も自分でどんどんクラスを編み出して問題解決する
他を知らないためC++だけを何か特別だと思い込んでそうだな >>659 をちょっとだけ擁護してみたくなっただけだよw
どこだって、ライブラリ作成者はOOPに精通してるもんだが、
C++は、OOPに精通してないと、使ってますとか公言できないもんね
むっちゃ煽られるよw その違いはあるなって思った OOPは精通するしないとか難しいものではないだろ
初心者かね C++でOOPができるといったら、当然のようにSTLが使え、boostが使える
あるいは、traitsやattribute,constexpr を織り交ぜて、ほぼゼロサンクなバイナリを叩き出せるレベル
俺は初心者だからそのレベルにはないな
ちょっとよそよりは要求レベルは高いだろって思ってる
母語のことはちょっとだけ誇りに思ってるけど、それより、一長一短的立場 上のほうでだれかいってたけど、まともなC++erは、スマポくらい使えて当然
なんだけど…ソース単位で生ポ禁止ってのが普及しないんだよね >>661
嫌だからわかってないんだってばこいつはさ
だからC++の依存関係で頭パンクすんだよ とりあえず
>>641
こいつがオブジェクト指向理解してないのは確かだろ >>661
君がオブジェクト指向理解できてなさそう >>669
C++も なんでもスタックに置きたいんだけど、きつきつなのが本来なんだよね
どんどんスタックを食うのは野暮っていう流儀もある
Rust流はメモリ使用の局所化を促進するから、
メモリキャッシュまで考慮すると、悔しいけどC++より効率出る余地がある
まあ実測してみないと、知らんけどw >どんどんクラスを編み出して問題解決する
奴はクラスを書けたらオブジェクト指向を理解してると思ってるみたいだからな >>674
確かになw
普通逆で一番抽象化できるところで遡ってツリー形式にやっていくもんだもんな >>673
「newを書かなきゃ」ってのは
make_uniqueとmake_sharedを使えって意味でした JavaScriptとPythonは
極力オブジェクト指向的な書き方をしないほうが
メンテナンス性も可読性も高まる言語だから
C++やC#とは事情が違うわな >>662
CRTPはC++のOOPで最も効率よい実装となり必須なテクニックであるが
美しいというのはウソでむしろC++の汚さの象徴の一つになっている
初心者や他言語の人たちもいるようだからわかりやすいコード
例として各派生のadd1()を用いて共通のadd2()やadd3()などを用意する場合
template<typename T>
struct AddN {
void add2() {
static_cast<T*>(this)->add1();
static_cast<T*>(this)->add1();
}
void add3 ...略
};
struct Foo : AddN<Foo> {
int x;
Foo(int i) : x(i) {}
void add1() {
this->x++;
}
};
以上となり慣れてしまうと感覚が麻痺してしまうが
CRTP (Curiously Recurring Template Pattern)の名の通り
「Foo : AddN<Foo>」といちいち自分をパタメータとして与えなければならない
「static_cast<T*>(this)」といちいちダウンキャストをしなければならない
このように「美しくない無駄なコード」になっている
つづく >>678のつづき
一方でRustではトレイトを用いて以下のコードとなる
C++での「美しくない無駄なコード」部分を消し去った状況とほぼ一致している
trait AddN {
fn add1(&mut self);
fn add2(&mut self) {
self.add1();
self.add1();
}
fn add3 ...略
}
struct Foo(i32);
impl AddN for Foo {
fn add1(&mut self) {
self.0 += 1;
}
}
逆にRustのこのコードと同じことを同じようにゼロコストで実現するには
C++ではCRTPを「美しくない無駄なコード」とはいえ使わざるをえない >>678-679
早まるな、俺は【CRTPが】美しいとは言ってない
初めて見たときは、なんじゃこりゃすげぇとは思ったけどねw >>679
CRTPを使わないで仮想関数にすると実行時のvtable経由のオーバーヘッドがあるんだよな
Rustは何も指定しなくてもCRTPと同じ状況になるから記述はシンプルで実行時オーバーヘッドもなく速いわけか そういえば初心者向けのサイト無いな
アイペンテックとか? C++のオブジェクト指向は動的ポリモーフィズムだから遅い
関数呼び出しのvtableオーバーヘッドがあるだけでなくインライン展開ができず最適化の機会も失われている
Rustは基本が静的ポリモーフィズムだからそれらのコストがなく速い CRTP使うと全部インライン展開されるのマジで不思議だよな >>684
適当なことを言うと規格票で殴り殺される
それがC++村の掟
悪いことは言わない
君はここから早く撤退したほうがいい >>684
CRTPを使えば常にインライン展開されるわけではない
CRTPを使った時のみ(vtable経由にならず静的に動作が確定するため)インライン展開が可能となり最適化の可能性も広がり速くなるという話
C++ではCRTPを使わないとRustと同等の速さになれない vtableが重く感じるとかどんな環境やねん。どうせエアプやろ。 vtableが重いというよりインライン展開+αの最適化が効かなくなるのが問題なんでしょ
使ってる関数が常に固定値(nullとか)を返すって事前に分かればそれによって分岐の整理ができたりするけど
間にvtableが挟まるとそういう予測が難しくなる >>687
CRTPを使わないと真に実現できないのはメソッド記法だけ
そしてvtableとインライン展開に君が想像するような関係性は無い
というか、同じ推論をRustで適用すれば「object-safeなtraitへのimplはvtableを量産しインライン展開を阻害するので悪、やめろ」ということにならないかい?
自分が何を書こうとしているのかよく考えてから書き込むことだ C++もRustも、OOPなアセンブラの用途があるからね
少々vtableを経ても平気だとしても、そういうバイナリ吐いてほしくないときはある
バイナリは覗かれるもの こういうしょーもない連中に限ってvtableによって速度が何%落ちるかなんて測ったこともないんだよ。
馬鹿馬鹿しい。 >>688
vtableの参照による速度低下よりも最適化できないことによる関数呼び出しのコストが重い
例えば>>679のRust及びCRTPで書かれたC++コードはどちらもadd2()関数呼び出しの中身は最適化されて単なる「add 2」となる
しかしCRTPを用いずにC++で書くとadd2()関数呼び出しの中身は「vtable参照」+「add1()関数呼び出し」+「add 1」を2回することになる >>693
パフォーマンスを測るまでもなく、吐かれるバイナリの汚さ
書いた一言一句が何になるか、気になって仕方ないのがC++erだよ(諸派あり、用途にもよる
バイナリエディタに放り込んだらわかるまである この英語版wikipediaのC++サンプルコードとコンパイル結果が詳しい
https://en.wikipedia.org/wiki/Virtual_method_table#Example
CRTPを使わないとvirtual method tableが出てきて不利になる CRTPが嫌ならテンプレート分ければいいだけでは? >>678
これってダウンキャスト入ってるから危険なこともできそう
相当するコードはRustではコンパイル通らない?
#include <iostream>
#define DOUT(arg) std::cout << #arg": " << arg << std::endl
template<typename T> struct AddN {
void add2() {
static_cast<T*>(this)->add1();
static_cast<T*>(this)->add1();
}
};
struct Foo : AddN<Foo> {
int x;
Foo(int i) : x(i) {}
void add1() {
this->x++;
}
};
struct Bar : AddN<Foo> {
double y;
Bar(double i) : y(i) {}
void add1() {
this->y+=0.1;
}
};
int main () {
Foo foo (1); Bar bar (0.1);
DOUT (foo.x); DOUT (bar.y);
foo.add1 (); bar.add1 ();
DOUT (foo.x); DOUT (bar.y);
return 0;
} 実行したら以下のようになった
$ ./a.out
foo.x: 1
bar.y: 0.1
foo.x: 2
bar.y: 0.2
最後のbar.yは1.1になると思ってたんだがはて? そもそもBarはFooを継承してないんだから
ダウンキャストのところでコンパイルエラー出て良いようなもんだけど
何で通すんだろ? templateだとチェックを緩和してるのかな?
あるいはコンパイラのバグかな?
$ g++ --version
g++ (Debian 10.2.1-6) 10.2.1 20210110 -ダウンキャストのところでコンパイルエラー出て良いようなもんだけど
+static_cast<T*>(this)->add1();のところでコンパイルエラー出て良いようなもんだけど 最近のC++はよく分からんけどその例だとadd2使わないと多分変なことにならない
doubleをint扱いして1足しても1/(2^53)(←不正確、指数部による)くらいしか変動しないのかな
FooもBarもAddN継承してるからstatic_castでコンパイルエラーは出ないはず
Rustはクラス継承がないからstatic_castとの正確な比較はできない
traitで似たようなコード書くときはSelfキーワードで自分の型を指すからダウンキャスト必要ないし
敢えてstatic_castと対応させるならtransmuteだろうけどunsafe付きの関数だから危険でもコンパイルは通せる
(unsafeを使う範囲の安全性保証はプログラマの責任) >>703
>最近のC++はよく分からんけどその例だとadd2使わないと多分変なことにならない
あーごめんごめん!興味があったのはadd2を呼んだときの挙動だった
- foo.add1 (); bar.add1 ();
+ foo.add2 (); bar.add2 ();
$ ./test
foo.x: 1
bar.y: 0.1
foo.x: 3
bar.y: 0.1 <- 鼻から悪魔
>FooもBarもAddN継承してるからstatic_castでコンパイルエラーは出ないはず
なるほどキャストしているthisはAddN<Foo>*だから
Foo*にもBar*にもダウンキャストできるってことね
ありがとう 正当?なC++的にはdynamic_castすべきなんじゃなかろうかって思うんだよね
でそれはvtable介してadd1にアクセスするのと変わらない
プログラマの責任でstatic_castして効率化する
ってテクニックは俺は割と好きだけども >>703
transmuteはダウンキャストではなく任意の型同士の強引な型変換(読み替え)だから当然unsafe
一方でダウンキャストは親から子、基底から派生、抽象から具体への変換を指す
Rustの場合は抽象的なトレイトから具体的な型への変換がダウンキャストとなる
Rustは基本的には静的ポリモーフィズムで
コンパイル時点で各具体的な型のコードへ安全に置き換わるモノモーフィズムなので
C++のstatic_castのような危険のあるダウンキャストを必要としないが正解
Rustでもdyn Traitを用いた場合のみ動的ポリモーフィズムとなり
C++のdynamic_castと同様に実行時ダウンキャストがdowncast()/downcast_ref()/downcast_mut()で可能だが
C++とは異なりRustはNull安全でダウンキャストできる そこは、わずかにコストを支払って、reinterpret_castでもいいとは思うけどね ああちがう、reinterpret_castを避ける、だ 動的検査のコストよりもキャストに失敗した時の分岐処理のせいで最適化が阻害されるのを問題視してる感じ
かといって分岐しないなら動的検査の意味ないし >>706
ダウンキャストの根本的な問題点を理解してないね
静的か動的かUBかどうかは副次的な問題点に過ぎない Rustのポインタ(参照)のNull安全ってすごく上手い仕組みだな
C++のdynamic_castもRustのdowncast_refも生成コードはどちらもダウンキャスト成功時はそのままポインタを返して失敗時は0を返す点で効率も同じだけど
Rustでは返す型としてはそれをポインタで直接に表さずにOption<&T>を返すと表現させて
成功時はOption::Some(&T)を返して失敗時の0はOption::Noneとして返すため
プログラムコード上はNoneかSomeか生成コードでは0か否かをチェックせずには使えないわけだ
C++でのNullポインタか否かのチェック忘れを静的な型チェックで防止できるってことは
もしかしてC++でもdynamic_castやその他のNullポインタを返すライブラリ全てをstd::optionalを返すように変更すればNull安全になるんじゃないか? >>710はいつものデタラメ言いがかり君に似てる
闇雲に否定して別の問題点があると主張しつつ
その問題点を述べることは一切ないので書き込みの中身がない >>711
デフォルトmoveの導入は無理だと思ってるくせにNull安全は導入できると思ってるのかw
オツム弱っww たぶん人違いじゃないかな?
dynamic_castの返り値を確認しないやつは
流石におらんと思うよ
静的に確認してくれても全く嬉しくない ヌルポインタが返る全ての関数についてそうしないとヌル安全にならない
ヌルを使ってはダメ それは当然だよ
C++では指し示した先にインスタンスがあるかどうか
分からんときにのみポインタを使う
確実にあるときは参照を使うのが流儀
ポインタが使われるところではnullptrのチェックを行う
この流儀の部分を守らないスカタンが問題なんだな
Cに参照がないので上記流儀が守られないことも問題 >>704
なぜそのC++のプログラムは正しく動かいていないの?
bar.yはadd2()で0.2足されて0.1から0.3にならないといけないのに0.1のままになってる
>>699のソースコードを見ても正しく動かない原因がよくわからない >>718
BarはAddN<Bar>ではなくAddN<Foo>を継承しているから >>719
add2()としてBarの+0.2が使われずFooの+2か使われるということ?
bar.yが2.1になっていないのはなぜ? templateを展開すると
void Add <Foo>::add2() {
static_cast<Foo*>(this)->add1();
static_cast<Foo*>(this)->add1();
}
thisはBarの基底AddN<Foo>*のポインタ
これをBarと無関係のFoo*にキャストしたら動作は不定 なるほど
浮動小数点に対してそれを整数と見て+2してしまっているのかな
本来はコンパイル段階でエラーにしないとやばそうだ
今回はっきり動いていないとわかるケースだからいいけど何となく動いてしまってるケースがあると恐ろしい 正当?なC++的にはdynamic_castすべきだと思うんだよね
template<typename T> struct AddN {
void add2() {
dynamic_cast<T&>(*this).add1();
dynamic_cast<T&>(*this).add1();
}
virtual ~AddN () {};
}; C++最適化効きすぎてadd2そのものが展開されて最短コードにしかならん doubleのビット列をintとして扱ってインクリメントしてるから結果がおかしいんだろ
なぜコンパイラは型不一致エラーを出せないんだ? 問題があれば何でもコンパイル時点でエラーを出してくれるRustを使おう
実行デバッグが激減して開発効率も高い ライブラリが一個もない状態から基本的なライブラリを作るためにunsafeが必要という話だったら
有限個のバイナリファイルが正しく出力されればいいだけなので
ソースコードをチェックしなくても出力をチェックすればいいのでは? そういえばJavaが全然話題にもならないが言語のヒエラルキーって
C++ 最強カミソリ
剃り残しナシ
Rust 安全カミソリ
キレテナーィ なまくら
C# イケてるが
GCがあるからダメぽ
Java 論外
ヌルポとGCがあるからダメぽ
こんな感じ? 一つ間違うと自分の手とか余計なところまで切れちゃうw 俺にとってのC++は、日本語だよ 物心ついたときには、C++だったんだ
氏ぬまで忘れないと思う だからある意味最強、そんな奴が結構多いんだと思う
「ちゃんと話せ」って躾けられたのも、良し悪し >>733
逆だろ
RustはC++ができることは何でもできる
C++はできないことが多すぎ >>737
C++はできないことが多すぎる
このスレに出てきた話だけでも
代数的データ型
パターンマッチング
各種null安全
データ競合安全
メモリ安全
など多数 プリミティブはいろいろ備わってるから、やってできなくはないんだろうけど、
強制する方法がないから、ちっとも普及しないんだよね >>740
C++はそのプリミティブを多数欠いている
まさか代数的データ型をunionで頑張ればできると主張するのか?
パターンマッチングは構文だからC++には無理
データ競合を静的に検知する方法もない C/C++には昔から、「なければgenerateすればいいじゃん」っていう文化がある
パターンマッチングは、いまどきIDEが記述支援するんだから、やってできなくはない
データ競合やらは、「そういう」スマポを導入すればいい
でもね、みんな使わないんだわ 使われないものは、ないものとして詰られても仕方ない
あ、Cとおんなじように、入れ子になった構造体をささっと書きたいとかは思うね
もうできるようになったっけ? …いやまてよ、パターンマッチングって、エラー等検出のことだと思ってたけど、
パターンマッチング Rust でぐぐったら全然違うものが出てきたぜ その節は撤回 ちょっと読んでみる std::visitはパターンマッチに含まれますか パターンマッチングはC++23に入れようとしたがRustと比べて機能も弱すぎて失敗している
Rustのパターンマッチングはこんな感じで記述性や可読性を向上させている
fn slice_pattern(slice: &[(i32, i32)]) {
match slice {
[] => println!("空です"),
[(a, b)] => println!("要素は1つで({a},{b})です"),
[_, (123, b), ..] => println!("2つ目の前者が123なものは(123,{b})です"),
[.., next_last, _] => println!("その他の最後から2つ目の要素は{next_last:?}です"),
}
}
fn enum_pattern(shape: Shape) {
match shape {
Shape::Circle(r) => println!("半径{r}の円です"),
Shape::Rectangle(w, h) if w == h => println!("長さ{w}の正方形です"),
Shape::Rectangle(w, h) => println!("幅{w}高さ{h}の長方形です"),
x => println!("その他の図形{x:?}です"),
}
}
fn struct_pattern() {
let a = Foo { bar: 123, baz: 456, qux: 789 };
let b = Foo { baz: 555, ..a };
for Foo { bar, baz, qux } in &[a, b] {
println!("Foo: bar={bar}, baz={baz}, qux={qux}");
}
}
fn range_pattern(c: char) {
match c {
'0'..='9' => println!("数字({c})です"),
'a'..='z' | 'A'..='Z' => println!("アルファベット({c})です"),
_ => println!("その他の文字({c})です"),
}
} C++はユーザが多いので標準でなくてもライブラリがあるからね
Rustはユーザが少ないので標準で用意しとく必要がある
パタンマッチングは言語の話だけども Rust の TcpListener のサンプルについて質問です
1ページ目は無料で1ページ目だけで動作するはずですが
https://xtech.nikkei.com/atcl/nxt/column/18/01920/081600022/
何故か1byteしか受け取らず常に 404 NotFound になります
何処を治せばよいですか? >>747
C++のstd::variantは全体の型名を命名できない
各要素に対して専用の型を用意しなければならない
扱いづらいなど欠陥品
例えば>>748のShapeの定義例は
enum Shape {
Circle(u32),
Rectangle(u32, u32),
Parallelogram(u32, u32),
}
これだけで済む
さらに型Shapeに対して様々なメソッドを実装できる
C++ではそれぞれ困難と不可能
>>749
言語がサポートしないとライブラリでは無理 一発目から GET / HTTP/1.1 じゃないものが来てるかもよ、buffer 表示させてみては >>753
読んだけどそれでは無理
こちらはパターンマッチングのRustのコード例を>>748に出した
C++でも可能だと主張するならばそれぞれの実現コードをまず出すべき パターンマッチングの件、5分くらい読んできた
そういう風に書きたいっていうニーズがあるんだな、表現力を誇るC++でこれが書けないのは確かに手落ちw
この型はあれでもこれでもあるっていうの、あんまり扱ってこなかったけど、
上手く書けば便利になるかもね ただし、ゼロサンクでね >>750
そのRustのTcpListenerのサンプル動かしてみたけど普通に動いた
返すindex.htmlを用意してcargo run
ブラウザからhttp://localhost:9999/で表示された >>754
「無理」とだけ言われても何も分からないので具体的にお願いします
それとも記事を読んだうえでも、無理な点の指摘は>>751ですべてだということですか
例を読んでいれば「各要素に対して専用の型を用意しなければならない」は嘘だとすぐ分かるはずですが >>755
Rustは>>748の各パターンマッチング例をオーバーヘッド無しで処理してくれる
使わずに手動でダラダラと書ける分もパターンマッチング記述の方が最適化が良いかもしれん >>757
具体的に>>748にRustのパターンマッチングの各例のコードを書きました
次はC++でも可能だと主張するあなたが対応するC++のコードを出す番です >>759
あなたの要求に答えるために質問だけさせてください
明確にしてほしいのは「何が無理なのか」の「何」の部分です
よろしくおねがいします 教科書的サンプルとは別に、実践的なサンプルが見たいぞ
必要だから入った仕様だろう、手ごろにどっかあるはずだ お勧めのやつをたのむ >>751
>>749>パタンマッチングは言語の話だけども
>例えば>>748のShapeの定義例は
>enum Shape {
> Circle(u32),
> Rectangle(u32, u32),
> Parallelogram(u32, u32),
>}
>これだけで済む
>さらに型Shapeに対して様々なメソッドを実装できる
>C++ではそれぞれ困難と不可能
横レスだけども
namespace Shape {
struct Circle {uint32_t r;};
struct Rectangle {uint32_t w; uint32_t h;};
struct Parallelogram {uint32_t ui0; uint32_t ui1;};
template <typename T> void function (ostream &os, const T &p);
void function (ostream &os, const Circle &p);
void function (ostream &os, const Rectangle &p);
// void function (ostream &os, const Parallelogram &p);
} >>762
それだとShapeが型ではなく名前空間になってしまってるからダメでしょ >>763
namespaceをstructに置換して最後に;つければ? >>764
それだと全ての図形で必要となるメモリサイズの合計サイズが必要になっちゃうよ >>765
メンバ型定義しただけではメンバ変数は増えないから、サイズも増えないよ >>763
>それだとShapeが型ではなく名前空間になってしまってるからダメでしょ
何で? >>760
Rustはパターンマッチングがあるため>>748のようにシンプルに記述ができて可読性にも優れている
あなたはC++でも代わりの手段で表現することが可能だと主張した
それが無理ではないことをRustコードの各々に対応する具体的なC++のコードとして示してほしい パターンマッチングは便利だけども必須じゃないよね
所有権システムと違って後方互換性が犠牲になることはないので
そのうちC++に入るよ >>769
パターンマッチング>>748の2番目の例の話だからShapeは関数に渡ってくる型じゃないとまずい
単体で動くコードで比較すればはっきりすると思うのでC++版を書いて。以下はRust版
// ここは再掲
fn enum_pattern(shape: Shape) {
match shape {
Shape::Circle(r) => println!("半径{r}の円です"),
Shape::Rectangle(w, h) if w == h => println!("長さ{w}の正方形です"),
Shape::Rectangle(w, h) => println!("幅{w}高さ{h}の長方形です"),
x => println!("その他の図形{x:?}です"),
}
}
#[derive(Debug)]
enum Shape {
Circle(u32),
Rectangle(u32, u32),
Parallelogram(u32, u32),
}
fn main() {
enum_pattern(Shape::Circle(100));
enum_pattern(Shape::Rectangle(200, 300));
enum_pattern(Shape::Rectangle(567, 567));
enum_pattern(Shape::Parallelogram(789, 456));
}
// 実行結果
半径100の円です
幅200高さ300の長方形です
長さ567の正方形です
その他の図形Parallelogram(789, 456)です >>772
>パターンマッチング>>748の2番目の例の話だからShapeは関数に渡ってくる型じゃないとまずい
何で? ちなみにディスパッチは>>762は静的に行われる
>>772は... >>773
Shape型が渡ってきてその処理をしてるからだよね
とりあえずC++の動くコードを出してみたら? >>775
Shape型を引数で取る必要があるならC++では
Shapeを基底として継承させるよ
もちろん静的ディスパッチはできない 図形は典型的なオブジェクト指向の例題だから
enumを使う例としては適切ではないんじゃないかな?
Rustをよく知らん俺からしたらピンとこないよ >>774
ディスパッチは静的には不可能で動的にしか行われないでしょ
静的に可能なのはモノモーフィゼイションだけど今回の例では適用できませんね
いずれにしてもC++で可能だと言うコードを示してみたら? >>778
>ディスパッチは静的には不可能で動的にしか行われないでしょ
いいえ>>762は静的に行われる
>いずれにしてもC++で可能だと言うコードを示してみたら?
>>762に示した >>780
動くコードじゃないと意味がないのでmain()付きの動くコードを示そうよ
Rust版は>>772
>>781
パターンマッチングを全く行なっていないじゃん
例えば分かりやすくこの項目を増やすとして
Shape::Rectangle(100, h) => println!("幅100で高さ{h}の長方形です"),
これはC++でif (w == 100)のコードになるわけだよね
それはパターンマッチングとは言わないよ >>782
enumのバリアント判定に相当するパターンマッチを行っていますので、全く行っていないという指摘は正しくありません
また、>>748のenum_patternにShape::Rectangle(100, h)にマッチするコードは含まれておらず、あなたの当初の要求に含まれていないものです
新しい要求を後から追加して批判するのは、誠実な態度とは言えません
このようなことが無いように、「何が無理か」を明確にするよう確認したつもりでした
今後はこうしたことが無いように、事前よく確認することをお願い申し上げます
また値によるマッチについてですが、同様の考えで似たライブラリを実装された方を見つけました
こちらは値によるマッチに拡張したライブラリを実装されているようです
https://qiita.com/Naotonosato/items/a1e710de2b78346146d1 >>781
かなり苦しいね
>>748の残り3つのパターンマッチングには応用できそうもないけど書ける? >>782
別に関数プロトタイプまで書いてるんだから分かりそうなものだけど...
以下は静的ディスパッチでコンパイル時に定まるよ
>>772が静的ディスパッチできないとしても
たぶん同じように書けばRustでも静的にディスパッチできると思うよ
#include <iostream>
using namespace std;
namespace Shape {
struct Circle {uint32_t r;};
struct Rectangle {uint32_t w; uint32_t h;};
struct Parallelogram {uint32_t ui0; uint32_t ui1;};
template <typename T> void function (ostream &os, const T &p) {}
void function (ostream &os, const Circle &p) {}
void function (ostream &os, const Rectangle &p) {}
}
int main () {
using namespace Shape;
Circle circle;
function (cout, circle);
Parallelogram parallelogram;
function (cout, parallelogram);
return 0;
} 静的ではなくて動的ディスパッチだろ
このように次々と何が来るかわからないリストが渡ってきた場合
Shape::Shape shape_list[4];
shape_list[0] = Shape::Rectangle{w: 33, h: 33};
shape_list[1] = Shape::Parallelogram{ui0: 4, ui1: 33};
shape_list[2] = Shape::Rectangle{w: 33, h: 4};
shape_list[3] = Shape::Circle{10};
その時にこれで処理できるのだから動的ディスパッチをしている
for (int i = 0; i < 4; i++) {
enum_pattern(shape_list[i]);
} >>786
静的ディスパッチと書いているのは俺が書いた>>762と>>785のC++の例
コンパイル時にどの関数が呼ばれるか型によって決まる もうちょっと調べてたが、C++にもinspectってのが来そうみたいじゃん
パタンマッチングって、こんなもんが流行ってるのね、また一つ取り残されてたぜ >>786
いいえ、これは静的ディスパッチです
簡単に確認する方法として、生成されたアセンブリ中のvtableを確認する方法があります:
https://godbolt.org/z/1W7jGnWEd
"vtable for std::bad_variant_access:"が唯一のvtableであり、Circleなどのためのvtableはありません
このことから、動的ディスパッチは発生しないことが分かります >>789
おいおい
vtable使うことだけが動的ディスパッチだと思いこんでいるのか?
実行時にデータ内容に応じて分岐することを動的ディスパッチと言う
>>786はもちろん動的ディスパッチをしている
次に何が来るかはコンパイル時点で決まらないため静的に決定は不可能だ >>788
昔はなかなか規格としてまとまらなかったが最近のC++はどうした?
俺もboostに入ってたやつくらいしか追えていない >>790
それはRsutのコードか? C++のコードか? >>793
>>785は静的ディスパッチだよ
コンパイル時にどの関数が呼ばれるか定まる >>790
いいえ
動的ディスパッチとは、多態メソッドの呼び出し式を実行するときに、具体型に応じて実際に呼ばれる関数が振り分けられることを言います
https://en.wikipedia.org/wiki/Dynamic_dispatch
動的ディスパッチはしばしばパフォーマンスの低下をもたらすと言われますが、その最大の理由は、
選択される各関数ポインタを一度メモリから(vtableから)読み出し、それをcallする必要があることです
動的ディスパッチをどう定義するかはさておき、vtableが無い>>789ではこのパフォーマンス低下の懸念が無いことが分かります
また、「実行時にデータ内容に応じて分岐することを動的ディスパッチと言う」という定義には明らかな問題があります
それは、この定義ではmatchやifなど通常の制御構造も動的ディスパッチに当てはまってしまうということです
これは、この定義が一般的な定義から大きく逸脱していることをよく象徴的に表わしています
少なくとも「データ内容」は「型」に置き換える必要があることが分かるでしょう >>789
それは動的ディスパッチだよ
C++のstd::visitはstd::variantのindex()の値で実行時に分岐してる
だから>>786のような実行時になるまで何が来るか不明な場合にも対応できる >>791
inspectは、godboltでclangのexperimentalを遊べるようになってた
型に対しては、もうちょっとまだみたい、error: expected expression って言われた
ラムダみたいに、みんなが欲しがるものはそれでもわりと早いんだよね
一応入れとくか…みたいのは、いつまでたっても入らないw
ところで、godboltに、-Wlifetime ってのがみえたけど…これってもしかして C++の仕様を変えようという時に国語辞典の変更を許さないのはタイパ最悪だな
C++の仕様変更を許さない、とすれば秒速で終わる >>796
いいえ、これは動的ディスパッチではありません
「実行時になるまで何が来るか不明な場合にも対応できる」ことは、それが動的ディスパッチであることの証明にはなりません
繰り返しになりますが、>>790の「実行時にデータ内容に応じて分岐することを動的ディスパッチと言う」という定義は、一般的な定義とはまったく異なります
>>790の定義を採用する限りにおいてはその推論は正しいですが、そのためにはまずこの定義の出典および正確性を確認する必要があります このスレレベル高いね。
文系の俺にはちんぷんかんぷん。
雑魚はPHPでもしてるわ。 Rustはそのへんの話も明瞭で
「dyn」という予約語キーワードが出てきたものだけがvtableを使う動的ディスパッチとなるよ
>>772のRustコードは「dyn」が全く出てこないので、vtableを使う動的ディスパッチは一切無し、とわかる仕組み >>800
レベル高すぎてディスパッチが動的かどうかすらわからないからなwww 静的にディスパッチできたらいいのか、動的にディスパッチしたいのか。なんていうかgdgd ww >>800
ここは「朝から暇なおじさんの学習日記」だからある意味レベル高い。 >>801を読んで思い出しましたが、
C++では動的ディスパッチが発生する条件のひとつとして、「virtual指定子付きメンバ関数の呼び出しである」という条件があります
>>781のコードにはvirtualがまったく存在しないため、動的ディスパッチが発生しないことが分かります
>>789のようにアセンブリでvtableの生成を確認するよりも、こちらのほうがより簡単な確認方法でした
誤った情報をお伝えしてしまい、大変申し訳ございませんでした ちゃんと検索したらなんかもうなんでもできそうなパターンマッチライブラリあった
そうだよな、ないわけないよな
https://github.com/BowenFu/matchit.cpp >>801
アホか?
静的ディスパッチとはコンパイル時に呼び出す関数が決定されることだよ
match使ったら動的ディスパッチ >>807
Rustのenumのmatchはenumのインデックスで分岐してるだけ
C++のvariantのvisitがvariantのインデックスで分岐してるだけなのと同じ
どちらも動的ディスパッチはしていない 条件分岐は動的ディスパッチという
実行時ディスパッチと言った方が意味分かるかな? 動的ディスパッチというのは
インデックスによる条件分岐
仮想関数によるディスパッチを含む広い概念です Rustも関数のオーバーロードくらいあるだろ?
コンパイル段階でどの関数が呼ばれるかディスパッチされる
これが静的ディスパッチ(の1つ) >>809
嘘つき
条件分岐つまりif文があれば動的ディスパッチだと主張するのか?
全てのプログラムが動的ディスパッチをしていることになるぞ >>812
>条件分岐つまりif文があれば動的ディスパッチだと主張するのか?
その通り if文でどの関数を呼ぶか決めてるのであれば
それは動的ディスパッチと言う これらはvtableを使うわけでもないし動的ディスパッチじゃないでしょ
> Rustのenumのmatchはenumのインデックスで分岐してるだけ
> C++のvariantのvisitがvariantのインデックスで分岐してるだけなのと同じ
> どちらも動的ディスパッチはしていない >>814
>>772
>fn enum_pattern(shape: Shape) {
> match shape {
> Shape::Circle(r) => println!("半径{r}の円です"),
> Shape::Rectangle(w, h) if w == h => println!("長さ{w}の正方形です"),
> Shape::Rectangle(w, h) => println!("幅{w}高さ{h}の長方形です"),
> x => println!("その他の図形{x:?}です"),
> }
>}
ShapeがCircleなのかw == hであるRectangle(w, h)なのかそれ以外のRectangleなのか
それともそれらに該当しないのかは実行時に決めているので
動的ディスパッチだよ 一方で
>>785
>namespace Shape {
> struct Circle {uint32_t r;};
> struct Rectangle {uint32_t w; uint32_t h;};
> struct Parallelogram {uint32_t ui0; uint32_t ui1;};
> template <typename T> void function (ostream &os, const T &p) {}
> void function (ostream &os, const Circle &p) {}
> void function (ostream &os, const Rectangle &p) {}
>}
上記のどのfunctionが呼ばれるかは型に基づいてコンパイル時に選択される
これが静的ディスパッチ じゃあ>>789のC++コードは動的ディスパッチなの?
vtableは無いしstd::visitでvariantのindex()値を見て実行時に分岐してるだけだから静的ディスパッチだと書かれているけど ID:wHEiYRW7は一つのIDを一貫して使ってるのに対し
それにあほなレスつけて食って掛かってるほうはIDコロコロなんで
草も生えない毎度毎度のいつもの百年前から一生やってるrustスレ名物展開 >>817
Shapeが何かによって決めてるのは実行時なので
動的ディスパッチだよ ID:wHEiYRW7 >>809がバカすぎる
ID:7YA3tv0i氏の>>795の説明を読もうぜ >>819
variantまで動的ディスパッチ扱いにするのはおかしいよ
virtual関数をvtable経由で呼ぶのが動的ディスパッチじゃないかな >>795
>また、「実行時にデータ内容に応じて分岐することを動的ディスパッチと言う」という定義には明らかな問題があります
>それは、この定義ではmatchやifなど通常の制御構造も動的ディスパッチに当てはまってしまうということです
何だそりゃ?w この説明の方が明らかにおかしい 他人に教えてもらったばっかりの内容で偉そうにしてんじゃねえ >>821
variantは良く知らんがShapeが実際には
CircleかRectangleかParallelogramかを
実行時に判断しているので動的ディスパッチだよ
>>816との差は分かるでしょ? 分からんか? C++のvariantやRustのenumの値で条件分岐することを動的ディスパッチというのは無理があるんじゃないかな
それはif文を使ったら動的ディスパッチと言ってるようなもの まだやってら
どっちが来てもおっけーなようにtemplate<>が書けるのがC++のOOPだろ
無駄な議論 Rustもそんな感じだろ?w どっちも動的ディスパッチじゃなくね
コンパイル後のenum_patternにCircleでもRectangleでもRectangleでもなく
HogeAngleぶち込んでもディスパッチしてくれるのが動的じゃないの? >>825
>それはif文を使ったら動的ディスパッチと言ってるようなもの
>>772はShapeが何かはコンパイル時には決まりません
>>789もShapeが何かはコンパイル時には決まりません
matchやifを使うということは実行時に決めていることを意味しているので動的ディスパッチです
templateを駆使してコンパイル時に決定できる条件分岐を書けば
静的ディスパッチできるかもしれません 静的じゃないものは動的でいいと思うけど
ディスパッチディスパッチ言ってんのは関数だけを前提にしたほうがいいんじゃない?
match についてはもとの?ディスパッチ話から分離させたほうがいいかも?
それとも元々matchの話なんだっけ? 最初の方読んでないけど
今まで関数かメソッド以外の文脈でディスパッチとか聞いたことなかったわ個人的に C++erは、書いたコードがディスパッチになるかは常に気にしてるからね(諸派あり
そこを雑に書くと、ぶん殴られたりするからw
だから、Rustの、書けばsafeになるってのは、欲しいんだなあ
生成コードに集中できる 百科事典で調べてみた
>> https://www.weblio.jp/content/%E5%8B%95%E7%9A%84%E3%83%87%E3%82%A3%E3%82%B9%E3%83%91%E3%83%83%E3%83%81%E3%81%AE%E4%BE%8B
>> C++では以下のように仮想関数を派生クラスにてオーバーライドすることで、
>> 実際に呼び出される関数の実体をオブジェクトの型に応じて実行時に選択することができる。
>> これを動的ディスパッチと呼ぶ。
この定義だとC++のvariant/visitでの分岐やRustのenum/matchでの分岐は動的ディスパッチではないな
一方でC++のvirtual関数やRustのdynトレイトは動的ディスパッチとなる >>832
>> https://www.weblio.jp/content/%E5%8B%95%E7%9A%84%E3%83%87%E3%82%A3%E3%82%B9%E3%83%91%E3%83%83%E3%83%81%E3%81%AE%E4%BE%8B
>> C++では以下のように仮想関数を派生クラスにてオーバーライドすることで、
>> 実際に呼び出される関数の実体をオブジェクトの型に応じて実行時に選択することができる。
>> これを動的ディスパッチと呼ぶ。
これは動的ディスパッチの1つで
実行時に条件分岐して呼ぶ関数を決めるのも動的ディスパッチと呼ぶ
仮想関数によるディスパッチより動的ディスパッチの方が広い概念だよ 横からすみません
Rustで日常茶飯事のこのパターンは動的ディスパッチですか?
let output = match input {
Some(input) => foo(input),
None => Default::default(),
}; >>827
何があれば「実践的」と言えるかの条件と、そもそも何のサンプルが欲しいのか、を明確にしないと誰も何も出せないよ >>772はジャンプテーブルがないから動的ディスパッチじゃない >>834
それも動的ディスパッチじゃない
>>833が主張する『実行時に条件分岐して呼ぶ関数を決めるのも動的ディスパッチと呼ぶ』は無理があるんだよ >>838
俺はRust分からんのだけど
これinputがSome(input)に適合するかしないかを
実行時に判断しているんやろ? だとしたら動的ディスパッチだよ
C++のtemplateみたいに上記をコンパイル時に判断して
例えばSome(input)に適合するからDefault::default()を
コールするコードが生成されないようなら静的ディスパッチ >>836
いま話題にしてる もとになった、パタンマッチングを上手く使ってる実例
なるほどこれはパタンマッチングがあってこそ、キマってるねっていうか というか>>789の「静的ディスパッチ」もよく考えたら誤用だったわ
https://en.wikipedia.org/wiki/Static_dispatch
Rustならtrait bound付きgenerics内のtrait method呼び出しのことで良さそうだけど
C++なら……ちょっとこのwikipediaの定義もなぜかオーバーロードに限定しててビミョ〜
これはRust以外の文脈では合意された定義無い気がする 静的か動的かはお互い認識にズレ無いと思うんよね
でも「ディスパッチ」って言うとき
言語機能として用意されてる関数オーバーロードやvirtual使ったポリモとか
動的静的に関わらずまぁそこまではディスパッチなんだけど
matchの結果やifの結果となってくるとそれって
言語の機能というより、言語の機能の機能ってことになってて
一気にぼんや〜りとしてくるんで一人一人にズレが生じるよね 1.どの振る舞いをするかがコンパイル時に選択される構造
2.どの振る舞いをするかが動的に選択される構造
3.振る舞いが追加されても動的に選択できる構造
パターンマッチは振る舞いの選択の話だから2
ポリモーフィズムを語る上での動的ディスパッチは3
2を動的ディスパッチと呼ぶかどうか >>839
実行時にならないとSomeかNoneかわからないからプログラムを組むんですよ
コンパイル時点で決まっていたらプログラムを組む意味がありません
そしてプログラムを組めば必ずどこかに条件分岐があります
それを動的ディスパッチとは言わないと思うんです >>840
C++?Rust?どっち?
てかやっぱり基準が曖昧だけど、何かしら有名OSSのソースでも出せばいいの? >>841
>This contrasts with dynamic dispatch, which is based on runtime information
> (such as vtable pointers and other forms of run time type information).
そこにdynamic dispatchを説明する一文があって2行目()内の
and以下に書かれているのがまさにifやmatchで評価していること >>845
明らかにそいつは周回遅れのド素人なので
アナタ以外のみんなは単に無視してるようですよw
時間の無駄はおすすめしません >>846
type informationとありますね
SomeもNoneも型ではありませんから
>>834は動的ディスパッチではないということになります
Rustのenumによるmatchでの分岐は動的ディスパッチではないということでよろしいでしょうか? >>845
RustのOSSで
>>847
よく言われるよ >>844
条件により振る舞いを変えること一般をディスパッチと呼ぶ
例えば>>785でmain内でfunction (cout, circle);とfunction (cout, parallelogram);では
呼ばれる関数が変わり振る舞いが変わるんだけど
これはコンパイル時に選択されます
これを静的ディスパッチと呼びます
一方で834のmatchによる分岐は静的には決まらないので
静的ディスパッチに対して動的ディスパッチと呼びます >>846
それはjsとかRubyとかPythonではvtableじゃなくてハッシュテーブルを使ってメソッド呼び出ししてるって意味ですよ >>848
それは字面に囚われていて本旨を捉えていないと思うよ
例えば憲法第二十四条第一項は「婚姻は、両性の合意のみに基いて成立し」を
根拠にして同性婚は憲法違反と主張するようなもの >>850
示してくださった定義>>846には
ランタイム型情報に基づく場合が動的ディスパッチですよね
しかしSomeもNoneも静的に決まっているenum Option型の中の話ですからランタイム型情報は使っていません
したがってenumのmatchは動的ディスパッチに該当する要素が全くないため、動的ディスパッチではありません、という結論になります >>854
これだったら、yylvalでいいよね。。
もうちょっとない? >>853
コンパイル時にその後の振る舞いが決まるかどうかに興味があって
それを動的か静的かと呼んで議論しているんじゃないのかな? >>855
これパーサじゃないです……yylvalでよくないです……
イチャモン付けたいだけならもう返しません…… 結局まとめるとこうかな?
静的ディスパッチ ← 静的に型情報が決まる場合にコンパイル時に呼び出しメソッドが確定すること
動的ディスパッチ ← 動的に型情報が決まる場合に実行時に呼び出しメソッドが確定すること
Rustのmatch文でのenumの分岐は静的に型情報は確定しているけど呼び出しメソッドを決めるわけではないので静的ディスパッチではない
Rustのmatch文でのenumの分岐は静的に型情報は確定しているため動的に型情報が決まる動的ディスパッチとは無縁
つまりRustのmatch文でのenumの分岐はどちらのディスパッチでもなく一つの型の中の値による条件分岐にすぎない >>858
型情報による条件分岐に限らず値による条件分岐も動的ディスパッチだよ
なぜならC++の場合typeid演算子で取ったtypeinfoオブジェクトで条件分岐したら
それは型情報なのか値なのか?両者に差はないから >>859
-両者に差はないから
+両者を分ける意味はないから >>859
この場合のディスパッチとは型情報に基づいて呼び出しメソッドを決定すること
それが静的に決まれば静的ディスパッチ
そして動的に決まれば動的ディスパッチ
型情報に基づかなければ単なる昔からの条件分岐プログラム
typeidで得られるのは型情報なのでtypeidに基づくならば動的ディスパッチに該当する 条件分岐は条件分岐でしかない
ディスパッチは条件分岐を用いずに振る舞いを切り替えること >>861
typeinfoの実装見てみ
環境違ってもそんなに変わらんと思うから >>864
ちゃうやろ
比較で分岐するか
次の振る舞いがあるところに飛ぶか >>863
型情報を整数値で表すのは当たり前だけど
それは型情報ではない普通のデータの整数値の分岐とは話が全く違う
型情報によって呼び出すメソッドが変わるからそれを決定することをディスパッチと呼ぶ
その型情報が静的に決まるか動的にきまるかの違いのみ
typeidを使っているならば型情報が動的に決まっているのだから動的ディスパッチ >>834
そもそもそれをディスパッチと普通呼ぶ?
やってることはvtable使った動的ディスパッチも似たようなものだから
動的ディスパッチの一種とすることにそこまで違和感はないけど
広く浸透してる定義ではないよね 名称はともかくmatchの分岐はコンパイル時に決まらず
実行時に比較のオーバヘッドがある認識は共通しているので
何も対立はないはず
C++のmatchの話にもどしましょ >>868
>型情報を整数値で表すのは当たり前だけど
>それは型情報ではない普通のデータの整数値の分岐とは話が全く違う
わかんねーよw もういいよ まず>>846のstatic dispatchのページからとって来た文章をdynamic dispatchの「定義」として参照するのが間違い
こりゃすでにdynamic dispatchが定義された前提の上で、static dispatchと異なる点を書いているだけだよ
自分の思い込みを肯定するために都合良く文章を解釈してしまうのは人間やりがちだけどね >>867
ディスパッチは条件により分岐しない
渡された振る舞いを実行するだけ
例えば>>841のサイトのspeakに分岐処理は無いでしょ 話は簡単
まず前提「オーバーロードにより型が決まらないと呼び出す実メソッドが決まらない」
つまり「型情報が決まると呼び出すメソッドが決まる」
この決定のことをディスパッチと呼ぶ
静的に型情報が決まる場合は静的ディスパッチが可能
動的に型情報が決まる場合は動的ディスパッチとなる
型情報と関係ない話はどちらでもない >>874
> まず前提「オーバーロードにより型が決まらないと呼び出す実メソッドが決まらない」
> つまり「型情報が決まると呼び出すメソッドが決まる」
> この決定のことをディスパッチと呼ぶ
ここだけ読むとオーバーロード解決に聞こえるねw
https://ja.cppreference.com/w/cpp/language/overload_resolution Visitorパターン=多重ディスパッチ説があったからそれが元凶だろう
複数のメンバー関数から一つ選ぶのもディスパッチ
だから多重という 動的ディスパッチや静的ディスパッチは
何をディスパッチするのか考えなよ Rustは普通に書くだけでこのスレで言うところの静的ディスパッチとなりコンパイル時点で単相化されて速い
実行時にしか型が判明しない場合に対してはdyn指定による動的ディスパッチが可能でvtableが使われる
vtableを避けたいならばenumに包むことで直和型として収容して扱うこともできる vtableの持ち方がRustとC++では違うんだよね >>877
SpringやFluxのディスパッチャーだったり
Grand Central Dispatchだったり
何に対しても使える用語だから
区別できてない人もいるんだろう C++では、クラスが仮想関数を持つ場合、そのクラスのインスタンスに対して仮想関数テーブルが作成される。
仮想関数テーブルには、仮想関数へのポインタが含まれインスタンスに対して仮想関数が呼び出されるたびに
vtableを参照して適切な関数が呼び出される。
Rustでは動的ディスパッチを実現するためにトレイトオブジェクトが使用される。
トレイトオブジェクトには、traitオブジェクトが実装する各メソッドに対応するポインタのリストが含まれていて
インスタンスに対してメソッドが呼び出されるたびに、トレイトオブジェクトが参照され
適切なポインタが見つかるまでリストを検索し適切な関数が呼び出される。
結果は同じ。 >>882
詳細の説明がいろいろおかしいと思うけどどこソースなの? >>882
クラスとインスタンスの関係を理解してないな
C++の説明もRustの説明も同じように間違ってる
おまえオブジェクト指向を理解してなさそうと言われてたやつだろ >>882
うーむひどいな
とりあえずRustについて、この部分の間違いはあまりにひどい
> traitオブジェクトが実装する各メソッドに対応するポインタのリストが含まれていて
> 適切なポインタが見つかるまでリストを検索し適切な関数が呼び出される。
Rustは常にメソッドが静的に一意に確定するため、動的ディスパッチでも適切なポインタが見つかるまでリストを検索する必要がない
Rustはメソッド名が衝突する場合、まず自分の定義優先で確定、なくてトレイト間に衝突がなければ確定、衝突があればエラーだが、トレイト名を指定することでどのトレイトのメソッドでも常に利用可能
つまりRustではメソッド呼び出しが自分のメソッドかどのトレイトのメソッドかが静的に一意に確定する
静的ポリモーフィズムとして使われるときは、必要とする最小限のトレイトを列挙(=トレイト境界)するため、メソッドの衝突の可能性は通常時よりも減ったり無くなったりする
いずれにせよ上述したようにメソッドは静的に一意に定まるため、静的ディスパッチでは単相化(モノモーフィゼーション)されてコンパイルされる
動的ポリモーフィズムとして使われるときは、現在の仕様では指定できるトレイトは(auto traitを除き)一つのみに限定されている
ただし必要とするトレイトを列挙(=トレイト境界)したダミーなトレイトを任意に作ることも可能なため、事実上は複数のトレイトを指定できるのと同じ
指定トレイトが一つに限定されているということは、(そのトレイト境界を含めた)トレイト群すべてのメソッドを静的に一斉に把握できることを意味する
つまりRustのvtableはその指定トレイト一つのみに定まり、その親や祖先のvtableを辿る必要がなく、呼び出すメソッドは静的に確定してインデックス値となっているため、動的ディスパッチでも高速にメソッドを呼び出せる 間違ったことを書いてる人は完全に悪いけど、内容があれば議論のネタになるからまだマシ
それに対して間違ってる!とか、虚言!とかだけ言う連中は全く役に立たないから無視してよい
なぜなら、正しいことが書かれている場合でも、間違ってる!とか適当なこと言ったりするだけの連中も多いため >>886
> つまりRustのvtableはその指定トレイト一つのみに定まり、その親や祖先のvtableを辿る必要がなく
C++も同じです
> 動的ディスパッチでも高速にメソッドを呼び出せる
何と比較して?静的に比べりゃどうやったって遅いしそこにC++との差はないはずだし
不合格
>>887
テキトーかどうかの検証のために、出典を貼っていただけるとみんなが助かります
やるつもりが無いなら頃合いを見てマサカリを投げさせていただきます >>888
そういう意味のない言いがかりはやめとけ
元の>>882が正しくないこと「適切なポインタが見つかるまでリストを検索」と書いているので、
それに対して正しいこと「親や祖先のvtableを辿る必要がなく、動的ディスパッチでも高速にメソッドを呼び出せる」と書いた
そこで「静的に比べりゃどうやったって遅い」と頓珍漢なことを言い出すのは理解力のない証拠
これ以上は相手にしない OpenCV-rs ってもうメンテされてないんか?
gdgd なんだが >動的ディスパッチ
もしかして
遅延バインディング おじオジ言ってる人は頭がおかしいと他のスレで習ったけどここでもそうなの? てかよく読んでみれば>>882自体は「適切なポインタが見つかるまでリストを検索」としか書いてなくて
具体的にどういうリストなのかの説明は一切無し
なのになぜか>>886は「親や祖先のvtableを辿る」と、親子関係でリストができる?のを何故か仮定している
そういうことだよねw >>887
「最初から間違ってると思ってた」と事後に言うと、本当に最初からだったのかが真偽不明になるから
内容がなくても時刻を記録するだけで意味があるんだよ 祖先のテーブルをたどっていく実装や言語あるよ
特にJavaScriptはメソッドを後から生やせるから大変だった >>896
とりあえず、プライドは高いということは分かった >>887
どう見ても君が間違ってる本人じゃん
なぜバレないと思ったの? 1. 知ったかぶりして嘘をさも本当かのように書き連ねる
2. 間違いを指摘されるとググって必死に正解を探す
3. そしてそんなことは最初から知ってましたというトーンで長文まとめスレを他人のフリして書く
これが複オジメソッド >>900
そして話の内容がC++になると複おじにはちんぷんかんぷんなので
調べても間に合わないし、無限に別の間違いを生み出し続けてしまうというw >>899
俺が間違ってるって??
>>886に間違ってるところがあるなら指摘してくれ >>900
4. 他人のふりして書いた長文まとめも間違っている
というオチ付き >>902
その「間違ってる本人」は>>882のことを指していて、間違いがあるのは>>886のことではないと思うが
それはそれとして>>886の間違いを指摘しておくと
あなたC++で「どのvtableを見るべきか」を実行時にしか判断できないケースがあると思ってない? 嘘だよそれ
じゃないと「メソッドの衝突の可能性」なんて話が出てくる理由が無いと思うんだよね
そんなもんは静的に解決されて当然なのだから
ていうかね、参考にしたリンク貼ってくださいよって何回も言ってるでしょう
そのほうがあなたが(もしかすると私が)何を勘違いしているのかという答えにたどり着きやすいですって
いちいちあなたも長文で解説しなくて済むんですよ >>904
間違いがないのに間違いだと言い張る悪い癖はやめたほうがいいよ
冒頭に「Rustについて」と明記していてC++について一切記述していない
もしRustについて記述した>>886に間違いがあると主張するなら指摘してください
> 参考にしたリンク貼ってくださいよ
参考はRust公式ドキュメントとコードのみ
他の解説サイトがあるかどうか調べたこともないので知らない >>887
間違いがあるとタダで教えてくれるだけでも相当にありがたいことだと認識すべきだぞ
どこがどう間違えてるかをタダで懇切丁寧に教えてもらえると考えるのは甘えでしかない >>905
なるほどね?
例えば「検索する必要がない」「メソッドの衝突の可能性は通常時よりも減ったり無くなったりする」は対比的にそれらが「ある」存在に暗に言及しているのだと思ったよ
行間を読んで根本的に何を勘違いしているのか探ろうと思ったが、これはあくまでRustに関する言及でしかないと
「高速」も何と比較してなのか不明で虚しい響きがあるが、高速だというならそうなんだろう
じゃあ私から言えるのはこれだけです
> Rustは常にメソッドが静的に一意に確定する
じゃあRustに動的ディスパッチなんて実装する必要無いじゃん
dyn存在意義無いじゃん
「『トレイトとメソッド名のペア』が一意に確定する」ならそう書かないと、この文脈でこの表現は語弊しか無いよ 自分が長文を書きたいのではなく、相手に自分の真似をさせたいんじゃないか
知らんけど
真似してくれれば人間皆どっちもどっちだと実証されるかも知れないから ぽまいら一人一人が要点を絞ってくれ
発散させあってたらきりがないんよ
余計なことは省くこと
余計じゃないものが複数あってもより大事なほうを一つ選んで議論を続行すること >>904
メソッド名が衝突した時にどうなるか?どう対応できるか?は
各言語によって異なるから
その説明があるのは普通じゃないか
alias付ける必要があったりなど十人十色 動的ディスパッチするために必要な間接参照の数はRustもC++も同じで高速とか低速とかないから
Rustは動的ディスパッチを使う場合は必ずポインタ経由になるので構造体のデータを読むのに間接参照が1回必ず入る
これが持ち方の違いによって出る差の一つ あ、多重継承のケースがあったか
でもまあ気にするようなオーバーヘッドじゃないよね >>907
後半の指摘については、短い中で詳細まで説明できていないから誤解を与えてしまったもしれないので、そこはすまん
しかしその指摘だとまだ別の誤解されてそうだからその部分についてだけ一応書いておくと
ある型Fooのメソッドmethodの各呼び出しがそれぞれ異なっていてもよくて
Foo::method() なのか
<Foo as Trait1>::method() なのか
<Foo as Trait2>::method() なのかが決まり
Foo::method()がなくてそれ以外が複数で曖昧な時はエラーになるというだけの話
いろんな言語があるからね >>913
具体型Fooが確定している状態で動的ディスパッチは絶対に発生しません
dynと目印のついたトレイトオブジェクト経由でしか動的ディスパッチは発生しません
そしてこのときトレイトは確定しているのでメソッド名は衝突しません
だからメソッド名の衝突の話が出てくる意味が分からないと言っているんです >>912
多重継承の場合はどうなるの?
そこが焦点な気がしてきた >>914
ちゃんと>>886を読みなよ
動的ディスパッチの話は最後の段落にしか書いていない >>914
それはRustの基本が理解できていない
トレイトオブジェクトでも当然メソッド名は衝突しうる
なぜ衝突するのかも>>886に書いてあるな >>900
そのメソッドは迷惑行為なので
間違いを信じそうな人がいる時だけ
レス内容が間違ってることのみを指摘するのが吉 そのムーブはわかってないけどとりあえずケチつけてんだなとしか思わないよ
指摘できないけど誰か論破してくれねーかなっていう情けない感じ >>914
ボロボロですよ
トレイト境界を勉強しましょうね >>916
>>882が「Rustでは動的ディスパッチを実現するために〜〜」という文脈だったから最初からその範囲の訂正しか書いてないんだと思ったよ
脈絡もなく余計な文章を足すとそれがどういう意図でそこにあるのか理解してもらえないから気をつけようね
>>917
ああ厳密にはそうだね、私が間違っておりました
動的ディスパッチには関係ない文脈で書いた文章だって聞いたんでそこはもうどうでもいいです >>921
だよねー
>>886は>>882の間違いを指摘できてるわけでもなく何の意味もない >>921
まだ理解できていないのか?
動的ディスパッチの時こそメソッド名の衝突に対しての処置が重要
そのためどのトレイトのメソッドを呼び出すかを静的に確定するとともに
各トレイトの同名メソッドを区別してvtableのインデックス化をしている >>924
>各トレイトの同名メソッドを区別してvtableのインデックス化をしている
うそーん
ソースを提示してね >>925
インデックス区別しないと動的ディスパッチできないですよ SubとSuper逆だわ
気になるなら直してていいよ >>914
バカだな
動的ディスパッチが行われるときは具体型Fooが確定しているぞ
具体型が確定しているからこそ動的ディスパッチを実行することができる
おまえC++もRustも両方を理解できてねーな >>926
トレイトオブジェクトを扱うためにBoxは不要
ヒープを使うのは必要性があるときのみ
求められているのは俺が書いた「各トレイトの同名メソッドを区別してvtableのインデックス化をしている」の部分だろ
それを直接わかるコードを書いた
ただしvtableはpubではないので現状の仕様を強引にアクセス
インデックス値の順序も変わる可能性ありなので注意
macro_rules! vtable_base { ($dyn:expr) => { *(&$dyn as *const _ as *const usize).offset(1) as *const usize } }
macro_rules! vtable { ($dyn:expr, $index:expr) => { unsafe { *(vtable_base!($dyn).offset($index)) } } }
trait TraitA {
fn method(&self);
}
trait TraitB {
fn method(&self);
}
trait TraitAB: TraitA + TraitB {}
struct Foo;
impl TraitA for Foo { fn method(&self) {} }
impl TraitB for Foo { fn method(&self) {} }
impl TraitAB for Foo {}
fn main() {
let foo = Foo;
let dyn_foo: &dyn TraitAB = &foo;
assert_eq!(vtable![dyn_foo, 3], <Foo as TraitA>::method as usize);
assert_eq!(vtable![dyn_foo, 4], <Foo as TraitB>::method as usize);
}
というわけで動的ディスパッチでもメソッド名衝突の話は必要であり>>886の説明で合っている >>930
単にvtableが作られることを「vtableをインデックス化してる」と言ってたのね
もう嫌だ >>931
助詞を間違えてるぞ
「各トレイトの同名メソッドを区別してvtableのインデックス化」な >>932
どっちでも間違ってる
インデックス化されるのはメソッド
vtableはメソッドがインデックス化されたデータ構造 >>933
だからそう書いてるだろ
文章も>>930のコードも読めないのか? C++からメタ言語機能のような黒魔術を無くして使いやすくしたのがRustという認識でよろしいか? ディスパッチがどうとか言ってるあいだに1000きそうだぞこれ
なんだかんだで実際は両方使うけど、やっぱ俺はこっち推すぜ! みたいなスレになりつつ
テンプレ用意すんの? 要するに「へぇ、継承ってのがあるのか、どうやって実現するんやろ?あ、オレならこうするな、でもそれだとこうなってコストメチャメチャかかるじゃん、使えねぇな」と思ってるくちじゃないの? その件は>>930が正しい
assert通るのを確認した >>930
言いたいことは理解した
でもね、そもそも「衝突」は定義だけで発生するものなんですよ
そのコードのmainの中でdyn_foo.method()と書くと発生するエラーは、「名前解決の失敗」と呼ばれます
そしてこの「衝突」の有り無しは、「vtableのインデックス化」に特に影響を与えません
現に片方だけメソッド名を変更しても、同じレイアウトになりますよね
内部的には別トレイトのメソッドなのだから、"method"部分が「衝突」するしないに関係なく区別されます
「衝突」に、vtableに関して特筆すべき重要性は無いと思います 静的型付けをしてればどのメソッド実装を呼び出すか静的に決まるのは当たり前のこと
それを何か特別なことのように変な長文書くからバカにされる C++er あるあるシリーズ
#![allow(unused)]
... = hoge().unwrap;
... = hoge()?;
let p: *const [u8] = &fuga;
unsafe {} >>937
ほんそれ
C++出来る人はC++使えば良い
C++出来ない人やC++でやらかすうっかりさんだけRust使えば良い 面白いのはC++ちょっとかじったくらいのド素人ほど
なぜかRustに引き寄せられてる気がする
ニワカ人間を引きつける同じニオイがするんだろうなRustには C++は底なし沼な感じが良い
未だにModern C++ Designを初めて読んだときの衝撃を上回る
本には出会ったことがない 職業マとアマチュアで感想違うよね
職業マ「C++? 糞の糞糞」
アマチュア「C++? vtableのコスト(キャッキャ)
鼻から悪魔(ウフフフ)膝を撃ち抜く(キャッキャ)CRTP(ウフフ) Javaは糞
C#はチョット良い感じ
Juliaは死んだ
Rustがんがれ
Nimもがんがれ
C++は使い続けるけどね >>937
C++に挫折した者ども、いまこそRustに集え
そしてRustに挫折した者ども、いま一度C++に立ち返れ
の方がバランスいいと思う >>944
同名メソッドが衝突した時にどうなるかは言語によってかなり異なるから一番重要じゃないかな
衝突が許されない言語と許される場合も条件がある場合もあるよ
衝突があってもエラー出ない言語もあれば特定な時だけエラーな言語もあるね
回避方法も別名定義方式から同名自己定義や直接指定と色々だ Rustが「認め」られたことで、C++のスマポも、べき・べからずが確定したと考えておk? 大手が認めたんだから、Rustと同等に書ければ、それはsafeなんだよな?
これまで、C++のスマポは、CppCoreGuidelinesなんてものはあっても、強制されなかった Rustに関係なくC++ではスマートポインタを使用すれば安全に書けるし
スマートポインタの使用するしないにRustは全く関係ない?
ここ見てる人は俺も含めてRustに注目してはいるが
C++ユーザのほとんどはRustなど眼中にないだろう 強制されるってのがミソだろ Rust派は、Rustなら、必ず・全部安全って言ってるんだからさ >>933
某オジお得意の誤訳だったんじゃねーの? >>914
> 具体型Fooが確定している状態で動的ディスパッチは絶対に発生しません
逆
動的ディスパッチが実行される時点では必ず具体型Fooが確定している
> dynと目印のついたトレイトオブジェクト経由でしか動的ディスパッチは発生しません
> そしてこのときトレイトは確定しているのでメソッド名は衝突しません
衝突する
直接のトレイトは確定しても付随するトレイト境界があれば各トレイトでメソッド名は衝突しうる >>954
でも>>905によるとRust以外の話をしたつもりは無いらしいよ?
深読みしすぎじゃないかな? どの言語でも他の言語とは異なる特徴があるからその説明をしてくれないとわからん
それを説明されると困る人がいるのが不思議 >>957,960
何を言っているのかサッパリ分からん そいつはRustのこともC++のことも何も知らないくせに
なにかコメントしたいだけの池沼なので放置するしかない >>958
C++でスマポを使ってもヌル安全性もデータ競合安全性も得られない
さらに複雑化した時のスマポの使い方ミスで多くの問題が起きてきたことを考えると
本当に必要なのはスマポが正しく使われていない時にコンパイルエラーを出すこと
現状のC++は欠陥品であり今後も多くのセキュリティホールを生み出し続けるだろう >>968
おおGCくんが来た
>C++でスマポを使ってもヌル安全性もデータ競合安全性も得られない
どんなミスか興味があるのでソースで示してね >>743
同感
Rustは衛生的マクロな点を始めとして各種マクロが優秀すぎる
C++がダメすぎるんだよな
テンプレートも問題ありすぎ ディスパッチの定義を捻じ曲げたのと同じで
衝突の定義も捻じ曲げにきてるよな >>940
コードがわかりくいのかなと思って
vtableのところをもう少しわかりやすくしてみた
trait TraitA { fn method1(&self); fn method2(&self); }
trait TraitB { fn method1(&self); fn method2(&self); }
trait TraitAB: TraitA + TraitB {}
struct Foo;
impl TraitA for Foo { fn method1(&self) {} fn method2(&self) {} }
impl TraitB for Foo { fn method1(&self) {} fn method2(&self) {} }
impl TraitAB for Foo {}
macro_rules! as_addr { ($target:expr) => { &($target) as *const _ } }
macro_rules! as_array { ($addr:expr, $index:expr) => { *(($addr) as *const usize).offset($index) } }
macro_rules! vtable { ($dyn:expr, $index:expr) => { unsafe { as_array![as_array![as_addr!($dyn), 1], $index] } } }
fn main() {
let foo = Foo;
let dyn_foo: &dyn TraitAB = &foo;
assert_eq!(vtable![dyn_foo, 0], std::ptr::drop_in_place::<Foo> as usize);
assert_eq!(vtable![dyn_foo, 1], std::mem::size_of::<Foo>());
assert_eq!(vtable![dyn_foo, 2], std::mem::align_of::<Foo>());
assert_eq!(vtable![dyn_foo, 3], <Foo as TraitA>::method1 as usize);
assert_eq!(vtable![dyn_foo, 4], <Foo as TraitA>::method2 as usize);
assert_eq!(vtable![dyn_foo, 5], <Foo as TraitB>::method1 as usize);
assert_eq!(vtable![dyn_foo, 6], <Foo as TraitB>::method2 as usize);
}
このように各トレイトの同名メソッドを区別してvtableのインデックス化(このコードだと他の部分含めてインデックス3~6)をしている これ次スレたてるの? あるいはどっかの雑スレに合流? C/C++ vs Rustとしてあった方が良いと思うけどね
雑スレだとGCの勢力が強くなりそう >>972
汚コードに磨きをかけるなよ
普通に関数で書けるものをネストさせたマクロにするセンスに脱帽 単純に開発効率の問題だよな
C++よりRustは実行デバッグの時間がかなり減って開発効率がいい 汚コード唱えるやつがコードを示したことがなく信用できない >>978
君の日本語がおかしいって話なんで、ソースで示すべきことは何も無いよ
それともなにか示してほしいの? スレを読んでいて技術的な論争は興味深いんだけど
他人への攻撃をしてる人たちは邪魔なんで消えてほしい そもそも>>1がソースを書けないと思われる
特にC++は読めもしないのだろう
RustとC++を技術的に比較するなら両方のソースをある程度書けないと不可能 >>3 にあるとおり、やれっていわれたらやる マとしてはこれでFA
慣れは必要だけど、要求される頃には、定石も今以上に揃うだろうし
ここ読んでて、食わず嫌いしてたRustを眺めなおしてから、
CppCoreGuidelines 読んだら、めっちゃわかりやすかった
これだけで俺には十分収穫あったね Linusに認められた、これだけで、Rustの「勝利」は外形的事実 争う必要はない
はずなのに、そのうえまだ、Rustの優位を主張するのに全力な香具師がいる
若いなって正直思う 昔俺もああだったぜ
C++を母語としている者が考えることは、次に何を取り込むか
やっぱ #pragma safe は欲しいね
そのうしろに値くらい付いてもいい safeの詳細も、進化していくだろうから あああと、パタンマッチを知らなかったのも俺だ (知らぬは)一生の恥になるとこだったw
静的にソースコードを解析してsafeを証明できる、ガイドライン違反を指摘できることだとばかり
rustcのサンプル出してくれた奴には悪かった
「たしかに面白い…けど、こういうの、Cなら、yylvalっぽく処理するよね…」っていう印象だったんだ
inspectってのが来たら来るらしいので、来たら喜んで遊んでみるとして
優位性の根拠になるか? それホントC++に必要? ってのは次スレに持ち越したい
っていう埋め >>985
キミは周回遅れのド素人でかつ
人より知能が劣るからもう発言しなくていいです
これはいじわる発言じゃなくて、助言です よく言われるよ
Rustのエヴァンジェリストが暴れていいのに、初心者の俺に黙っとけはないなあ
せいぜい質問させてもらうよ >>981と>>986は同一人物です
皆さん次スレでも騙されないようご注意を >>976
複オジメソッドに釣られてるよ
気をつけて 自分の間違いを認められるだけマシ
>>981は露骨に複おじだけど
>>986=>>847=ID:BpzIAh0Kは違う気がするんよなあ
あんまり雑認定しすぎるとおじサイドの「自演に見えてるやつは頭がおかしい」の批判が有効になってしまうから、確証を持てないならほどほどにな 俺は池沼と複オジをこのスレから排除したいだけよ
だって時間のムダだもん やめろバカ!複おじを野に放つ気か!?
せっかく平和なRust本スレが実現できて、後はヤツが追い払った住民たちを呼び戻すだけだというのに! 残念だが、初心者お断りとは書いてなかったんだなあ
そうくると思って、俺がとっととスレ建てちまったからねw >>993
そうかそっちか
それは申し訳なかった
こっちを隔離にすべきやね
複オジも池沼(ID:W9/nq+tL)もこっちに張り付く気マンマンらしいし まあまあ同じスレで出会った仲間なんだから仲良くしようや Rustが良いって言ってる人は
C/C++のポインタとメモリ管理理解出来なかったからだろ このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 36日 3時間 40分 48秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。