Rust part16
■ このスレッドは過去ログ倉庫に格納されています
>>693 >mutを付けずにletで宣言すると書き換わらない値として >書き込めないメモリ領域(例えば.textセクション)に配置されたりしないのか?というのが心配な点です しねーよ。 組み込みだろーがそれは変わらない。 letついて束縛変数といわれようが変数は変数。 今はしないけどそうなるような最適化は禁止されてないのでは コンパイル時に値が確定してないとtextセクションに書けないでしょ そっちは定数でconstだしそうなる letはあくまでもimmutableな変数であり定数ではない コンパイル時に確定するような式なら最適化でありえるんじゃないの? どのように最適化されようが constではなくlet x = ...ならば let mut x = x; とムーブして書き換え可能 これは言語のレベルで保証される そしてそのように使うならば最適化も無駄なことせずにtext segmentでなくdata segmentに置くだろう 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でも書いているんだけど構造体のパディングの制御は処理系依存らしくて移植性を優先すると データは整数の配列で持って論理演算とシフトで分解、構築するコードになってしまってます どの言語でも同じ 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の位置はこうなる このスレでよく出てくる μt ってなんなん? 音的に mut をそう書いてる異常者がいるだけかと思ってるんだけど、なにか別の意味を持った概念や機能だったりするの? 自分も思ったけどブラウザによっては & mut がそうなるみたい >>708 なるほど、ありがと。 異常者かと思って真面目に読む気が失せてたんだけど誤解だったか。 例えば 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; ではだいぶ見やすさが違うような >>704 パディングというかメモリアクセス時のアラインメントについてはCPUの仕様だから言語関係ないよ x86がunalignedなアクセスについてゆるゆるだから忘れられがちだけど雑に書いたプログラムをarmで動かしたりするとクラッシュする 今回はu8へのアクセスだからさすがにパディング入れられることはないと思うけどね >>712 シフト処理など隠蔽してくれるアクセサメソッド用意したらだいたい同じような読みやすさになるのでは Rust固有じゃないけど移植性を改善する方法に1バイトずつ処理するという手があるけどこの実装は、今時の32bitや64bit環境で 相応にデバフが入るんですよね。MSVCでも8bitロード×8を64bitロード×1に最適化してくれなかったし >>713 そこを抽象化するのが処理系の仕事では。いまだに構造体でパース・・・みたいなコードを見かけるし >>714 読みやすさは改善しても今度は速度にデバフが入るような。こういうケースでアクセサメソッドを利用したとして 全てインライン展開&最適化されますかね?一つでもコールやブランチが残ったら速度が結構落ちるだろうし >>707 色んなブラウザで見てみたけど &mut (分けて書くと & mut )が μt と表示されるのはバグってるchmateだけっぽい >>716 ほー、chmateはワザとunescapeしてるのか? 5chがUnicode文字表示できるようになったんだし、そういうのはもう余計なお世話だな HTML等の文字参照を処理する場合でも μt (= & m u ; t )が μt となるのは正しいけど &mut (= & m u t )が μt となるの間違いだからこれはバグと思われる 文字列参照に & mut なんてないからテキトーに解釈してるんでしょ 良し悪しは別にして html を扱うブラウザではそれほど珍しくはない 個人的には余計な事すんなとは思う これはmateのバグです & x y z ; とセミコロンで終わる場合のみその部分を文字参照として解釈するのが正しいです & amp ; amp; を空白なしで書き込んだら & に変換されてしまった 実体参照複数回展開しているのかな & ライブラリとかのコンポーネントの一部を作っているときに入出力だけ不定値として扱う方法ってありませんかね ガワ作って入出力を完全に外部に出さないとコードがみんな消えてしまうのは不便です 最適化レベルによる変化とか全然確認出来ないし ちょっと意味がわからない こうなるはずだから困ることはないと思うけど ・最適化によってRustが定めている意味が変わることはない ・pub宣言しているものは中で呼ばれていなくても単体コンパイルで消えることはない ・pub宣言されていないものは中で呼ばれていなければ今後も誰からも呼ばれないためwarningが出て消える genericな関数だと呼び出し元がないとコード生成されないとか? その場合でも実際に使う型々でtestを書くだろうからcargo testで確認できるでしょ >>726 ありゃうちの環境の問題か。pub付けただけじゃ関数丸ごとなかったことにされる pub extern "C"でRust外の入出力にしてようやく消えなくなる もうちょっと調べてみる >>729 ちなみにターゲットはbinと(r)libのどっち? binならpubでも消えるかも >>730 変更してみた。staticlibだとpub付けても消える。rlibなら消えないようだ とりあえずrlibにしておいてある程度形になってきたら変更すればいいか コード自体はどっちでも大差ないだろうし [u32; LEN]と[ARGB32; LEN] の件、アラインメントが違うからtransmuteの時点でUBだけど Tauriで動画プレーヤー的なのを作るサンプルってどっかにある? ただ再生するデータは既存のmp4ファイルなどではなくRustプログラムから渡したい あと再生、停止、コマ送り、シークなどの基本的な機能は実装したい TauriってWebアプリのサーバーサイドがRustで一体型プログラムになっているだけだろ? そして既存のWeb技術を活かせるのがTauriの利点だろ? そうならば例えばhls.jsなど既存の好みの動画配信再生フレームワークを使えばいいだけじゃないか? Webサーバーサイドやったことあるならばフロントエンドからファイルに見えているものは本物のファイルである必要はなくサーバーサイドが算出していれば十分だろ? >>734 >HLS ちょっと調べてみたけどHLSでいわゆるRAWデータを再生出来るという情報は見つけられていない 特にビデオが未圧縮データを扱えそうにない。オーディオは未圧縮FLACでいけるかもしれないけど 再生したいのがWebブラウザが対応していないデータなのでどうしようか考え中 ビデオはBMPのぱらぱら漫画でオーディオはHLSで未圧縮FLACとか?なんか無駄に実装量が増えるけど その手のやつでオーバーヘッド減らすならOS毎にネイティブ実装するしかなくない? なんとかtauri使うにしてもJSやらWASMやらで動画レンダリングするようなもの作らないとだめそう 実装を追加させない方法ってありますか? 別個に渡されたふたつの型が同じであるという制約を付けたいという目的で 以下のようなトレイト Same を定義した場合、実装を追加できてしまうと破綻してしまうので、 なんらかの方法で制限できるだろうかという疑問です。 pub trait Same<T> {} impl<T> Same<T> for T {} // 使用例 pub fn foo<T, U>(x: T, y: U) where T: Same<U>, { } ちなみに目的を上述しましたけども実際には目的というよりは題材です。 つまり具体的な用途は考えておらず、質問はあくまでも「実装させない方法があるかどうか」です。 trait Sealed {} pub trait Same<T>: Sealed {} ふたつの型が同じという制約を付けたいなら TとUじゃなくTとTにすればいいじゃんか >>738 達成したいことが特にないらしいからなんとも言えないけど enum を使っても近いことはできるんじゃないかな。 enum Same{SameA(型A),SameB(型B)} みたいにしてやれば、Same 経由で扱う限り実装は増やせないぞ。 >>739-740 実装を追加させないテクニックのひとつとして有用ですし紹介はありがたいです。 しかしそれだと Sealed を実装した型だけにしか使えず、 >>738 で示したような汎用的に型を比較するトレイトには使えないですよね。 この Same のように機能するトレイトに実装を追加させないというのは前提と考えて欲しいです。 >>741 そういうレスが付くことを避けたいから最後の文をつけたつもりなんですが……。 Rust の初心者として様々な言語機能を理解したいという立場で疑問に思った部分を抜き出し、 説明のために前提条件を設定したのであって、前提条件の部分自体は解決したい課題ではないです。 いわゆるXY問題というものの存在は承知しておりますので 解決したい大元の問題を示さないというのがモヤモヤするだろうなというのはわかります。 わかりますが、大元の問題というものはありません。 この範囲で完結するパズルだと思ってください。 impl Foo for Tが存在する時点で他の型にFoo実装しようとするとconflictしなかったっけ fundamentalな型に一通り実装しておけば良さそう fundamental云々はcoherent ruleの話でconflictとは関係なかったわ なるほど、 C++ と違って特殊化にならないからより狭い範囲の実装は追加できないんですね。 &T とか &mut T とかも先に実装しておけば追加の余地をなくせると。 &T とか &mut T とか以外にどういうのがありえますかね? >>750 ありがとうございます。 言われてみれば当然のような感じですがまだまだ私は Rust らしい考え方が出来ていないようです。 今のところデバドラだけという話だけど 基幹部分の新実装をRustで作りましたという 人が絶対現れるからそのときどうなるだろ 誰もvoldemort typeの名を呼ぼうとしない MS AzureのCTOが「新しいプロジェクトでC/C++使うのはやめて 非GC言語が必要な状況ではRustを使うべき時だ」ってツイートしてるけど Visual StudioでもRustが最初からパッケージングされてるようになるのかな https://www.publickey1.jp/blog/22/cloudflarenginxrusthttppingoracdncpu31.html Cloudflare、NGINXに代えて自社開発のRust製HTTPプロキシ「Pingora」をグローバルCDNに採用。性能向上しつつCPUとメモリ消費を3分の1に >>756 MSがRustの開発環境に投資するならVSCodeのエクステンションじゃない? いまさらVSに対応言語を追加する気はないでしょ どう考えてもWindowsユーザーは少ないだろうし >>756 マーク・ルシノビッチ氏、Microsoft AzureのCTOなのか。 インサイドWindowsにはお世話になったわ。 Iteratorに対するIntoIteratorのように Futureに対するIntoFutureということか しかも.awaitに対して自動適用だからもっと効果が大きいか 非同期を返すビルダーに対してFutureを返させるためのビルド完了指示メソッド呼び出しが不要となる Rust analyzerが優秀過ぎてMSが入る余地なさそう PythonがMS Storeから落とせるみたいにインストールが楽になるとかならありそう VSに導入されたらそれはそれで面白いんだけど.Net言語との連携が強化されないと旨味がないな 既存ライブラリがそのまま呼べるならお試しで部分的に新言語導入してみようとなる可能性もあるので意味はある >>758 VSCodeの方が対応は早いかもだが、VSに追加する気がないことは無いんじゃないかな >>762 書き方悪かったわ Rustで作った何かをC#とかから簡単に呼べるといいねって意味だった GoのCGoみたいな仕様だったら色んな意味で面白いと思う rust_analyzerの話題ついでに教えて欲しいのですが、保存なしで構文チェック等してくれるようにならないものなのですか? 編集を破棄して保存前の状態にしたい時があるので、できれば自動で保存したくないのです Vim系プラグイン等を入れていれば無限に戻せるのかもしれないものの、Vimが使えない身としては困ってしまいます >>766 ああそれならありだな まあ今でもC/C++とかで作ったdllなりをC#から呼び出せるから同じような感じでできるんじゃないかな C#も.Netも全く興味ないので知らないが PythonでもJavaScriptでも何でもRustで作ったライブラリなどを簡単に呼び出すことができる仕組みがそれぞれ整えられている 既存のものの置き換えは無意味だが新たに作られるものはRustで書くことが増えている repr(C)でCのフリしたRustじゃなくて、俺はありのままのRustが動いている世界線が見たいよ >>769 でも、破棄ならコミット後の状態にも戻せるぜ? >>771 ABI安定化するまではFFIでextern "C"は避けられないよ >>773 そんなことすべきでない 自由にRust コンパイラによる最適化の余地を与える現在の方針がベスト 外部に公開しなきゃいけない時に外部に公開する部分だけを#[repr(C)]や#[wasm_bindgen]など指定すればよい 双方でマーシャル/アンマーシャルが必要になって無駄だよね 対C/C++はそこまで必要ならそこもRustで書いちゃうから何ら問題はない 他の言語ではそれぞれもっと大きなオーバヘッドを持っているので誤差に収まり問題にならない >>774 pubなitemのABIに最適化関係ある? なんかと混同してない? もしかして repr(Rust) のこと言ってる? Rustだけで閉じていればpubであっても自由に最適化されるからpubかどうかは関係ないでしょう 結局Rustの外に公開する部分だけの話に限られるからそこだけ相手毎に応じる現行の方式のままで構わないでしょう C++やRustはABI決まってないのにC言語は何故ほぼ決まってるの? >>781 dylibの場合pubは大いに関係あるよ ぶっちゃけあらゆるOSがC言語で書かれているあたりCの呪縛から逃れられないよ >>782 むしろCは決まってるの? 決まってるわけじゃなくて単純だし歴史も長いから結果的にほぼ変わらない&その現状に合わせて変わらない変更をしてるだけみたいなことをgccかなんかの中の人の記事で読んだ気がするんだけどデマなんかな 近年になって作られた高速リンカ mold の作者の話でも、 文書化されていない暗黙の仕様に何度もぶつかったみたいなことだったはず。 C 以外の言語 (処理系) もツールチェインは共通のものを使っている場合は結構あるし どれがどの挙動に依存しているかようわからんので安易に整理するわけにもいかず、 結局のところは C コンパイラとは長年に渡って協調してきたから細かい問題点が 解決されているというだけで、そんなにカッチリした仕様が確立しているわけではないと思う。 CはCPUベンダーが呼び出し規約を文書化してるよ moldの話はELFやリンクに関連する話では 確かにABIのうちではあるけど言語ごとに異なる仕様になるようなものではないと思う AMD64の呼び出し規約をググるだけで2種類くらい出てくるのにコイツは何を言っているんだ? >>786 呼び出し規約どころか構造体のレイアウトすら実装依存の部分があるよ >>789 そこでいう実装依存ってプラットフォームごとの差違のこと? それとも同じプラットフォームでもツールチェイン依存でレイアウトが変わりうる場合があるの? >>791 その段階ではあまり曖昧さはない。 リンクする前の状態はリンクに必要な情報一式が入ってるはずなんだけど、 その扱いが言語や処理系をまたぐとややこしくなることもあるってこと。 アーキテクチャによって扱いを変える必要がある場合もあるし。 >>792 コンパイラがリンカに渡す情報って統一規格があるの? >>793 別に統一されちゃいないがELFとかPEとか じゃあ、そのオブジェクト・ファイル形式の仕様に問題があるってことでは? >>795 ELF に置き換わるときにオブジェクトファイルの仕様の曖昧さはほとんど解消されていると思う。 ただ現実には全てが正しく実装されているわけではなく、 場合によっては正しかったほうを間違った側にあわさざるを得ないとかいう場合もある。 仕様がどうこう言ったって、実装が間違っていたって現実にもう動いているものがあるのなら変えられんのよ。 そういう歴史的負債がどんどん積み重なってわけわからんようになる。 元々の他言語からrust呼び出す話ならそのレベルの話は関係ないでしょ LLVMがよしなにやってくれるのでは ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる