FirefoxやChromeで標準対応となったWebAssembly。その開発環境の構築方法について調べてみました。
結論から言いますと、執筆時点(2017/05/06 incoming版をインストール後のemccのバージョンは1.37.12 2017/05/18 emccのバージョンは1.37.9)では、とても簡単になっています。
※ コメントをいただき、incoming版の必要がないことを確認しました。そのため、記事を修正しました。
環境構築は、Emscriptenの最新版をインストールするだけ
以前は、BinaryenやWABTといったツールが必要だったようですが、現在はEmscripten のincoming版 をインストールすれば全て完了します。Emscriptenは、RustからWebAssemblyへコンパイルする場合にも必要です。(バージョン 1.37.9以降が必要なようです。)
インストール方法ですが、MacOSXでは、公式サイトのダウンロードページから、「Portable Emscripten SDK for Linux and OS X」をダウンロードして展開してから、展開先へカレントディレクトリを移動し、
./emsdk update
./emsdk install latest
./emsdk activate latest
source ./emsdk_env.sh
と実行すればインストールが完了します。
Windowsの場合は、こちらをご覧ください。
Emscriptenであれば、標準Cライブラリ等も使えるので、実用性を考えると、この方法が唯一ではないでしょうか。
オプションは「-s WASM=1」
以前は、「-s BINARYEN=1」だったそうですが、最新版では「-s WASM=1」に変わっています。以下のような感じです。
emcc hello.c -o hello.html -s WASM=1
また、この後Binaryen等で変換が必要と書かれている記事もありますが、現在は一発でWASMファイル(バイナリ形式のファイル)が出力されます。
「-s "BINARYEN_METHOD='???'"」のようにオプションを付けると、細かいこともできるようです。
感想
昔の記事を調べたところ環境構築がけっこう大変なようで少々ビビりましたが、それらに比べると、現在は簡単になっていると思います。
ちなみに、単純なHello Worldを-O2で最適化をかけてコンパイルしただけでも、WASMファイルが26KB、補助用のJavaScriptファイルが43KBありました。おそらく、Emscriptenが用意してくれているmallocやprintf等のサイズだと思いますが、意外と大きいです。ただ、大規模なプログラムになっても、ファイルサイズはあまり大きくなっていかないのではないかと期待しています。
ちなみに、clangを使ってコンパイルする方法も試してみました。こちらは、WASMのファイルサイズこそ小さかったものの、Cの標準ライブラリも使えない状態のため、使い所が難しそうです。mallocすら無いためロジックが複雑なものは難しいですが、単純な数値計算をさせるだけといった用途であれば、こちらの方法のほうがファイルサイズが小さく、良いかもしれません。