Rust part9

レス数が900を超えています。1000を超えると表示できなくなるよ。
2020/08/23(日) 01:07:35.52ID:MgEpWwVh
Mozilla発のRust言語のスレ

公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust

Web上の実行環境
https://play.rust-lang.org

前スレ
Rust part8
https://mevius.5ch.net/test/read.cgi/tech/1579834072/
2021/03/14(日) 22:04:54.76ID:JBU2DMkD
>>835
その程度も出来ない馬鹿だとCでやったら大惨事じゃね?
2021/03/14(日) 22:31:41.33ID:pQGk05s+
デフォルトで余計なことやる設計が好きな人にはいいんじゃないの?
結局どっちに寄せるかだし。
2021/03/14(日) 23:37:14.51ID:n3ZlR2nQ
>>835
自動ったって最適化の挙動はごく単純なルールだし、結果も解る範囲なのだからやはり問題ないとおもうけど。
2021/03/14(日) 23:48:28.09ID:n3ZlR2nQ
メモリレイアウトのパターンを何種類か決められて、それぞれの最適化パターンに名前が付けられていくと考えれば、概念的な意思の統一がしやすくなるわけでしよ。今まで皆がバラバラにやってた方がおかしいわけで。構造体の隙間にあちこちゴミ入ってるのどれほど見たことか。
2021/03/15(月) 01:33:05.21ID:c4Lf5m0s
>>835
clippy の improper-ctypes-definition とかで検出できるのでは
841デフォルトの名無しさん
垢版 |
2021/03/15(月) 01:42:14.94ID:Nwz504CC
Cはコンパイラによりけりで最適化の度合いによるけど、無茶な事をしなければ基本は
書いた通りにしか動かないよ。C++のクラスは継承を使うとよう分からんレイアウトを
しくさるけど。Rustのやり方でも問題は確かにないし、結局どっちに寄せるかと言うのも
その通り。むしろゴミと言うか他人がレイアウトを整理しようとして事故るパターンの方が
多いが、まあ確かに些細な事だろう
2021/03/15(月) 01:45:53.32ID:uFpZBB9k
C言語でも非標準とはいえ呼び出し規約の指定とかあったなあ
2021/03/15(月) 02:24:54.25ID:8Jf2QlAa
付け忘れでリリースってテストもせずにリリースってこと?
確かにデフォルトで安全側に振るのはRustの基本方針だとは思うけど
全ての型をFFIする前提というのはやりすぎだと思うが。
2021/03/15(月) 02:38:04.29ID:c4Lf5m0s
Cは書いたとおりにしか動かないってのは単にCに対する理解度が高いだけでは
例えばアセンブリしか知らない人から見たら自動変数の振る舞いなんかは暗黙的な動作ばかりだと思うが
2021/03/15(月) 13:54:57.20ID:faH0kxEk
まったくその通り
Cでは書いたとおりにしか動かない、と思うのはCにあまりにペッタリ入り込みすぎて
もはやC脳になってしまっている(なので考えずに自動でなされる変換が頭のなかでできてしまう)か
またはじつは思いこみで理解が足りてないかのどっちか
2021/03/15(月) 14:00:05.56ID:GOWRyYdB
更に言えば最適化を有効にしたらかなりアクロバティックなコードを生成してくることもあるので人間には予測不能。
2021/03/15(月) 19:06:12.98ID:tiOBROfx
たいしてメモリ削減できない言語のくせに変な最適化かけんなよって話だわ
2021/03/15(月) 19:34:49.20ID:13DwLIrw
Rustではunsafe使わない限りは構造体のフィールドレイアウトを変更しても問題無いので、最適化の余地を残す仕様になってるのは良い事なんでは
2021/03/15(月) 19:54:56.71ID:nJdAJo9y
>>845
書いた通りに動かないのはバグでは?
2021/03/15(月) 20:16:17.39ID:c4Lf5m0s
Cが書いたとおりにしか動かないのと同様にRustも書いたとおりにしか動かないということ

構造体メンバの順序の話はrepr(C)つけたりclippy使えというのが結論で
デフォルトの挙動に違和感を覚えるか否かという話はbikeshed
2021/03/15(月) 23:27:42.36ID:HGmaHoUI
メンバの配置が固定だと移植性も下がるよね
パフォーマンスの低下くらいだったらかわいいけど
下手すればバスエラーで落ちる
2021/03/16(火) 00:53:01.99ID:GTaecVmm
勝手に最適化する方が移植性落ちるわ。
2021/03/16(火) 00:56:51.74ID:5nPZFfnW
Cの常識がどこでも通用すると思ってると別の言語でも怪我しそう
2021/03/16(火) 00:59:01.44ID:GTaecVmm
コンパイラに全て任せればいいって考えのやつのが実際は事故ってるがな。
2021/03/16(火) 01:07:50.71ID:5nPZFfnW
何に怒ってるのかよく分からないけどコンパイラによる構造体レイアウトの最適化がデフォルトオンになってるのがそんなに気に入らないの?
2021/03/16(火) 05:37:04.29ID:0EC0D1BB
>>854
それは言語の問題なのか、コンパイラの問題なのか、何が事故ってるの?
2021/03/16(火) 07:17:52.07ID:oighJobp
ていうかCコンパイラのアラインメントだって最適化の一種じゃ?
2021/03/16(火) 08:01:04.42ID:pXLX1cSG
そんなに気になるなら、フォークして、
デフォルトの挙動が違うrustを作れば済む話じゃないの?
2021/03/16(火) 08:39:27.88ID:SlLiGo1E
最適化でunalignedになって落ちるならコンパイラのバグなんだから直せばいいし、
手動であらゆるアーキ向けにパディングを調整するよりよっぽどいいと思うけどな。
2021/03/17(水) 04:59:36.34ID:F/MTmTZA
メモリレイアウトの話まだ続いてるの?
C++でダメなところ潰して制約強めでバグ出にくくしようって言語で、コンパイラが信じられないと言われてもコンセプトが違うとしか
2021/03/17(水) 20:44:00.69ID:hH82Uf3P
C++でダメなところ潰して制約強めでバグ出にくくしようってのと、
コンパイラが信じられないからコンパイラ設計を楽にしようってのは別に矛盾しないがな。
頭悪すぎ。
2021/03/17(水) 22:43:22.09ID:8cWw5z32
コンパイラ設計を楽にするって、例えばどういうこと?
2021/03/18(木) 03:06:39.25ID:YG5QY/Fi
ここまでの流れでコンパイラがバグるほど難しい事してないと思うけど。何を心配してるの?
2021/03/18(木) 06:33:11.45ID:teFQO94z
何が問題なのかiefoneか何かで実例出して欲しいな
2021/03/18(木) 06:33:40.91ID:teFQO94z
ideoneでした
2021/03/18(木) 08:04:15.94ID:VY1V7baX
問題になるのは外部リンゲージな関数で構造体を渡すときだと思うが
コンパイルした後リンクするみたいな本番行為ってiefoneできるんでしたっけ
2021/03/18(木) 08:37:15.10ID:teFQO94z
テストの段階でわかるじゃないか
2021/03/18(木) 09:11:26.74ID:7Uj1c/fU
本番行為大好きです
2021/03/18(木) 22:11:22.58ID:j2TrRshi
イデオンの本番?
2021/03/18(木) 22:46:55.62ID:4SeQ/rCs
iefone って中華スマホっぽいな。
2021/03/19(金) 01:15:52.96ID:jSzcAIKb
ウィンドーズのAPIの構造体みたいにメンバの数が異なる構造体のシリーズで
先頭部分は同じレイアウトであって欲しい、みたいな要請がある場合は
いかに自動レイアウトの規則が厳格に決まっていても問題を生じるし、
テストで見つけろといっても限界がある
メンバ数3、4、5はOKだった!→56億年後に弥勒菩薩が6番目のメンバをboolにしたらすべて崩れ去った、みたいな
2021/03/19(金) 01:18:45.07ID:jSzcAIKb
それとも何かねここで言うテストというのはコンパイラの
自動レイアウトするロジックを見通したホワイトボックステストで
カバレッジ100%を目指せというのかね?
2021/03/19(金) 01:32:38.19ID:ZwQV5hpU
で、どれだけメモリ量減らせてるの?
2021/03/19(金) 01:46:10.43ID:jSzcAIKb
かなり減る64 bit整数m個とbool m+1個の構造体で#pragma pack(〜)とかしない場合
順序依存で8*m + 8*(m+1)バイトになるか8*m + ceil((m+1)/8)バイトで済むかの違いがある
引いたらどれだけ減ったかワカル
2021/03/19(金) 01:48:07.52ID:QYoHC3cJ
この人何と戦ってるの
2021/03/19(金) 02:08:13.91ID:qP05xHwq
日本語不自由なの多すぎか
2021/03/19(金) 08:05:42.69ID:elmSSYEz
C++だって処理系によってABI違って互換性無いのになに寝ぼけた事言ってんだ状態
2021/03/19(金) 08:22:46.12ID:jSzcAIKb
ヒエッ…日本語でどづぞ

>>877
処理系がABIを決めるケースはまれ
宇宙誕生以来一桁あるかどうか
2021/03/19(金) 08:52:24.84ID:6TNOQqr9
メーリングリストでそれらを主張してみてはどうか?ここで言ってもrust下げとしか見られない
2021/03/19(金) 10:06:03.26ID:S4bW7+Mw
さっぱりわかんねえんだが、
>先頭部分は同じレイアウトであって欲しい、みたいな要請がある場合は
こんなクソみたいな要請がある案件の場合はrepr(c)でいいんちゃうん?
2021/03/19(金) 10:57:59.03ID:jSzcAIKb
スマン>>878はstdcallを念頭に言ったがcdeclはC言語処理系によって決まったと言ってよいかもしれませんねーorz
stdcallの発祥がWindowsとPascalのどちらが先なのかは知りま栓、

>880
>こんなクソみたいな要請がある案件の場合はrepr(c)でいいんちゃうん?
禿げしく同意
2021/03/19(金) 11:33:49.63ID:qP05xHwq
なにこいつ……
2021/03/19(金) 14:44:53.99ID:ZYq4u5st
>>871
言われてみれば確かに。
alignmentはCPUのBIT数が同じであれば大体同じなので、自動でやってくれもよい
場合も有るが、順序まで変えたのでは困るな。
2021/03/19(金) 15:07:57.84ID:x8qTxIkr
repr(C)をつけるのでは駄目な理由は誰も言えないのか
2021/03/19(金) 15:11:24.58ID:gR5Gr2WA
おじいちゃんが今際の際に「repr(C)は使うな…ガクッ」って言ってたんよ…
2021/03/19(金) 17:24:40.30ID:t8rUWn4Q
不満があっても使い続ける必要があるなら、
フォークしちゃえばいいじゃん。
もやもやしつつ使い続けるのは、良くないよ。
2021/03/19(金) 17:49:26.38ID:6tRZIbsl
C/C++をいまさらフォークしたところで誰も見向きもせず
個人で使うだけで消えていくだけだろうが
rustなら「おっ、おれもこういうのが欲しかった!」
ってやつがむらがってきてワンチャン有名なれる・・かも?
2021/03/19(金) 18:09:28.62ID:UA/QoJ1s
ナイナイ(ヾノ・∀・`)
2021/03/19(金) 18:46:02.05ID:3FXWvrKo
>>887
一貫性のあるc--ができたら可能性あるよ。
890デフォルトの名無しさん
垢版 |
2021/03/19(金) 19:57:51.38ID:gCuAqma+
>>885
同じおじいちゃんが原理主義者になるなってのも言ってただろうに。
2021/03/19(金) 22:01:04.37ID:CjYMRRBz
Cargo.tomlかなんかでデフォルトのreprを設定できればいいんすか?
俺は要らんけど
2021/03/19(金) 23:27:54.25ID:u/twtFDQ
repr(C)がついてないデータ型に警告出すようなlint書いてclippyにpullreq出せば良いのでは
2021/03/20(土) 05:48:46.20ID:7iIk7Cl9
別に
構造体XのメモリレイアウトをRustのデフォルトとすべきなのかrepr(C)で扱ってほしいのか(あるいはその他か)は
構造体Xを定義したときに定義した人の意向で決まるから何の問題も無い
別の人が構造体Xを間違ったメモリレイアウトで解釈するプログラムを書く危険性は
(わざとそうするのでもない限り)無い
2021/03/20(土) 05:53:57.90ID:7iIk7Cl9
、と思うんだけどrepr指定が異なる構造体はちゃんと別の型とみなされるの?
つまりrepr(C)のメモリレイアウトな構造体を、(例えば)repr(PACKED)なメモリレイアウトな構造体を引数にとる関数に
渡せてしまうとかあると悲劇なわけだが

Rust使ったことないからよくわからないので教えてくだちい、
2021/03/20(土) 11:19:17.36ID:ZBpm47pR
>>894
一つの型には一つしかrepr指定できないから指定を変えたければ別の型にするしかないよ
unsafeなtransmuteで強引に変換することは可能だけど、それは当然変換した人の責任
2021/03/20(土) 11:59:39.96ID:ARQDcx4T
>>874
組み込みの場合、rustのランタイムの大きさ考えたらその程度じゃ全然埋まらないんだが。。
結局まともなユースケースを考えてないんだろうね。
2021/03/20(土) 12:09:06.74ID:JFutrdJQ
Rustにランタイムなどないが
2021/03/20(土) 12:20:42.44ID:Yqrg6wwp
実行ファイルの大きさの事かな?
2021/03/20(土) 12:34:10.54ID:N5mfveDq
stdがでかいって話かな?
なんかそれも問題になって対応策はあった気がするけど
2021/03/20(土) 12:46:24.31ID:ZBpm47pR
デフォルトでは利便性やリンクの高速化のために大きくなってるけど
組み込み用途ならちゃんと最小化する方法はあるし
Cと同程度まで縮むよ
2021/03/20(土) 13:08:56.08ID:OmO/62/g
>>896
下記の記事の Executable sizes の節で実行ファイルのサイズについてCとの比較を考察してた
サイズ削減する方法も書いてあったよ

https://kornel.ski/rust-c-speed
2021/03/20(土) 13:44:30.39ID:0Kyl0nNZ
ちょびっとだけどついにlinux-nextにrustで書かれたコードが入ったか
2021/03/20(土) 15:24:30.80ID:mHStnoHo
>>896
組み込みデバイスでrustを使いやすくしようとしてるワーキンググループあるから
どういうところで不便に思っているのかコメント寄せてあげたら良いのでは
https://github.com/rust-embedded/wg
issueでコメント募集してるよ
904デフォルトの名無しさん
垢版 |
2021/03/21(日) 22:19:00.80ID:k7ifup1R
依存しているクレートが多いとビルドが長い、いい加減にしろ。なんじゃこりゃ
2021/03/21(日) 22:47:11.34ID:ut0JDDIv
>>901
だから考えてるスケールが全然違うっつーの
2021/03/22(月) 01:13:43.80ID:04BxTma4
具体的な話を出さないでキレられても困るよ
2021/03/22(月) 01:39:21.20ID:g4YfSh3E
Rust の実行ファイルが大きくなりがちなのは何でもかんでもスタティックリンクする文化であって、
そうしてでもうんざりするような (実行時の) 依存関係に悩まされたくないという話なので、
不要なもので肥大化しているわけじゃないよ。 本来必要なものがあるだけ。

もちろん制約の大きい組み込み環境でごく基本的なライブラリすら制約してまで
大きさを削ったら使い勝手は悪いだろうけど、
それは Rust に限った話でもない当たり前のことだし。

メモリが数キロバイトとかいうレベルだったら (少なくとも現時点では) Rust が不向きというのはそうかもしれない。
そんで特に Rust を使いたいというケースでもない。
2021/03/22(月) 02:21:57.65ID:gSVpx604
>>906
具体的に言語化できる能力あったらこんなとこで愚痴垂れてないでしょう
2021/03/22(月) 03:18:48.61ID:4PFilboR
Linuxのディストロだとなるべくダイナミックリンクにするようにしてると思うんだけど
Rust製ツールとその方針の相性悪い気がする
2021/03/22(月) 13:19:06.90ID:TItJ887g
Q. Rustの倒し方を教えて下さい

A. まずデータセンターを燃やします

フランスのデータセンターで火災…『Rust』に復元不可能なデータロストが発生するなど大規模被害に発展 | エンタメウィーク
https://ent.smt.docomo.ne.jp/article/8989583
2021/03/22(月) 14:05:31.64ID:b6jSgIhJ
Rustってなんか日本人的にわびさびっぽい名前でいいよな
2021/03/22(月) 14:14:36.76ID:TQ1DOP8h
ググラビリティがGoより低いと思ってる元凶な
2021/03/22(月) 14:52:55.38ID:g4YfSh3E
そこんところは golang とか rustlang とか書く風習が出来てるから
たいした問題ではないんだが、 C のことを clang とか書き始めるやつが出てきてクソッタレという感じ。
よそでどんな習慣が出来てもいいけど変な汚染するなよな〜〜という。
2021/03/22(月) 16:00:21.60ID:g8se3Ggw
LLVM ClangはふつうClangて書かない?
2021/03/22(月) 16:55:21.38ID:Y0cj97US
Clang は Clang のことなので
C のことを Clang っていわれると困るって話
2021/03/22(月) 17:14:35.17ID:g8se3Ggw
あ,なる.
2021/03/22(月) 18:00:28.80ID:RaSrXyKY
>>909
というよりその方針だとsoのバージョン非互換で問題が起きて大変なので
GoやRustなど最近の言語はダイナミックリンクを避けている。
2021/03/22(月) 18:02:24.77ID:PWQX5uRW
GCCもClangだし
2021/03/22(月) 20:15:31.61ID:gSVpx604
>>917
ディストロがビルドして配るバイナリの話だからバージョン非互換は関係ないのでは
非互換が問題になるならソースにパッチ当てられる訳だし
goも同じ問題があるというのはそうだけど
2021/03/22(月) 21:30:42.61ID:G3nK37aG
>>919
そもそも最近はディストロのパッケージ管理システムに乗りたくなくなっているのでは?いろいろなディストロのいろいろなバージョンに対してバイナリを提供すること自体が大変で。
Gentooやってると依存関係ミスっててコンパイルこけるとかよくある。
(そういう意味でもGoやRustはかなりコンパイルに失敗しづらくて安心感はある)
退化している感もあるけど、GitHubで全ディストロ対応のシングルバイナリ配るのが結局楽だった、という感じなのかも。
2021/03/22(月) 22:38:58.65ID:0BePobhO
>>918
え?
2021/03/22(月) 22:40:19.34ID:qQVVw1tm
場合によっては違うバージョンのライブラリが共存することもあるし
ファイル名のルールでどうにかしたりはすごく面倒

近頃はコンテナにまるごと突っ込むとか言った解決法も取れるが、
それなら全部スタティックリンクしたらええやんというのは
順当な方針だよな
2021/03/22(月) 22:41:18.91ID:iFQHROzx
パッケージのバージョン管理とかRustは最近のnpmばりによくできてるんじゃないの
知らんけど
2021/03/22(月) 22:42:28.95ID:qQVVw1tm
>>921
gcc コマンドの実態が clang の環境が
存在するのでそれを茶化したジョークだと思う
2021/03/22(月) 23:22:40.71ID:4PFilboR
Ruby, Python, Rとか言語独自のパッケージ管理システムもありつつ
同時にディストロのパッケージ管理システムにも有名ライブラリだけは乗ってたりして
なんか二重管理みたいな変な事になってる
2021/03/23(火) 01:05:05.52ID:G0iN/IIq
開発環境が用意するパッケージ管理は開発環境の管理だし
ディストリビューションの管理は実行環境の管理なんだけど、
ライブラリが実行環境なのか開発環境なのかは不可分な部分もあって単純に二分できんのよ。

C/C++ のライブラリのパッケージ管理が発展してないのは伝統的に
ディストリビューションのパッケージ管理に全力で乗っかる文化があったからで、
モダンな開発環境は分けようとしてかえってややこしくしているような気もする。
元々あった問題があぶりだされただけかもしれんけど。
2021/03/23(火) 01:20:30.89ID:27d1w4K5
まあlibcのバージョン違いで困った経験あると、スタティックリンクはやむ無しって思うけど。
2021/03/23(火) 02:36:10.01ID:yC2dAiwP
>>913
コンパイラをclangという名前にしてしまったAppleが馬鹿なだけ。
ライバルにMSのcl.exeというものが30年ほど前からあるだけでも
ややこしいのに。
2021/03/23(火) 09:53:23.27ID:KOWk2YN0
>>926
C/C++全盛の頃はコードを書く人と使う人が一致してることが多かったから問題なかった気がする。
自分の環境さえ正しくセットアップすればそれで問題ないという。
今みたいにGitHubでコード共有するのが当然って世界だと違う環境でビルドするのが困難ってのはきつい。
OSSのC++ライブラリを使おうとしたときに、作者と違うディストリビューション使ってる場合、ほぼ確実になんらかのトラブルにはまる印象だなぁ。
2021/03/23(火) 12:53:42.65ID:71b8io/J
てか低レイヤー依存のパッケージは言語パッケージ管理じゃ扱いづらいだろ。
2021/03/23(火) 15:23:13.29ID:G0iN/IIq
>>928
自分の開発環境に cl.exe があるのを見つけて
「あれ? Common Lisp なんか入れたっけ?」って思ったことがある。
2021/03/23(火) 16:03:34.41ID:p4kRzxCA
Rustと関係ない雑談はそろそろよそでやって下さいね
2021/03/23(火) 16:25:13.28ID:rdqm0ni7
次世代言語21 Go Nim Rust Swift Kotlin TypeScript
https://mevius.5ch.net/test/read.cgi/tech/1587276362/

あっちのスレの流れの中に投下するものがこっちに誤爆して話題が続いてるだけだぞ
2021/03/23(火) 20:22:26.82ID:1Ac3Y1Uh
>>918
???
2021/03/23(火) 22:26:53.30ID:97s02znq
>>934
>>924
レス数が900を超えています。1000を超えると表示できなくなるよ。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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