Минимальный интерпретатор WebAssembly, написанный на C. Поддерживает версию WebAssembly MVP (минимально жизнеспособный продукт) спецификации WebAssembly.
Существует три различных сборки WAC:
wat2wasm
или wasm-as
. Проходит большинство технических тестов, за исключением некоторых тестов импорта/экспорта нескольких модулей.-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 вам понадобится программа wasm-as
от Binaryen. Для компиляции программ C в модули Wasm вам понадобятся Binaryen и emscripten.
В качестве альтернативы загрузке и сборке вышеуказанных инструментов в образе Docker kanaka/wac
(1,7 ГБ) уже установлены 32-битный компилятор/библиотеки gcc, emscripten иbinaryen. Образ Docker можно запустить с монтированием соответствующих файлов следующим образом:
docker run -v `pwd`:/wac -w /wac -it kanaka/wac bash
Все приведенные ниже команды сборки можно запускать в контейнере докеров.
Построить ВАК:
$ 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 (чтение-оценка-печать-цикл), который запускает команды в форме FUNC ARG...
:
$ ./wac --repl examples_wat/arith.wasm
> sub 10 5
0x5:i32
> div 13 4
0x3:i32
Строительный воск:
$ make wax
Используйте wasm-as
для компиляции wat-программы, использующей интерфейс WASI:
$ 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 включает тестовый драйвер runtest.py
, который можно использовать для запуска тестов из спецификации WebAssembly.
Посмотрите спецификацию:
git clone https://github.com/WebAssembly/spec
Вам понадобится wat2wasm
для компиляции тестов спецификации. Оформление заказа и сборка вабта (ваббита):
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 могут быть созданы для запуска как автономные загрузочные программы с помощью fooboot:
cd wac
git clone https://github.com/kanaka/fooboot
make PLATFORM=fooboot clean
make PLATFORM=fooboot wac wace examples_wat/addTwo.wasm
Сценарий fooboot/runfoo
можно использовать для загрузки wac/wace с помощью QEMU. 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
Теперь вы можете загрузить ISO с помощью QEMU следующим образом:
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
МПЛ-2.0 (см. ЛИЦЕНЗИЮ).