C で書かれた Minimal WebAssembly インタープリター。WebAssembly 仕様の WebAssembly MVP (minimum viable product) バージョンをサポートします。
wac には 3 つの異なるビルドがあります。
wat2wasm
またはwasm-as
でコンパイルされたスタンドアロン wasm ファイルを実行するように設計されています。一部のマルチモジュールのインポート/エクスポート テストを除いて、ほとんどの仕様テストに合格します。-s SIDE_MODULE=1 -s LEGALIZE_JS_FFI=0
使用)。 wac/wax/wace をビルドするには、32 ビット バージョンの gcc と 32 ビット バージョンの SDL2 および libedit が必要です。 64 ビット Ubuntu/Debian では、次のようにインストールできます。
dpkg --add-architecture i386
apt-get update
apt-get install lib32gcc-4.9-dev libSDL2-dev:i386 libedit-dev:i386
wat ソース ファイルをバイナリ wasm モジュールにコンパイルするには、Binaryen のwasm-as
プログラムが必要です。 C プログラムを wasm モジュールにコンパイルするには、Binaryen と emscripten が必要です。
上記のツールをダウンロードしてビルドする代わりに、 kanaka/wac
Docker イメージ (1.7 GB) には 32 ビット gcc コンパイラー/ライブラリ、emscripten、および binaryen がプリインストールされています。 Docker イメージは、次のように適切なファイル マウントを使用して起動できます。
docker run -v `pwd`:/wac -w /wac -it kanaka/wac bash
以下のすべてのビルド コマンドは Docker コンテナ内で実行できます。
wac をビルドします。
$ make wac
wasm-as
使用して、単純な wat プログラムを wasm にコンパイルします。
$ make examples_wat/arith.wasm
次に、コンパイルされた wasm ファイルをロードし、いくつかの関数を呼び出します。
$ ./wac examples_wat/arith.wasm add 2 3
0x5:i32
$ ./wac examples_wat/arith.wasm mul 7 8
0x38:i32
wac は、 FUNC ARG...
の形式でコマンドを実行する非常に単純な REPL (read-eval-print-loop) モードもサポートしています。
$ ./wac --repl examples_wat/arith.wasm
> sub 10 5
0x5:i32
> div 13 4
0x3:i32
ビルドワックス:
$ make wax
wasm-as
を使用して、WASI インターフェイスを使用する wat プログラムをコンパイルします。
$ make examples_wat/echo.wasm
次に、コンパイルされた wasm ファイルを実行します。プログラムは標準入力からテキストを読み取り、EOF (Ctrl-D) が送信されるまでそれを標準出力にエコーします。
$ ./wax examples_wat/echo.wasm
> foo
foo
> bar
bar
> < Ctrl-D >
ビルド方法:
$ make wace
emscripten/binaryen を使用していくつかの単純な C プログラムをコンパイルし、wace を使用して実行します。
$ make examples_c/hello1.wasm
$ ./wace examples_c/hello1.wasm
hello world
$ make examples_c/hello2.wasm
$ ./wace examples_c/hello2.wasm
hello malloc people
emscripten/binaryen を使用していくつかの C SDL プログラムをコンパイルし、wace を使用して実行します。
$ make examples_c/hello_sdl.wasm
$ ./wace examples_c/hello_sdl.wasm
INFO: OpenGL shaders: ENABLED
INFO: Created renderer: opengl
# Blue Window displayed for 2 seconds
Done.
$ make examples_c/triangle.wasm
$ ./wace examples_c/triangle.wasm
# A colorfully shaded triangle is rendered
wac には、WebAssembly 仕様に基づいてテストを実行するために使用できるruntest.py
テスト ドライバーが含まれています。
仕様を確認してください:
git clone https://github.com/WebAssembly/spec
仕様テストをコンパイルするにはwat2wasm
必要です。 wabt (wabbit) をチェックアウトしてビルドします。
git clone --recursive https://github.com/WebAssembly/wabt
make -C wabt gcc-release
仕様からfunc.wast
テスト ファイルを実行します (関数呼び出しをテストするため)。
./runtest.py --wat2wasm ./wabt/out/gcc/Release/wat2wasm --interpreter ./wac spec/test/core/func.wast
現在失敗しているいくつかのテストを除いて、すべての仕様テストを実行します (主にruntest.py
これらのテスト ファイルで使用されている一部の構文をサポートしていないことが原因です)。
BROKE_TESTS="comments exports imports linking names data elem inline-module"
for t in $(ls spec/test/core/*.wast | grep -Fv "${BROKE_TESTS// /$'n'}"); do
echo -e "nTESTING ${t}"
./runtest.py ${t} || break
done
wac と wace は、foboot を使用してスタンドアロンの起動可能プログラムとして実行するように構築できます。
cd wac
git clone https://github.com/kanaka/fooboot
make PLATFORM=fooboot clean
make PLATFORM=fooboot wac wace examples_wat/addTwo.wasm
fooboot/runfoo
スクリプトは、QEMU で wac/wace を起動するために使用できます。 fooboot/runfoo
ホスト システムからのファイルの読み取りを可能にするシリアル ポート (COM2) 上での接続も作成します。
fooboot/runfoo wac --repl examples_wat/addTwo.wasm
QEMU waiting for connection on: disconnected:tcp:localhost:21118,server
webassembly> addTwo 2 3
0x5:i32
スタンドアロンの wac/wace ビルドは、実際のハードウェアで直接起動できる ISO イメージに組み込むこともできます。これを行うには、Grub 2、Grub PC/BIOS バイナリ ファイル (grub-pc-bin)、および xorriso プログラムが必要です。また、実行したい wasm モジュールをバイナリに組み込んで、単純なメモリ内ファイル システムの一部にする必要があります。
echo "examples_wat/addTwo.wasm" > mem_fs_files
make PLATFORM=fooboot
FOO_TARGETS="wac"
FOO_CMDLINE="examples_wat/addTwo.wasm addTwo 3 4"
boot.iso
次のように QEMU を使用して ISO をブートできるようになりました。
qemu-system-i386 -cdrom boot.iso
または、ISO を USB デバイスに書き込み、そこから実際のハードウェアで起動することもできます。これにより、USB デバイス上のデータがすべて破壊されます。また、/dev/MY_USB_DEVICE が本当に上書きしたい USB デバイスであり、ハードドライブではないことを完全に確認してください。あなたは警告を受けました!
sudo dd if=boot.iso of=/dev/MY_USB_DEVICE && sync
# Now boot you can boot from the USB device
MPL-2.0 (「ライセンス」を参照)。