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 및 binen이 사전 설치되어 있습니다. 다음과 같이 적절한 파일 마운트를 사용하여 Docker 이미지를 시작할 수 있습니다.
docker run -v `pwd`:/wac -w /wac -it kanaka/wac bash
아래의 모든 빌드 명령은 Docker 컨테이너 내에서 실행될 수 있습니다.
WAC 빌드:
$ make wac
간단한 wat 프로그램을 wasm으로 컴파일하려면 wasm-as
사용하세요.
$ 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
WASI 인터페이스를 사용하는 wat 프로그램을 컴파일하려면 wasm-as
사용하십시오.
$ make examples_wat/echo.wasm
이제 컴파일된 wasm 파일을 실행하세요. 프로그램은 stdin에서 텍스트를 읽고 EOF(Ctrl-D)가 전송될 때까지 이를 stdout에 에코합니다.
$ ./wax examples_wat/echo.wasm
> foo
foo
> bar
bar
> < Ctrl-D >
Wace 빌드:
$ make wace
간단한 C 프로그램을 컴파일하고 wace를 사용하여 실행하려면 emscripten/binaryen을 사용하세요.
$ 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
일부 C SDL 프로그램을 컴파일하고 wace를 사용하여 실행하려면 emscripten/binaryen을 사용하세요.
$ 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는 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
스크립트는 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(라이센스 참조).