WebAssemblyを試してみた

はじめに

WebAssemblyを試した。
WebAssemblyは、簡単に言うとブラウザ上でネイティブに近いパフォーマンスで動作するバイナリープログラムを実行する仕組みである。
通常ブラウザ上でプログラムを実行するには、JavaScriptを使うか、ブラウザのアドオン(追加機能、例えば(もう見かけなくなったが)Flash・Silverlight・Javaアプレット等)を有効にして別の言語による実行プログラムを動かす必要があるが、ブラウザがWebAssemblyをサポートしていれば、アドオンが不要で別言語でコンパイルしたプログラムを動作させる事が出来る。
本エントリーでは、言語の選択(結局Rustを選んだ)から、JavaScriptからRustをコンパイルして作ったWebAssemblyのプログラム(関数)にJSONを渡し、プログラム(関数)がJSONを返してJavaScriptで受け取るところまでを実装した。

言語の選択

WebAssemblyに対応した言語は、Rust, Go, C, C++, AssemblyScript, Pythonなど開発途中のものも含めればかなり多数ある。
中でもそこそこに実績のあるのは、Rust, Go, C, C++だと思う。
PythonもPyodideというMozillaが開発している実行環境もあるが、おそらくまだ不安定だと思われる。(Emscripten上でPythonの実行プログラムのバイナリをWebAssemblyに変換して動かすらしい。)

WebAssemblyを動かす際、使い勝手の観点から一番重要になるのは、おそらくパラメータの受け渡しだろう。
その観点で調べると、Rustには、wasm-bindgenなるフレームワークがあり、これがかなりパラメータの受け渡しを楽にしてくれる。JSONのやり取りも可能だし、ここを見ると、バイナリデータのやり取りもおそらく可能である。
その観点から今回はRustでJSONの受け渡しを行うサンプルプログラムを実装してみた。

実装

実装の際は本エントリ下部の参照サイトを参考にした。
実装と実行による想定結果はここにアップした。

動作環境は以下の通りである。
OS : Amazon Linux2
Node.js : 16

ポイント

RustでWebAssemblyを実装する場合は、以下のパッケージを組み合わせると便利である。

wasm-bindgen

WebAssemblyとJavaScriptの間のデータの受け渡しをwrapしてくれる。

wasm-pack

rustのプロジェクトをWebAssemblyのファイルとそれを読み込むjsに変換してくれる。

webpack

wasm-packで生成したJSファイルとWebAssemblyのファイルを1つのjsファイルにバンドルしてくれます。

今後の応用について

今回作ったプログラムで、JavaScriptからRustのプログラムにデータを送る事は出来たので、必要があればRustを使ってプログラムを作っていけば良い。
もしRustによるWebAssemblyを試してみたい方がいたら参考にして頂ければと思う。

補足

PythonがWebAssemblyで動くと機械学習や数値計算のライブラリを色々活用できて良いのだが、おそらく安定した動作になるにはまだ時間がかかりそうである。JavaScriptで機械学習ライブラリを使うなら、js化したTensorFlow.jsなどを使用した方が手っ取り早いようには思う。