https://keens.github.io/blog/2020/06/20/shadoingunoureshisa/
Rust
プログラミング言語
プログラミング言語
Ferris SaysはRustのマスコットであるFerrisがAAで話すコマンド
https://github.com/rust-lang/ferris-says
__________________________
< Hello fellow Rustaceans! >
--------------------------
\
\
_~^~^~_
\) / o o \ (/
'_ - _'
/ '-----' \
pandasより速いらしい
wasmerでRustをコンパイルしてwasmerで動かす!????!?
さすがにwasmerのpackageにRustのコンパイラーは無いな。
もしあったらブラウザ上でRustのコンパイルができてしまうところだった。
wasmerでbashを動かしてその上でRustをコンパイル?!?!?!???
いや、bashはあるけどcurlが入ってないから無理だな。
探したらGithub Issue(『Compilation to WASM?』)が立っているのを見つけた。考えることは同じだな。
Pythonは結構早くからwasmで動くようになってるから、Rustもそんなに時間がかからんのじゃなかろうか。
winget install Rustlang.Rustup, Microsoft.VisualStudio.2022.BuildTools
https://forest.watch.impress.co.jp/docs/review/1542623.html
goから越境してrustやるの嫌じゃな~~~。
そもそも、wgpuのレポジトリ見てても動かし方がよくわからん。
なんとなくIssueをcompute shader
で検索して眺めてみる。すでにIssueが出てれば幸甚。
なかったわ。一般的には巨大シェーダーを動かす動機がないらしい。
wgpuのレポジトリにExampleを発見したので動かしてみる。
wgpuでboidsが動いた。やったねたえちゃん!
巨大シェーダー実証の元としてhello-computeが良さそう。コードが簡単。見覚えもある。
サクッとシェーダーを書き換えてみたら動いた。いいぞ。
条件分岐が1万行の巨大シェーダーを試してみた結果、wgpuにおいてはそんなに時間がかからない。500msとかそんなもん。じゃあRustでwgpu使って遺伝的プログラミングすればええやんという判断が浮かび上がってくるが、Rust難しすぎてあれなのであれ。覚悟を決めるのに1週間ぐらいかかるやつ。
とはいえ現状は wgpu → wgpu-native → go-webgpu という依存をしており、wgpuを直接ぶったたくよりも隔靴搔痒となる。依存しているコードがどこでどう変わるかもわからない。wgpuはブラウザでも使われているらしいので、多分大丈夫だろう。
本丸の遺伝的プログラミングのコードは2000行程度なので、1週間もあれば行ける気がする。Rustを理解できれば。
その前にgo-webgpuをアップデートすべく、go get -u
を叩く。よし、最新版でも直ってない。wgpuに乗り換えだ。
遺伝的プログラミングのコード全部を書き換えるのは骨が折れる。泣く。なので、wgpuを叩く部分だけRustで書けばええんちゃうんかという判断が生えてくる。『wgpu-go』や。
念のためにgoでもrustで動かしたのとまったく同じシェーダーを実行してみる。いや、普通に動く。先生……!これは……!条件分岐の数がCreateComputePipelineの処理時間に影響していると思われていたが、実はそうではなかった可能性が高い。Rustのwgpuで行った検証も不十分だった可能性が高い。
配列アクセスが悪いのではないかと思い至り、配列利用型巨大WGSLシェーダーを動かしてみたが普通に動く。機序がわからん。キショい。
関数実行が悪いのではないかと思い至り、配列及関数利用型巨大WGSLシェーダーを動かしてみたが普通に動く。静的だと最適化してないかこいつ。
関数がインライン展開されている気がしてきた。多分。わからんけど。そう考えると、関数の再起呼び出しができないのも、配列の添え字に変数が使えないのもしっくりくる。
「気晴らしにcompute.toysとか言うので遊んでみるかぁ」つって、何気なく配列の添え字に変数を入れてみたところ、なんと動いた。はぁ?じゃあっつって、最新版のgo-webgpuだとどうなんのよって試したら配列の添え字に変数を入れても動く。CreatePipelineも300ms以内に終わる。はぁ???今までの苦労は何だったんだ。3日返してほしい。
なお、最新版が出てきたのは5 days agoである。タイムリー。
Rust Visual C++ prerequisites
Rust requires a linker and Windows API libraries but they don't seem to be
available.
These components can be acquired through a Visual Studio installer.
1) Quick install via the Visual Studio Community installer
(free for individuals, academic uses, and open source).
2) Manually install the prerequisites
(for enterprise and advanced users).
3) Don't install the prerequisites
(if you're targeting the GNU ABI).
>
Visual Studioに依存しててキショいな。Windowsやめたい。
MSYS2が入った状態で3)を選んだらインストールまでは行けた
rustup set default-host x86_64-pc-windows-gnu
をしたうえでcargo run
したら動いた
https://blog.ojisan.io/many-copies-original-sin/
目次
RustとWebAssemblyを勉強しているのだけれど、console.log
するのにもひと手間必要で、JavaScriptを全部置き換えるぜみたいなことをしようとすると苦労しそうだということが分かった。
//Rustwasmからconsole.logするコード
web_sys::console::log_1(&format!("Hello, {}!", name).into());
結局、負荷が高い処理を抜き出して、そこだけWebassemblyにするのが楽そう
Rustでプログラムを書いてみているのだけれど、静的型付け言語良いなってなってる。コンパイラ、というかエディタのコード検査に従って書いて、コード検査上の問題(コンパイルエラー)がなくなればいい感じに動くことが多い。
Rustのコンパイル時間は決して短いものではないのだけど(1秒で終わらない)、コンパイルエラーで不具合を発見できることによる時間的な効果は高そう。これがインタープリタで動作する言語だと動作確認して初めてバグに気づくみたいなことが多い。
動作確認に要する時間 > コンパイル時間 と捉えられる。
コンパイル時間が短縮されるよりも検査で発見される不具合が増える方が嬉しい。
#[test]
fn test_mem_drop() {
struct CustomSmartPointer {
data: String,
}
impl Drop for CustomSmartPointer {
fn drop(&mut self) {
println!("Dropping CustomSmartPointer with data `{}`!", self.data);
}
}
let c = CustomSmartPointer {data: String::from("my stuff")};
let d = CustomSmartPointer {data: String::from("other stuff")};
println!("CustomSmartPointers created.");
drop(c);
println!("exit function!");
//関数を抜ける際:
//Dropping CustomSmartPointer with data `other stuff`!
//Dropping CustomSmartPointer with data `my stuff`!
}
#[test]
fn test_CustomSmartPointer() {
struct CustomSmartPointer {
data: String,
}
impl Drop for CustomSmartPointer {
fn drop(&mut self) {
println!("Dropping CustomSmartPointer with data `{}`!", self.data);
}
}
let c = CustomSmartPointer {data: String::from("my stuff")};
let d = CustomSmartPointer {data: String::from("other stuff")};
println!("CustomSmartPointers created.");
//関数を抜ける際:
//Dropping CustomSmartPointer with data `other stuff`!
//Dropping CustomSmartPointer with data `my stuff`!
}
fn hello(text:&str) {
println!("Hello, {}!", &text);
}
let m = Box::new(String::from("Rust"));
hello(&m); //Hello, Rust!
let x=5;
let y=Box::new(x);
assert_eq!(5, x);
assert_eq!(5, *y);
//assert_eq!(5, y); //can't compare `{integer}` with `Box<{integer}>`