X



Rust part16

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2022/06/27(月) 08:17:03.45ID:gDlfKP6u
公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust

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

日本語の情報
https://rust-jp.rs/

※Rustを学びたい人はまず最初に公式のThe Bookを読むこと
https://doc.rust-lang.org/book/

※Rustを学ぶ際に犯しがちな12の過ち
https://dystroy.org/blog/how-not-to-learn-rust

※Rustのasyncについて知りたければ「async-book」は必読
https://rust-lang.github.io/async-book/

※次スレは原則>>980が立てること

前スレ
Rust part15
https://mevius.5ch.net/test/read.cgi/tech/1652347700/
0698デフォルトの名無しさん
垢版 |
2022/09/11(日) 12:51:18.94ID:6axTKkj4
>>693
>mutを付けずにletで宣言すると書き換わらない値として
>書き込めないメモリ領域(例えば.textセクション)に配置されたりしないのか?というのが心配な点です

しねーよ。
組み込みだろーがそれは変わらない。
letついて束縛変数といわれようが変数は変数。
0701デフォルトの名無しさん
垢版 |
2022/09/11(日) 13:55:35.90ID:VMVpvyTB
そっちは定数でconstだしそうなる
letはあくまでもimmutableな変数であり定数ではない
0703デフォルトの名無しさん
垢版 |
2022/09/11(日) 14:07:54.90ID:VMVpvyTB
どのように最適化されようが
constではなくlet x = ...ならば
let mut x = x; とムーブして書き換え可能
これは言語のレベルで保証される

そしてそのように使うならば最適化も無駄なことせずにtext segmentでなくdata segmentに置くだろう
0704デフォルトの名無しさん
垢版 |
2022/09/11(日) 14:40:44.81ID:ujBIW69o
CloneとCopyについて
let mut bitmap:[u32; LEN] = [0; LEN];
let mut bitmap:[ARGB32; LEN] = unsafe {core::intrinsics::transmute::<[u32; LEN], [ARGB32; LEN]>(bitmap)};

#[derive(Clone, Copy, Default)]

let mut bitmap:[ARGB32; 16] = [ARGB32::default(); LEN];
で読み書きを
bitmap[0].red = 0x80;
let x = bitmap[0].red;
bitmap[0].green = x;
としてみたけど出力された読み書き部分のコードは同じでした。もっとでかい構造体じゃないとムーブかコピーかの区別は出来ないのかな

>>696
マジか。Rustでもパディングの問題がつきまとうのか。でも
>Accessing unaligned fields directly with e.g. packed.unaligned is safe however.
って事は.redとかでアクセスする場合はコンパイラが良きに計らってくれるのでアクセス境界の問題は起きないって事かな?
画像データのバイトやビットの並びなんてすでに決まっていてプログラムはそれに合わせるしかないのが普通でしょうし
勝手にパディングされても困ります

実は並行してCでも書いているんだけど構造体のパディングの制御は処理系依存らしくて移植性を優先すると
データは整数の配列で持って論理演算とシフトで分解、構築するコードになってしまってます
0706デフォルトの名無しさん
垢版 |
2022/09/11(日) 15:13:19.03ID:/O1tQPyF
どの言語でも同じ
Rustでも&mutでtransmuteしてもendian依存は避けられないな
let mut x = 0x01020304_u32;
let a = unsafe { std::mem::transmute::<&mut u32, &mut [u8; 4]>(&mut x) };
a[1] = 7;
assert_eq!(x, 0x01020704);
とlittle endianでは7の位置はこうなる
0707デフォルトの名無しさん
垢版 |
2022/09/11(日) 18:54:24.82ID:gEyGQ7vE
このスレでよく出てくる μt ってなんなん?
音的に mut をそう書いてる異常者がいるだけかと思ってるんだけど、なにか別の意味を持った概念や機能だったりするの?
0709デフォルトの名無しさん
垢版 |
2022/09/11(日) 20:27:57.44ID:QYXgEc7E
>>708
そうなんだ。
0710デフォルトの名無しさん
垢版 |
2022/09/11(日) 20:45:42.63ID:hnVgjqVb
>>708
なるほど、ありがと。
異常者かと思って真面目に読む気が失せてたんだけど誤解だったか。
0712デフォルトの名無しさん
垢版 |
2022/09/11(日) 21:45:56.06ID:ujBIW69o
例えば
pixel.alpha = in[0].alpha;
pixel.red = in[0].red / 2;
pixel.green = in[0].green / 2;
pixel.blue = in[0].blue / 2;
out[0] = pixel;

red = 0xFF & (in[0] >> 16);
green = 0xFF & (in[0] >> 8);
blue = 0xFF & in[0];
red /= 2;
green /= 2;
blue /= 2;
pixel = 0xFF000000 & in[0];
pixel |= red << 16;
pixel |= green << 8;
pixel |= blue;
out[0] = pixel;
ではだいぶ見やすさが違うような
0713デフォルトの名無しさん
垢版 |
2022/09/11(日) 21:47:41.04ID:3JeGkSLy
>>704
パディングというかメモリアクセス時のアラインメントについてはCPUの仕様だから言語関係ないよ
x86がunalignedなアクセスについてゆるゆるだから忘れられがちだけど雑に書いたプログラムをarmで動かしたりするとクラッシュする

今回はu8へのアクセスだからさすがにパディング入れられることはないと思うけどね
0714デフォルトの名無しさん
垢版 |
2022/09/11(日) 21:50:14.96ID:3JeGkSLy
>>712
シフト処理など隠蔽してくれるアクセサメソッド用意したらだいたい同じような読みやすさになるのでは
0715デフォルトの名無しさん
垢版 |
2022/09/11(日) 23:45:21.14ID:ujBIW69o
Rust固有じゃないけど移植性を改善する方法に1バイトずつ処理するという手があるけどこの実装は、今時の32bitや64bit環境で
相応にデバフが入るんですよね。MSVCでも8bitロード×8を64bitロード×1に最適化してくれなかったし

>>713
そこを抽象化するのが処理系の仕事では。いまだに構造体でパース・・・みたいなコードを見かけるし

>>714
読みやすさは改善しても今度は速度にデバフが入るような。こういうケースでアクセサメソッドを利用したとして
全てインライン展開&最適化されますかね?一つでもコールやブランチが残ったら速度が結構落ちるだろうし
0716デフォルトの名無しさん
垢版 |
2022/09/11(日) 23:59:30.49ID:/O1tQPyF
>>707
色んなブラウザで見てみたけど
&mut (分けて書くと & mut )が μt と表示されるのはバグってるchmateだけっぽい
0718デフォルトの名無しさん
垢版 |
2022/09/12(月) 01:00:12.66ID:JkhjRZ+U
>>716
ほー、chmateはワザとunescapeしてるのか?
5chがUnicode文字表示できるようになったんだし、そういうのはもう余計なお世話だな
0719デフォルトの名無しさん
垢版 |
2022/09/12(月) 01:13:39.26ID:D0TZxDhn
HTML等の文字参照を処理する場合でも
μt (= & m u ; t )が μt となるのは正しいけど
&mut (= & m u t )が μt となるの間違いだからこれはバグと思われる
0721デフォルトの名無しさん
垢版 |
2022/09/12(月) 06:45:23.29ID:hsi1XO0i
文字列参照に & mut なんてないからテキトーに解釈してるんでしょ
良し悪しは別にして html を扱うブラウザではそれほど珍しくはない
個人的には余計な事すんなとは思う
0722デフォルトの名無しさん
垢版 |
2022/09/12(月) 07:14:45.53ID:tyJETXG8
これはmateのバグです
& x y z ; とセミコロンで終わる場合のみその部分を文字参照として解釈するのが正しいです
0724デフォルトの名無しさん
垢版 |
2022/09/12(月) 07:34:32.06ID:o/NFQNbK
& amp ; amp; を空白なしで書き込んだら & に変換されてしまった
実体参照複数回展開しているのかな
&amp;
0725デフォルトの名無しさん
垢版 |
2022/09/12(月) 08:15:16.27ID:NGx/fsjU
ライブラリとかのコンポーネントの一部を作っているときに入出力だけ不定値として扱う方法ってありませんかね
ガワ作って入出力を完全に外部に出さないとコードがみんな消えてしまうのは不便です
最適化レベルによる変化とか全然確認出来ないし
0726デフォルトの名無しさん
垢版 |
2022/09/12(月) 08:36:58.55ID:tyJETXG8
ちょっと意味がわからない
こうなるはずだから困ることはないと思うけど

・最適化によってRustが定めている意味が変わることはない
・pub宣言しているものは中で呼ばれていなくても単体コンパイルで消えることはない
・pub宣言されていないものは中で呼ばれていなければ今後も誰からも呼ばれないためwarningが出て消える
0728デフォルトの名無しさん
垢版 |
2022/09/12(月) 12:04:36.56ID:tyJETXG8
その場合でも実際に使う型々でtestを書くだろうからcargo testで確認できるでしょ
0729デフォルトの名無しさん
垢版 |
2022/09/12(月) 12:46:09.29ID:SjJDv8F6
>>726
ありゃうちの環境の問題か。pub付けただけじゃ関数丸ごとなかったことにされる
pub extern "C"でRust外の入出力にしてようやく消えなくなる
もうちょっと調べてみる
0731デフォルトの名無しさん
垢版 |
2022/09/12(月) 19:11:31.91ID:2zIjStdY
>>730
変更してみた。staticlibだとpub付けても消える。rlibなら消えないようだ
とりあえずrlibにしておいてある程度形になってきたら変更すればいいか
コード自体はどっちでも大差ないだろうし
0732デフォルトの名無しさん
垢版 |
2022/09/18(日) 01:08:32.32ID:g4sMxKuf
[u32; LEN]と[ARGB32; LEN] の件、アラインメントが違うからtransmuteの時点でUBだけど
0733デフォルトの名無しさん
垢版 |
2022/09/19(月) 02:33:25.46ID:HMAR4dxa
Tauriで動画プレーヤー的なのを作るサンプルってどっかにある?
ただ再生するデータは既存のmp4ファイルなどではなくRustプログラムから渡したい
あと再生、停止、コマ送り、シークなどの基本的な機能は実装したい
0734デフォルトの名無しさん
垢版 |
2022/09/19(月) 07:48:35.44ID:BbpMxDy4
TauriってWebアプリのサーバーサイドがRustで一体型プログラムになっているだけだろ?
そして既存のWeb技術を活かせるのがTauriの利点だろ?
そうならば例えばhls.jsなど既存の好みの動画配信再生フレームワークを使えばいいだけじゃないか?
Webサーバーサイドやったことあるならばフロントエンドからファイルに見えているものは本物のファイルである必要はなくサーバーサイドが算出していれば十分だろ?
0735デフォルトの名無しさん
垢版 |
2022/09/19(月) 12:27:41.81ID:HMAR4dxa
>>734
>HLS
ちょっと調べてみたけどHLSでいわゆるRAWデータを再生出来るという情報は見つけられていない
特にビデオが未圧縮データを扱えそうにない。オーディオは未圧縮FLACでいけるかもしれないけど
再生したいのがWebブラウザが対応していないデータなのでどうしようか考え中

ビデオはBMPのぱらぱら漫画でオーディオはHLSで未圧縮FLACとか?なんか無駄に実装量が増えるけど
0736デフォルトの名無しさん
垢版 |
2022/09/19(月) 13:11:44.57ID:PTk7Q+2G
その手のやつでオーバーヘッド減らすならOS毎にネイティブ実装するしかなくない?
0737デフォルトの名無しさん
垢版 |
2022/09/19(月) 18:38:49.00ID:EybjBREq
なんとかtauri使うにしてもJSやらWASMやらで動画レンダリングするようなもの作らないとだめそう
0738デフォルトの名無しさん
垢版 |
2022/09/19(月) 18:45:15.20ID:npVSxydm
実装を追加させない方法ってありますか?
別個に渡されたふたつの型が同じであるという制約を付けたいという目的で
以下のようなトレイト Same を定義した場合、実装を追加できてしまうと破綻してしまうので、
なんらかの方法で制限できるだろうかという疑問です。

pub trait Same<T> {}
impl<T> Same<T> for T {}

// 使用例
pub fn foo<T, U>(x: T, y: U)
where
T: Same<U>,
{
}

ちなみに目的を上述しましたけども実際には目的というよりは題材です。
つまり具体的な用途は考えておらず、質問はあくまでも「実装させない方法があるかどうか」です。
0741デフォルトの名無しさん
垢版 |
2022/09/19(月) 21:29:04.18ID:Elo9mBmF
ふたつの型が同じという制約を付けたいなら
TとUじゃなくTとTにすればいいじゃんか
0742デフォルトの名無しさん
垢版 |
2022/09/19(月) 21:34:13.52ID:jWPeXdq1
>>738
達成したいことが特にないらしいからなんとも言えないけど enum を使っても近いことはできるんじゃないかな。

enum Same{SameA(型A),SameB(型B)}

みたいにしてやれば、Same 経由で扱う限り実装は増やせないぞ。
0743デフォルトの名無しさん
垢版 |
2022/09/19(月) 22:48:26.11ID:npVSxydm
>>739-740
実装を追加させないテクニックのひとつとして有用ですし紹介はありがたいです。
しかしそれだと Sealed を実装した型だけにしか使えず、 >>738 で示したような汎用的に型を比較するトレイトには使えないですよね。
この Same のように機能するトレイトに実装を追加させないというのは前提と考えて欲しいです。

>>741
そういうレスが付くことを避けたいから最後の文をつけたつもりなんですが……。
Rust の初心者として様々な言語機能を理解したいという立場で疑問に思った部分を抜き出し、
説明のために前提条件を設定したのであって、前提条件の部分自体は解決したい課題ではないです。

いわゆるXY問題というものの存在は承知しておりますので
解決したい大元の問題を示さないというのがモヤモヤするだろうなというのはわかります。
わかりますが、大元の問題というものはありません。
この範囲で完結するパズルだと思ってください。
0745デフォルトの名無しさん
垢版 |
2022/09/20(火) 00:42:08.53ID:FykVNAq+
impl Foo for Tが存在する時点で他の型にFoo実装しようとするとconflictしなかったっけ
0749738
垢版 |
2022/09/20(火) 01:17:29.77ID:w2qVrruo
なるほど、 C++ と違って特殊化にならないからより狭い範囲の実装は追加できないんですね。
&T とか &mut T とかも先に実装しておけば追加の余地をなくせると。
&T とか &mut T とか以外にどういうのがありえますかね?
0751738
垢版 |
2022/09/20(火) 01:53:09.66ID:w2qVrruo
>>750
ありがとうございます。
言われてみれば当然のような感じですがまだまだ私は Rust らしい考え方が出来ていないようです。
0754デフォルトの名無しさん
垢版 |
2022/09/20(火) 20:46:56.46ID:Di+jgu/u
今のところデバドラだけという話だけど
基幹部分の新実装をRustで作りましたという
人が絶対現れるからそのときどうなるだろ
0756デフォルトの名無しさん
垢版 |
2022/09/22(木) 02:33:16.78ID:OUmiFnaH
MS AzureのCTOが「新しいプロジェクトでC/C++使うのはやめて
非GC言語が必要な状況ではRustを使うべき時だ」ってツイートしてるけど
Visual StudioでもRustが最初からパッケージングされてるようになるのかな
0758デフォルトの名無しさん
垢版 |
2022/09/22(木) 13:36:58.59ID:V4zanZlp
>>756
MSがRustの開発環境に投資するならVSCodeのエクステンションじゃない?
いまさらVSに対応言語を追加する気はないでしょ
どう考えてもWindowsユーザーは少ないだろうし
0759デフォルトの名無しさん
垢版 |
2022/09/22(木) 19:38:28.16ID:VGEMfVQX
>>756
マーク・ルシノビッチ氏、Microsoft AzureのCTOなのか。
インサイドWindowsにはお世話になったわ。
0760デフォルトの名無しさん
垢版 |
2022/09/23(金) 05:18:56.24ID:I8UIrhRk
Iteratorに対するIntoIteratorのように
Futureに対するIntoFutureということか
しかも.awaitに対して自動適用だからもっと効果が大きいか
非同期を返すビルダーに対してFutureを返させるためのビルド完了指示メソッド呼び出しが不要となる
0761デフォルトの名無しさん
垢版 |
2022/09/23(金) 08:24:08.00ID:G8O+P73a
Rust analyzerが優秀過ぎてMSが入る余地なさそう
PythonがMS Storeから落とせるみたいにインストールが楽になるとかならありそう
VSに導入されたらそれはそれで面白いんだけど.Net言語との連携が強化されないと旨味がないな
0763デフォルトの名無しさん
垢版 |
2022/09/23(金) 10:08:58.99ID:QyFSmn0+
既存ライブラリがそのまま呼べるならお試しで部分的に新言語導入してみようとなる可能性もあるので意味はある
0765デフォルトの名無しさん
垢版 |
2022/09/23(金) 12:31:56.94ID:aakQSAhx
>>758
VSCodeの方が対応は早いかもだが、VSに追加する気がないことは無いんじゃないかな
0766デフォルトの名無しさん
垢版 |
2022/09/23(金) 17:48:32.43ID:z6wpDrU6
>>762
書き方悪かったわ
Rustで作った何かをC#とかから簡単に呼べるといいねって意味だった

GoのCGoみたいな仕様だったら色んな意味で面白いと思う
0767デフォルトの名無しさん
垢版 |
2022/09/23(金) 18:02:01.54ID:bhLcJIv7
rust_analyzerの話題ついでに教えて欲しいのですが、保存なしで構文チェック等してくれるようにならないものなのですか?
編集を破棄して保存前の状態にしたい時があるので、できれば自動で保存したくないのです
Vim系プラグイン等を入れていれば無限に戻せるのかもしれないものの、Vimが使えない身としては困ってしまいます
0768デフォルトの名無しさん
垢版 |
2022/09/23(金) 18:02:58.63ID:exFn1ITS
>>766
ああそれならありだな
まあ今でもC/C++とかで作ったdllなりをC#から呼び出せるから同じような感じでできるんじゃないかな
0770デフォルトの名無しさん
垢版 |
2022/09/23(金) 18:05:33.15ID:5/jqA4bf
C#も.Netも全く興味ないので知らないが
PythonでもJavaScriptでも何でもRustで作ったライブラリなどを簡単に呼び出すことができる仕組みがそれぞれ整えられている
既存のものの置き換えは無意味だが新たに作られるものはRustで書くことが増えている
0771デフォルトの名無しさん
垢版 |
2022/09/23(金) 21:26:00.89ID:Oi43IjEf
repr(C)でCのフリしたRustじゃなくて、俺はありのままのRustが動いている世界線が見たいよ
0772デフォルトの名無しさん
垢版 |
2022/09/23(金) 21:26:44.38ID:bhLcJIv7
>>769
でも、破棄ならコミット後の状態にも戻せるぜ?
0774デフォルトの名無しさん
垢版 |
2022/09/23(金) 21:53:19.36ID:wlVyCNVq
>>773
そんなことすべきでない
自由にRust コンパイラによる最適化の余地を与える現在の方針がベスト
外部に公開しなきゃいけない時に外部に公開する部分だけを#[repr(C)]や#[wasm_bindgen]など指定すればよい
0776デフォルトの名無しさん
垢版 |
2022/09/23(金) 23:55:09.24ID:9eaiNZZz
なるほど
0777デフォルトの名無しさん
垢版 |
2022/09/23(金) 23:58:10.15ID:SxK8BSHj
対C/C++はそこまで必要ならそこもRustで書いちゃうから何ら問題はない
他の言語ではそれぞれもっと大きなオーバヘッドを持っているので誤差に収まり問題にならない
0781デフォルトの名無しさん
垢版 |
2022/09/24(土) 03:05:40.90ID:ugWjDAH5
Rustだけで閉じていればpubであっても自由に最適化されるからpubかどうかは関係ないでしょう
結局Rustの外に公開する部分だけの話に限られるからそこだけ相手毎に応じる現行の方式のままで構わないでしょう
0782デフォルトの名無しさん
垢版 |
2022/09/24(土) 08:50:49.84ID:pfcr5AFZ
C++やRustはABI決まってないのにC言語は何故ほぼ決まってるの?
0784デフォルトの名無しさん
垢版 |
2022/09/24(土) 09:15:16.80ID:WR9fIR0K
ぶっちゃけあらゆるOSがC言語で書かれているあたりCの呪縛から逃れられないよ
0785デフォルトの名無しさん
垢版 |
2022/09/24(土) 09:26:53.29ID:rPP8Qygy
>>782
名前をプログラマが決められるからだよ
0786デフォルトの名無しさん
垢版 |
2022/09/24(土) 09:44:37.12ID:BCuennz9
>>782
むしろCは決まってるの?
決まってるわけじゃなくて単純だし歴史も長いから結果的にほぼ変わらない&その現状に合わせて変わらない変更をしてるだけみたいなことをgccかなんかの中の人の記事で読んだ気がするんだけどデマなんかな
0787はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/09/24(土) 10:38:04.73ID:2HWwrIyG
近年になって作られた高速リンカ mold の作者の話でも、
文書化されていない暗黙の仕様に何度もぶつかったみたいなことだったはず。

C 以外の言語 (処理系) もツールチェインは共通のものを使っている場合は結構あるし
どれがどの挙動に依存しているかようわからんので安易に整理するわけにもいかず、
結局のところは C コンパイラとは長年に渡って協調してきたから細かい問題点が
解決されているというだけで、そんなにカッチリした仕様が確立しているわけではないと思う。
0788デフォルトの名無しさん
垢版 |
2022/09/24(土) 11:00:33.46ID:DaB/WDgt
CはCPUベンダーが呼び出し規約を文書化してるよ
moldの話はELFやリンクに関連する話では
確かにABIのうちではあるけど言語ごとに異なる仕様になるようなものではないと思う
0789デフォルトの名無しさん
垢版 |
2022/09/24(土) 11:33:36.58ID:FWSMvJVe
AMD64の呼び出し規約をググるだけで2種類くらい出てくるのにコイツは何を言っているんだ?

>>786
呼び出し規約どころか構造体のレイアウトすら実装依存の部分があるよ
0790デフォルトの名無しさん
垢版 |
2022/09/24(土) 13:14:15.81ID:DaB/WDgt
>>789
そこでいう実装依存ってプラットフォームごとの差違のこと?
それとも同じプラットフォームでもツールチェイン依存でレイアウトが変わりうる場合があるの?
0791デフォルトの名無しさん
垢版 |
2022/09/24(土) 14:25:21.27ID:PoJJisuz
cdeclとかstdcallみたいなやつ?
0792はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/09/24(土) 16:06:51.67ID:2HWwrIyG
>>791
その段階ではあまり曖昧さはない。
リンクする前の状態はリンクに必要な情報一式が入ってるはずなんだけど、
その扱いが言語や処理系をまたぐとややこしくなることもあるってこと。
アーキテクチャによって扱いを変える必要がある場合もあるし。
0793デフォルトの名無しさん
垢版 |
2022/09/24(土) 16:24:43.84ID:PoJJisuz
>>792
コンパイラがリンカに渡す情報って統一規格があるの?
0795デフォルトの名無しさん
垢版 |
2022/09/24(土) 17:10:20.79ID:GMpouZpq
じゃあ、そのオブジェクト・ファイル形式の仕様に問題があるってことでは?
0796はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/09/24(土) 17:36:26.33ID:2HWwrIyG
>>795
ELF に置き換わるときにオブジェクトファイルの仕様の曖昧さはほとんど解消されていると思う。
ただ現実には全てが正しく実装されているわけではなく、
場合によっては正しかったほうを間違った側にあわさざるを得ないとかいう場合もある。
仕様がどうこう言ったって、実装が間違っていたって現実にもう動いているものがあるのなら変えられんのよ。
そういう歴史的負債がどんどん積み重なってわけわからんようになる。
0798デフォルトの名無しさん
垢版 |
2022/09/24(土) 22:13:22.85ID:DaB/WDgt
元々の他言語からrust呼び出す話ならそのレベルの話は関係ないでしょ
LLVMがよしなにやってくれるのでは
■ このスレッドは過去ログ倉庫に格納されています

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