Closed51

Wasm

フロントエンドえんじにゃーフロントエンドえんじにゃー

wasmはプラグインとして使いやすい設計
利用する側からimportするような記述がない限り、wasm自体がTCPコネクションを開いたりといったことがない

フロントエンドえんじにゃーフロントエンドえんじにゃー

wasmで書かれたコードが高速に実行できる必要があるのはもちろんだが、それを利用するために、
wasmのコードのダウンロード、パース、コンパイルに時間がかかっていては意味がない。
パースやコンパイルがしやすいフォーマットでないといけない。

フロントエンドえんじにゃーフロントエンドえんじにゃー

wasmは、画期的な夢のような技術だと思われるかもしれないが、
Javaが大昔から目指していたものであるし、ブラウザではasm.jsなどもそうだ
既存技術と比べて飛び抜けたものではない。

ただ、高速に動作し、CPUのアーキテクチャやOSでもに非依存、特定のVMでない環境で動作できる、ベンダー比依存などの部分はwasmの大きな強み

フロントエンドえんじにゃーフロントエンドえんじにゃー

JSやTSの代替技術ではない。あくまで共存する技術
なので、信じられないほど爆発的に普及するものでもない

FlutterやBlazorはwasmを利用することができる為、
結果的にこれらのおかげでwasmが普及する可能性はある。

フロントエンドえんじにゃーフロントエンドえんじにゃー

環境

Rustインストール

curl https://sh.rustup.rs -sSf | sh

source入力でターミナル入力でrustupを利用可能にする

source $HOME/.cargo/env

cargoコマンドが利用できるか確認

cargo --version

rustのツールチェインを更新

rustup update
フロントエンドえんじにゃーフロントエンドえんじにゃー

rustのhello worldだけしてみる。

  1. main.rsというファイルを作る
  2. fn main() { println!("hello rust"); } という記述を行う
  3. rustc main.rsで、ビルドファイルを作成(mainという名前のファイルが生成される)
  4. ./mainで実行
フロントエンドえんじにゃーフロントエンドえんじにゃー

index.htmlを作成し、以下を記

      const wasm = './target/wasm32-unknown-unknown/release/wasm_dev_book_hello_wasm.wasm'
      fetch(wasm)
        .then((response) => response.arrayBuffer())
        .then((bytes) => WebAssembly.instantiate(bytes, {}))
        .then((results) => {
          const { add } = results.instance.exports
          console.log(add(1, 2))
        })

wasmファイルをfetch

arrayBufferでバイナリ配列化する

バイナリ配列をWebAssemblyのコードとして、インスタンス化

WebAssemblyインスタンスからadd関数にアクセスして利用

フロントエンドえんじにゃーフロントエンドえんじにゃー

Firefox 58 の新機能として、 WebAssembly モジュールを基礎となるソースから直接コンパイルおよびインスタンス化する機能があります。

これは WebAssembly.compileStreaming() と WebAssembly.instantiateStreaming() メソッドを使用して実現します。

これらのメソッドは、バイトコードを直接 Module/Instance インスタンスに変換することができるので、Response を ArrayBuffer に別途格納する必要がないため、ストリーミングではない対応するメソッドよりも簡単になっています。

フロントエンドえんじにゃーフロントエンドえんじにゃー

var importObject = { imports: { imported_func: arg => console.log(arg) } };

WebAssembly.instantiateStreaming(fetch('simple.wasm'), importObject)
.then(obj => obj.instance.exports.exported_func());

フロントエンドえんじにゃーフロントエンドえんじにゃー

WebAssembly.instantiateStreamingを利用すると、
下記のようにfetch→arrayBuffer→WebAssembly.instantiateをまとめて記述可能

fetch(wasm)
.then((response) => response.arrayBuffer())
.then((bytes) => WebAssembly.instantiate(bytes, imports))

WebAssembly.instantiateStreaming(fetch(wasm), imports).then((results) => {

このスクラップは2022/09/15にクローズされました