以 C 語言編寫的最小 WebAssembly 解譯器。
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(參見許可證)。