結局C++とRustってどっちが良いの? 3traits

■ このスレッドは過去ログ倉庫に格納されています
2023/05/04(木) 07:49:56.33ID:z+qB+AKQ
「C++の色々配慮してめんどくさい感じは好きだけど、実務になったらメモリ安全性とか考えて今後Rustに変わっていくんかな」
「うだうだ言ってないで仕事で必要なのをやればいいんだよ、趣味なら好きなのやればいい」

っていう雑談スレ。

前スレ: 結局C++とRustってどっちが良いの? 2traits
https://mevius.5ch.net/test/read.cgi/tech/1680363777/

関連スレ(マ板): Google&MS「バグの70%はC/C++。Rustにする」
https://medaka.5ch.net/test/read.cgi/prog/1619943288/
2023/05/04(木) 14:12:15.32ID:AmdlArlq
板のルールが理解できない、プログラムがロクに書けない人たちのスレ
>>1死んどけ荒らしのクズ
3デフォルトの名無しさん
垢版 |
2023/05/04(木) 14:13:35.45ID:K35qCUKZ
あらゆるところに関所がある
まるで江戸時代だ
裏山に抜け道を見付けて分け入っても
突然藪から棒に番人が現れる
ところがそんな番人も
unsafe印籠を魅せれば一撃で退散だ
unsafe万歳!!!
こんなことなら最初から
表通りでunsafe印籠を出しておけば良かったんだ
きっと番人たちも思っているはず
さっさと最初からunsafe印籠魅せやがれ
無駄な手間取らせやがって
こんなのがエコシステムとか失笑もの
2023/05/04(木) 14:18:13.51ID:K35qCUKZ
ここの説明だと
https://keens.github.io/blog/2018/12/08/rustnomoju_runotsukaikata_2018_editionhan/
lib.rs も main.rs も共存出来る様な描きっぷりだなぁ
今の Rust だと許さないゎょ

まあ2018だし
2023/05/04(木) 14:39:58.15ID:Pbw0n2Gt
=== 複製おじさん(通称複おじ)について ===
Rustスレを中心に活動し、2023年4月現在で1年以上ム板に住み着くRustacean。無自覚な荒らし。

Rustスレでは、基本的に他住民の意見を聞いて糧とすることなく、自らのコードが最善であると、ID変更自演を交えいつまでも主張し続ける。
同スレで「所有権が複製される」という違和感のある表現を、「違和感がある」とする他住民の意見をすべて否定してしつこく擁護し続けたことから、「複製おじさん」というあだ名が付けられた。
それ以外のム板スレでは、基本的に他住民の意見を聞いて糧とすることなく、Rustこそが最善であると、ID変更自演を交えいつまでも主張し続ける。
その基本戦術は、「GC言語は遅い」の一声でC/C++/Rust以外の言語を否定し、残ったC/C++は安全ではないので、Rustが最善であるとするもの。

しかしながら、Rust以外の言語に関しては、正当な批判を展開するのに十分な知識を持っているとは言いがたい。
本スレPart1では、C++の問題点を指摘しようとして多数の誤り・知識不足を露呈することとなった。特にしつこく食い下がったのが「動的ディスパッチ」に関する誤解である。
https://mevius.5ch.net/test/read.cgi/tech/1677286186/786-799(ID:Evbafc70とID:RiLc+pIfが複製おじさんであると考えられている)
要約すると、通常「条件分岐」と呼ばれるものを「動的ディスパッチ」と呼ぶのが正しいと主張し続けたのである。
常識的にはあり得ない誤解だが、提示されたC++のコードが自らの主張(C++にはパターンマッチが無い)に不都合であると感じたためか、C++のコードを正しく読み解くことができないにもかかわらず脊髄反射的に否定してしまい、その根拠として誤った論理をこじつけてしまったものと思われる。

ちなみにこの後、同種の誤解を持って書き込むID:wHEiYRW7(これはID使用歴的に複製おじさんとは考えにくい)に対して、正しい理解に基づく指摘を行う単発IDが複数出現するが、この中にも複製おじさんが多数含まれていると考えられている。
このように自分の誤りを認識した場合、それを認める書き込みは決して行わず、別人の振りをして最初から正しく理解していた体を装うのも複製おじさんの特徴である。
2023/05/04(木) 14:42:23.03ID:lCXaYfHw
Fooという型だけを別ファイルfoo.rsへ移してファイルを分けたくなったとする
もちろんそれは可能だが二つの方針に分かれる

その1
pub mod foo;
とする
つまり単にmod foo;とするのではなくpubを付けることで利用者がfooにアクセスできるようになる
さらにfoo.rsでFooにもpubが付いていれば
利用者はfoo::Fooまたは クレート名::foo::Fooという形で利用できる

その2
mod foo;
pub use foo::Foo;
とする
つまりfooは公開しない
しかしFooは公開したいのでfooの下ではなくトップでFooを公開する
この場もfoo.rsでFooにpubは必要
利用者はfoo::を付けずにFooまたは クレート名::Fooという形で利用できる

ようするにファイルを分けたときに
分けた形で公開するならその1
分けたことを隠蔽して公開するならその2
2023/05/04(木) 14:50:46.28ID:MjER2/nN
>>5
>自分の誤りを認識した場合、それを認める書き込みは決して行わず、別人の振りをして最初から正しく理解していた体を装う

図らずも昨晩今日のC言語スレでその現象が観測されました
2023/05/04(木) 14:53:45.65ID:lCXaYfHw
さらに型Fooのイテレータだけ別ファイルiter.rsに分けたくなったとする
その時はfoo/iter.rsというファイルにする
そしてfoo.rsの中でmod iter;とすればよい
分けたことを隠蔽するか公開するか>>6と同じ方針で望む
もし公開するならfoo::iter::Iterのようにパスが長くなる
それをメリットかデメリットかで決めればよい
9デフォルトの名無しさん
垢版 |
2023/05/04(木) 15:08:27.50ID:BxJFarE7
>>4
今も同じように共存できるよ
2023/05/04(木) 15:23:13.86ID:lCXaYfHw
次に>>6とは全く逆
ファイルを分けたくないけど
foo::Fooという形で公開したい時
その場合は
pub mod foo {
 ここにFooの定義など
}
とすればよい
ファイルfoo.rsに分けたときと同じにできる

つまり
ファイルを分けるか分けないか
公開パスを分けるか分けないか
任意の組み合わせで自由に可能
2023/05/04(木) 15:23:20.04ID:vi1eEsAo
>>5
動的ディスパッチは俺だよw
間違うな
2023/05/04(木) 15:35:48.42ID:c9bfGq1+
かの御仁、ディスパッチのことになるとずいぶん熱くなってたよなあ
継承を廃止するのに必要だったからってわけだったみたいね
2023/05/04(木) 15:59:17.58ID:lCXaYfHw
さらに5つ目の方法
ファイルは分けなくて
mod foo{...}という形でfooは分けるけど
そのfooは見せない!
と一見すると矛盾した方針がある

その場合は>>6>>10からのご推測の通り
mod foo {
 ここにFooの定義など
}
pub use foo::Foo;
とすればよい
利用者は直接Fooまたはクレート名::Fooとして使える

しかしそれならば
mod foo{...}を使わずにそのまま直接Fooの定義を書いたのと同じじゃないか!
との疑問が湧く

ほぼその通りだが
この方法によりmod foo{...}の中は名前空間が分離されているため
他とのコードの分離もしっかりできる
もし外部との結合があれば
mod foo{...}の中で改めてその使用宣言が必要になる
逆に外部から使われるものはpub宣言が必要となる
mod foo{...}の中に敢えて入れることでそれら他との関係が明示させられる

つまりまとめると3つの自由度がある
・mod fooとして分けるかどうか
・それをfoo.rsとしてファイルに分けるかどうか
・そのfooを外部に見せるか隠蔽するか
それらを多段foo::bar::bazそれぞれ含めて自由に決めればよい
2023/05/04(木) 16:03:32.18ID:VOb3FI4m
Rustの用語に「名前空間」なんてあるの?
2023/05/04(木) 16:04:11.41ID:8veAOVw8
あるよ
2023/05/04(木) 16:09:29.50ID:lCXaYfHw
>>12
Rustは継承を使わずに合成だが
動的ディスパッチ自体はほぼ変わらない
vtable部分が合成した各メソッドを含む一覧になる程度
2023/05/04(木) 16:21:16.61ID:gs6nMm59
この話興味ない人は今のうちにCpp2見とくと良いよ(思ってたより動きが早い)
https://herbsutter.com/2023/04/30/cppfront-spring-update/

Carbonと違ってこっちは動かせるしC++へのバックポートを視野に入れているから
結果的にRustの立ち位置に影響する

細かいところだと、この辺、Zigに通じるものがある
https://github.com/hsutter/cppfront/wiki/Design-note:-Postfix-operators
https://i.imgur.com/bkjsYG4.png

unsafe印籠(monolithic hammer)は否定してる
https://github.com/hsutter/cppfront/wiki/Design-note:-Unsafe-code
2023/05/04(木) 16:21:47.50ID:K35qCUKZ
ほとんどのmoduleは
自分の今のprojectから分離して別のcrateに移動しても
module内のpub関数はuse cratename;すればそのまま変更無しで参照出来るが
module内のmacroはuse cratename;するだけでは参照出来ない
#[macro_export] だけでは不十分でmoduleに
pub use macroname;
を書き足す必要がある
2023/05/04(木) 16:22:57.02ID:K35qCUKZ
>>9
ごめん
proc_macro が共存出来なかったって事だった
ていうか proc_macro が共存出来ないのは昔からだな
2023/05/04(木) 17:29:00.42ID:5uLSpcuJ
ITの世界は短期決戦の世界。知名度がこんなに上がってるのに使用者数が1%未満
のRustには一般言語にまで普及する可能性はほぼ無い。
2023/05/04(木) 17:31:09.86ID:5uLSpcuJ
今までの蓄積ではなく、新しく書かれているコードの量ですら1%未満であることの
意味は、絶対に普及しない路線に入っていると言うことだ。
2023/05/04(木) 17:38:32.86ID:5uLSpcuJ
商品が売れない原因の9割は知名度不足だと言われているが、Rustは既に最高レベル
の知名度になった。なのに「売れてない」。それは商品自体に問題があると考え
なければならない。俺はRustが嫌いなので、それでいいと思っているが。
2023/05/04(木) 17:48:43.01ID:/QrENRCq
結論としてはRustはC++に比べるとファイル分轄が非常にめんどくさいと言うことだな
ルールが複雑でめんどくさい

言語仕様なのかcargoの仕様なのかしらないけどフォルダ構造が縛られるし…
2023/05/04(木) 17:52:33.78ID:/QrENRCq
よくわからんけど自分でstruct沢山作ってcore/modelフォルダ作ってそこに全部突っ込んでフラットに使おうとすると障害があると
implをcore/implに突っ込もうとしても問題があると
それかそれを参照する何かを別に作らないといけないと
自由度が低い
25デフォルトの名無しさん
垢版 |
2023/05/04(木) 17:56:09.35ID:jCd1Wte6
いやーさすがにC++に比べたらRustのが超シンプルなのでわかりやすい
C++のモジュール知っててRustのモジュールを理解出来ない人はいないと思う
26デフォルトの名無しさん
垢版 |
2023/05/04(木) 17:58:28.21ID:agWF6Rws
>>24
障害?
27デフォルトの名無しさん
垢版 |
2023/05/04(木) 18:03:56.15ID:gkHxEYi2
/struct、/impl、/traitみたいな分け方をしたかったのかぁ
できなくはないけどやめといたほうがいいんじゃないか
2023/05/04(木) 18:06:55.48ID:/QrENRCq
したいんじゃなくてそれは仮に書いただけ
自由度が低いと言うことを示したかっただけ

ファイル名やフォルダ名が縛られたり

なんで自由度が低いのに顔を真っ赤にして自由度が高いと書くのか不明なんだけど
2023/05/04(木) 18:12:40.50ID:JNVfsZ/B
>>25
C++は至ってシンプルやろ?
30ななし
垢版 |
2023/05/04(木) 18:16:37.43ID:hLXsMKYH
Javaしかやったことない
C++っていいの?
2023/05/04(木) 18:16:44.50ID:VOb3FI4m
既存のC++のプロジェクトに書き足していくかたちでCargoとかが使われてるんだろ?
C/C++の作法に併せたRustのフォルダ構成の裏ルールがあるとしか思えない
2023/05/04(木) 18:21:23.60ID:BxJFarE7
モジュール名とファイル名(パス)は↓みたいな書き方で一応切り離せるよ
ややこしくなるから基本使わないけど

#[path="platform/foo_windows.rs"]
mod foo;

自由度が高いってのはたぶん外面を維持したまま内装を変更しやすいって意味で使ってたと思う
(長文だったからちゃんと読んでない)

モジュールの構成は可視性に関わるからそこまで自由ではないと思う
全部にpubつければ自由になるけどそんな自由はいらない
2023/05/04(木) 18:34:14.75ID:/QrENRCq
自分が使ってる中ではC#が一番自由度が高い気がする
classの分割自由
名前空間の分割自由
プロジェクト内ではフォルダ空間自由
ファイル名自由
2023/05/04(木) 18:38:46.37ID:/QrENRCq
global usingと言うものが出来て各ファイルでusingもしなくて良くなった
これはいらない機能だと思うけど
2023/05/04(木) 18:42:44.88ID:BxJFarE7
C#はまじめに使ったことないけど拡張メソッドとかいうのが自由すぎて若干引いた記憶がある
どこで何を足されるか分からない恐怖を感じた
2023/05/04(木) 18:48:25.91ID:/QrENRCq
プロジェクト内のファイル位置も当然自由
一ファイルに複数の名前空間含めるのも自由
2023/05/04(木) 19:14:36.30ID:/QrENRCq
Rustがなぜファイル名やフォルダ名でモジュール固定になってるかと言えば
それしかモジュール位置を決定する仕組みがないから
ルートのコードからたどれる物しか名前を解決できないから
それが良くないんじゃないの?

>>35
既存のクラスすべてで必ず拡張されるわけじゃない
本当は拡張などしてなくてただのstaticメソッドだし
どこかそれを他で使われていてもそれをusingしなければ使えないから関係ない
usingしててもpublicじゃなければ見えないので影響はない
2023/05/04(木) 19:37:12.64ID:Zob+4ecH
proc_macro で黒魔術やりたい放題出来る様になりますた
おまいらのお蔭です本当にありがとうございますた

っていうか proc_macro::TokenStream と proc_macro2::TokenStream と
同時に使うと違うと判ってても混乱するな
2023/05/04(木) 19:41:38.84ID:Zob+4ecH
>>35
>どこで何を足されるか分からない恐怖を感じた

これは Rust の trait や後付けの impl にも同じ臭いを感じる
2023/05/04(木) 20:43:05.13ID:BxJFarE7
一応Rustのimplは型(trait)を定義したクレート内に制限かけてるけどそれでも気になる人はいるか
自由な場所で定義を足せるとどうしても散らかりやすくなる
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況