WebAssembly 日本での利用事例 2019年まとめ


他にもあるよ、という方ご連絡ください。追加します。

パーツとしてWASMを使う事例

アプリを全部WebAssemblyにするというよりは、一部にWebAssembly化したライブラリを使いました、という使い方が出てきているように思います。

この2つは典型的です。

前者はmp3エンコーダーをWASM化して利用しています。ライブラリを再利用するということで、生産性を高めた例かなと思っています。

後者はライブラリを再利用するというよりも、バックエンド / エッジとフロントエンドとでコードを共通化したいという目的から、WASMを利用しています。ハッシュ値生成アルゴリズムを共通化しています。これをバックエンドでC実装を、フロントエンドでJS実装を、それぞれ利用していたとすると、開発、テスト、メンテナンスとコストがかさんで仕方がないでしょう。WASMにすることで、これらのコストが下がっている点も注目すべきだと思います。

他言語の資産をWebに持ち込んだ事例

アプリケーション全体を移植している例としては、vim.wasmがあります。vimをWASM化しています。vimの移植性の高さを利用しているのが特徴です。Webを1つのグラフィックスフレームワークとして捉えることで、大きくコードを変更することなく移植を行っています。

また独自のイベントループを持つGUIアプリを、既にイベントループのあるWebに移植するために、WebWorkerとSharedArrayBuffer, Atomics APIを利用している点も興味深いです。詳細はREADMEに記述されています

スクラッチから書かれたものとしては、GopherBoyがあります。Goで書かれたGameboyエミュレータです。Gocon2019で講演がありました。詳細はそちらをどうぞ。

vim.wasmも、GopherBoyも、どちらもWASM化されたあと、第3者によってWebアプリに組み込まれている点も興味深いです。WASM化することで非Webの資産が、Webのエコシステムへの組み込みが可能になっています。

まとめ

以前は、スマホアプリを全てWebに持ってくることで高いUXを提供し、Royalityユーザとのエンゲージメントを高めるといった使い方をされている事例が目立っていましたが、今年はWebのエコシステムに他言語の資産を組み入れるという使い方が増えているように思います。

とくにバッグエンドとフロントとでコードを共通化するという使用例は、メンテナンスコストが議論されていることを踏まえると興味深いと思っています。FastlyCloudflareの取り組みを踏まえると、エッジとフロントでコードを共有するための仕組みとして利用する例も増えてくるかもしれません。

またブラウザ外での利用も増えてゆくと期待しています。wamerはPythonなどの言語に安全でポータブルなネイティブプラグインを実現していますWASMのES Module integrationの標準化と実装が進めば、NodeJSでの利用もしやすくなり、デュプロイや配布に関するトラブルがへる、といったことも期待されます。

安全なネイティブコードの実行環境という点では、WebAssembly System Interfaceも興味深く、また期待も高まっています。組み込みから、コンテナまで、多様な期待がありますが、どうなるかはまだまだ未知数で、楽しみです。