用 C 语言编写的最小 WebAssembly 解释器。支持 WebAssembly 规范的 WebAssembly MVP(最小可行产品)版本。
wac 共有三种不同的版本:
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.7GB) 预装了 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 还支持非常简单的 REPL (read-eval-print-loop) 模式,该模式以FUNC ARG...
的形式运行命令:
$ ./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 文件。程序从 stdin 读取文本并将其回显到 stdout,直到发送 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 包含一个runtest.py
测试驱动程序,可用于运行 WebAssembly 规范中的测试。
查看规格:
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
可以使用 fooboot 将 wac 和 wace 构建为作为独立的可启动程序运行:
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(参见许可证)。