LoginSignup
20
19

More than 5 years have passed since last update.

Hello World WebAssembly

Last updated at Posted at 2016-03-22

概要

emscriptenと関連ツールでHello worldするC++コードをWebAssembly向けにビルドする。

環境

  • MacBook Pro OS X Yosemite
  • Google Chrome Canary 51.0.2685.0 canary (64-bit)

準備

emsdk

emscripten、clang等々はこいつで一括して入れるのが楽。

Emscripten SDK (emsdk)から入手して、sdk-incoming-64bitを入れる。

cd path/to/emsdk_portable
./emsdk update
./emsdk install sdk-incoming-64bit # 時間かかるよ
./emsdk activate sdk-incoming-64bit

binaryen

WebAssemblyに変換する各種ツール。emscriptenが内部でこれを使っている。

git clone https://github.com/WebAssembly/binaryen
cd binaryen
cmake . && make

~/.emscriptenにBINARYEN_ROOT='path/to/binaryen'を追記。

sexpr-wasm

binaryenの各種ツールのなかの一つにwasm-asという構文木(S式)をWebAssemblyのバイナリに変換するものがあるんだけど現状動かないのでそれの代替として使う。

git clone https://github.com/WebAssembly/sexpr-wasm-prototype
cd sexpr-wasm-prototype
git submodule update --init
make

ビルド

こんな感じのファイルを

hello.cpp
#include <iostream>

int main() {
  std::cout << "Hello World\n";
  return 0;
}

ビルド。

emcc -O2 hello.cpp -o hello.html -s BINARYEN=1

# 現状emscriptenは構文木形式でしか吐き出してくれないのでここでバイナリに変換
path/to/sexpr-wasm-prototype/out/sexpr-wasm hello.wast -o hello.wasm

# hello.wasm.mappedGlobalsというのが必要なんだけどとりあえずコピーするだけ動く
cp hello.wast.mappedGlobals hello.wasm.mappedGlobals

python -m SimpleHTTPServerとかしてみてください。

雑感

物がバイナリなので基本フェッチしないといけないのがめんどい。どうしても1ファイルにしたければ配列でいれる感じ。Wasm.instantiateModuleFromAsmというのもあるのでそれを使うということ?(ちょっと試せてない)。

今回の方法でzlibも動いたので大体のものがいけそう。stableで動けば普通にプロダクトで使えると思う。

参考

20
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
19