WebAssembly
理解
コンパイル型言語(C/C++、Rustなど)をコンパイルすると通常バイナリになるが、これをHTML+jsにできる
HTML側から「コンパイル型言語側で定義した関数」を呼ぶこともできる
「コンパイル型言語側」から「HTML側の関数」を呼ぶこともできる?sta.icon
ここちょっと怪しい
下記ノートレベルだと「例外を拾える」くらいの説明だが……
-.icon
2
C/C++、C# や Rust などの言語のコンパイル先となり、それらの言語をウェブ上で実行することができます。
C / C ++のような言語でコードを書いたら、Emscripten のようなツールを使って WebAssembly にコンパイルすることができます。
Wasm にコンパイルし、コードを実行するための HTML とウェブ環境上で Wasm を実行するための全ての JavaScript グルーコードを生成する。
ああ、なるほど、ビルドにて「Cで書いたとおりに動くHTML+js一式」をつくってくれるのね
HSPをjsで動かせるようにする
で、今見たらWASMも対応してたわ
理解sta.icon
もう一つ、C側でちょっと工夫して関数fを定義しておくと、HTML側でfを使うことができる
Emscripten が生成したコードは常に main() を呼び出し、他のデッドコードは削除されます。関数名の前に EMSCRIPTEN_KEEPALIVE を置くことによって、これが起こらなくなります。また、EMSCRIPTEN_KEEPALIVE を使用するために emscripten.h をインポートする必要があります。
-.icon
1
今見るとちょっとわからん
Rustを覚えてないからだな、思い出すのもだるいし、Cの方見るか(覚えてるか?w)
名前しか知らないが、端的にまとまっていて勉強時にはよさそうsta.icon*2
ブラウザで動作するコンパイル型言語
実際に使われているケースでは、パフォーマンス目的と言うよりは、既存のC実装のライブラリをブラウザで使用したい、といったものが多い
へー
メリットは二点か――速い。バックエンド言語をフロントで実行できる。
うごかんやんけ!mrsekut.icon
面白いw
rustが焦点当ててるのはフロントのみ
アプリケーションの一部を構築する — 既存の JavaScript フロントエンドの内部で Rust を使用します。
wasm-packというクレートを使う
wasm-bindgen
wasm-pack は 別のツールの wasm-bindgen を利用して、JavaScript と Rust の型を繋いでいます。wasm-bindgen によって JavaScript が文字列に関する Rust API を呼び出すことや Rust の関数が JavaScript の例外をキャッチすることができるようになります。
rustからjsを呼ぶ
code:rust
extern {
pub fn alert(s: &str);
}
externが「外部から呼び出したいです」の意
jsからrustを呼ぶ
code:rust
pub fn greet(name: &str) {
alert(&format!("Hello, {}!", name));
}
htmlは自分で書く
code:html
<script type="module">
type moduleって初耳なんだが
code:html
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<title>hello-wasm example</title>
</head>
<body>
<script type="module">
import init, {greet} from "./pkg/hello_wasm.js";
init()
.then(() => {
greet("WebAssembly")
});
</script>
</body>
</html>
jsに渡すように定義したgreetをimportしている