RustでWebAssembly

Rustで書いた関数をWebAssemblyのファイル(wasm)にして、それをJavaScriptから呼び出す、というテスト。

自分的プロジェクト名はtest01。

ソースなどはこちら (Github)

参考にさせていただいたサイト https://caddi.tech/archives/879

Rust側

Rustで関数を書いた。add()という加算する関数を。

test01.rs

#![no_main]    // this file does not contain a main function

#[no_mangle]   // we do not want to mangle the symbol when exporting
pub extern fn add(a: i32, b: i32) -> i32 { a + b }

このRustソースをwasmにコンパイルする。以下のバッチファイルを使った。

compile.bat

rustc --target wasm32-unknown-unknown ./test01.rs 

これでできたwasmファイルをHTML (JS)で読む。

JavaScript (HTML) 側

JSでwasmファイルから読んで実行するコードは以下。wasm内のadd()をadd_funcとして取り出している。

index.htmlの一部

  WebAssembly.instantiateStreaming(
    fetch( "test01.wasm"), {})
      .then( wasm => {
        let add_func = wasm.instance.exports.add;
        result = add_func(10, 20);
      }
  );

ただし、JSでwasmファイルから読むときと実行するとき、非同期になるので厄介。test01では結果が出るまでsleepするように書いた。

(test03で、もうすこしすっきり書けたのだが、それはまた別のお話。)

閲覧

index.htmlをローカルファイルとして開くだけではwasmは読み込まれない。HTTPサーバーに置く必要がある。

ただし、VSCodeでフォルダを開き、右下の「Go Live」をクリックすれば、ホスティングしてくれるらしく、ブラウザでwasmを使ったJS入りのHTMLが正常に表示される。やったね。