本セッションの登壇者
セッション動画(YouTubeチャンネル登録もお願いします。)
こんにちはchikoskiです。
WebAssemblyの最近の話題から、興味深いものを2つほどピックアップしてお話ししようと思っています。よろしくお願いいたします。
WebAssembly ”2.0”とはいうが…
まず1つ目は、WebAssembly 2.0のワーキングドラフト、というか、最初のドラフトができましたという話題です。

この位置付けを理解するには、わりと文脈を押さえなきゃいけないということをお話しさせていただければと思います。
WebAssembly 2.0と言ってはいるのですが、実はもうすでに出来上がった仕様の取りまとめを行っているに過ぎません。ここに書かれている仕様と、いまの仕様の1.0の間には当然diffがあるのですが、その差分ももう使えるものがいくつか含まれています。たとえばBigInt IntegrationとかBulk memory operationとか、そういうものはもうすでにブラウザなどでは使えるようになっていますというのが1点目。

もうひとつ、気を付けないといけないのは、これ、2.0と言ってますけれども、別にバージョンが上がるわけではなくて、たとえばバイナリに互換性がないとかそういうことはまったくありません。あと、バイナリにバージョン番号が書かれることもないので、たとえばブラウザでアプリを使うときはちゃんとブラウザがその仕様に対応しているかどうかを調べて、それから使おうとか、そういったWebらしい使い方をすることが求められて、変わらないというところ、この2点をご注意いただければと思います。
これがひとつめの話題です。
WebAssemblyの最近の使い方/使われ方
もうひとつの話題は最近の使い方の変化をちょっと概観してみようというものです。
WebAssemblyができたとき、最初はこのAngryBotsのように、すべてのアプリケーションをWebAssemblyで表現して、それをWebページに埋め込んでそれを使う、という使い方が主だったかと思います。

ですが、もう5年ぐらい経っているのでどんどん使い方が変わってきていて、1つのWebページや1つのプログラムの中に複数のWebAssemblyのモジュールを埋め込んで、そいつらを相互に協調させながら使おうという使い方に変わってきています。
なんでそうなっているかというと、WebAssemblyにはいろいろな特徴があるんですが、その中で安全性と柔軟性を両立するための手段として使いやすいからというのが理由になってると思います。

安全性というのはこの言葉の通りで、実行されるときに必ずサンドボックスの中で動くので、たとえば信頼できないコードとか、最近よく聞くサプライチェーンアタックみたいな、そういった外からやってきたコードを動かすために良いソリューションであるというのが1点目。
もうひとつ、柔軟性というのは何かというと、ここがけっこう肝だと思っていて、サンドボックスの中で何かを動かそうと思うと、たとえば使えるプログラミング言語が限られたりであるとか、ツールが限られたりすることが多いのですが、WebAssemblyの場合はだいたいメジャーな言語は対応しているので、プログラミング言語やツールの選択を柔軟に行えるというのがすごく大きい。開発者が使いたいツールを使えるという点は大きいですね。
あともうひとつ、柔軟性には違う側面があって、WebAssemblyはネイティブコードではないので、けっこうモジュールの更新がネイティブコードを変えるよりも簡単にできる点があるので、よく使われているように思います。
具体的な例をいくつか挙げようと思うのですが、たとえばShopifyっていうアプリケーションがあるのですが、これはECサイトを作るためのツールで、そこでビジネスロジックをアプリケーションという形で実装しています。そのアプリケーションの実装にWebAssemblyが使えるようになっています。

サプライチェーンアタックの話をしましたが、FireFoxが使っているライブラリのひとつにRLBoxというのがあって、これはライブラリをWebAssembly化して、それをサンドボックスの中で動かすことによって、プロセス分離できないような環境でもサンドボックスを提供することができるというものですね。

最近ちょっとインパクトがあったのは、Amazon Prime Videoの組み込み、ドングルとかそういうところで動いているアプリがあります。もともとアプリはJavaScriptで書かれていたのですが、その下回りを全部WebAssemblyにすることで、下回りの差し替えが簡単になったり、コードもC++で書かなくてもよくて、たとえばRustで書いたコードを使ってJavaScriptアプリケーションが動くとか、そういったことになっています。

WebAssemblyのモジュールを組み合わせて使う
WebAssemblyモジュールをいくつ組み合わせて使うということが普通になってきているのですが、この流れはどんどん加速しているかなと思っています。たとえば、いま議論されている仕様の中には、ES Moduleと同じようにWasmのモジュールを使えるようにして、使い勝手を向上しようという動きがあります。

こうなると、今だとWebAssemblyで書いたものをJavaScriptに組み込むときはバンドラーで頑張るとか、手動でロードのコードを書くとか、いろいろしないといけないんですが、それをしなくてもES Moduleをロードするようになります。こうなると、たとえばライブラリなんかもWasmで書かれたものがどんどん増えてくるのかな、とちょっと思っています。
あともうひとつ、最後の話題として、こうした流れでWebAssemblyのモジュールを組み合わせて何か大きなプログラムを作るとなると、当然ホスト環境の話が出てくるのですが、ホスト環境との間でデータ変換するとか、そういったことを全部一気に引き受けて解決するための仕様「Component model」について、最近議論が始まっています。今年になってからリポジトリが作られていました。
これはいろいろ面白くて、既存のWebAssemblyのモジュールの上にもう一枚皮をかぶせて、それを組み合わせるときに依存関係のグラフを書けるとか、どの関数をどうexportとするとか何をimportするとか、あとはデータ変換をどうするかとか、そういったことが書ける仕様です。

ということで、WebAssemblyの派手な利用例はあんまりないんですが、地道に使われてきているので、ぜひ今後もウォッチしていただけると幸いです。
僕からは以上になります。ありがとうございました。