WebAssemblyとは何であり、何でないのか
これはWebAssembly Advent Calendar 2017の1日目の記事です。明日はyamachuさんによるElectronでWebAssemblyを使う話だそうです。楽しみですね。
WebAssemblyとは
アドカレ初日記事なので、WebAssemblyとは何か?という話を簡単にしておきます。WebAssemblyはWebのための新しいコンパイルターゲットで、Chrome/Firefox/Safari/Edgeでの動作が既にサポートされています。
Webのためのコンパイルターゲット、とは何でしょうか。WebAssembly以前は、JavaScript以外の言語をブラウザ上で動かそうと思ったらまずJavaScriptに変換してやる必要がありました。近年だとScala.js(Scala→JavaScript)やGopherJS(Golang→JavaScript)というプロジェクトがあり、古くはC/C++のコードをJavaScriptにするEmscriptenがあります。しかし例えばEmscriptenでC言語で書かれたゲームをまるごとJavaScriptにしたりすると、出力結果の.jsファイルが巨大になり、ダウンロードや読み込みに時間がかかってしまうという問題がありました。
これを解決するのがWebAssemblyです。.wasmファイルはバイナリフォーマットなので.jsよりずっと小さくでき、またパース処理も単純なのでロードも速くなります。WebAssemblyの登場により、JavaScript以外の言語をブラウザで動かすことがずっとやりやすくなったと言えるでしょう。
Web開発言語の選択肢は広がるか?
こう聞くと、自分の好きな言語でWebのクライアントサイド開発ができるようになると思われたかもしれません。実際、「WebAssemblyでWeb開発言語の選択肢が広がる」という言説も目にしますが、ここには少し落とし穴があります。
あなたの愛用の言語がWebAssemblyで動いたとして、すぐにWeb開発に使えるとは限りません。そもそも現代では多くのプログラミング言語がJavaScriptに変換できますが、多くの人はJavaScriptを使い続けています。その理由はReact、Vue、Angularといったフレームワークの存在にあります。
ある程度の規模のアプリケーションを書くためには何らかのフレームワークが必要で、新しく作るにしろ、JSのものをラップするにしろ、誰かがそれを用意する必要があります。そして、それが十分なユーザ数を獲得し、あなたが仕事で使いたいと思うかはまた別の問題なのです。
WebAssemblyの使いどころ
なんだか夢のない話でしたが、それではWebAssemblyにはどのような用途があるのでしょうか?以下で紹介されている記事を見ると、画像認識、自然言語判定、動画コーデック、物理演算など、C等で書かれたある程度ボリュームのある計算処理をブラウザ上に持ってくるという用途で使われていることが分かります。
多くの人にとってはWebAssemblyは自分で触るものというより、それをラップしたライブラリ経由で間接的に使うパターンが多いのではないでしょうか。例えば上の記事にあるcld-jsはある文章が何語の文章なのか(英語、日本語など)を検知するライブラリで、中にCのソースからコンパイルしたwasmが入っています。
WebAssemblyの将来
WebAssemblyの一番のメリットはさまざまな言語のサポートというよりも、一定規模のプログラムをブラウザ用に変換したときに現実的な速度(ロード時間+実行速度)で動くという点にあります。1 これによって、より複雑なプログラムがブラウザ上で動いていくようになるでしょう。ゲームやGoogle Earthはその良い例です。
またWebAssemblyはWebという名前が付いてはいますが、ブラウザ以外で動かすことも念頭に置かれており、例えば最新のNode.jsでは既にWebAssemblyが実行できるようです。このように.wasmファイルをプラットフォーム非依存な.soだと思えば、例えばRuby処理系が.wasmを実行できる未来とかも考えられて楽しいです。2
まとめ
- WebAssemblyはブラウザ上で動く新しいコンパイルターゲットである。ある言語を.jsにコンパイルするよりも効率よく実行でき、より大きなプログラムも現実的に動くようになる
- WebAssemblyは銀の弾丸ではない。いろんな言語がブラウザで動くとしても、実用的なフレームワークが登場するかは別問題