Ein in C geschriebener Minimal WebAssembly-Interpreter. Unterstützt die WebAssembly MVP-Version (Minimum Viable Product) der WebAssembly-Spezifikation.
Es gibt drei verschiedene WAC-Builds:
wat2wasm
oder wasm-as
kompiliert wurden. Besteht die meisten Spezifikationstests, abgesehen von einigen Import-/Exporttests für mehrere Module.-s SIDE_MODULE=1 -s LEGALIZE_JS_FFI=0
). Um wac/wax/wace zu erstellen, benötigen Sie eine 32-Bit-Version von gcc und 32-Bit-Versionen von SDL2 und libedit. Auf 64-Bit-Ubuntu/Debian können diese wie folgt installiert werden:
dpkg --add-architecture i386
apt-get update
apt-get install lib32gcc-4.9-dev libSDL2-dev:i386 libedit-dev:i386
Um Wat-Quelldateien in binäre Wasm-Module zu kompilieren, benötigen Sie das Programm wasm-as
von Binaryen. Um C-Programme zu WASM-Modulen zu kompilieren, benötigen Sie Binaryen und Emscripten.
Als Alternative zum Herunterladen und Erstellen der oben genannten Tools sind im kanaka/wac
Docker-Image (1,7 GB) 32-Bit-GCC-Compiler/-Bibliotheken, Emscripten und Binärdateien vorinstalliert. Das Docker-Image kann mit entsprechenden Datei-Mounts wie folgt gestartet werden:
docker run -v `pwd`:/wac -w /wac -it kanaka/wac bash
Alle unten aufgeführten Build-Befehle können im Docker-Container ausgeführt werden.
Wac erstellen:
$ make wac
Verwenden Sie wasm-as
um ein einfaches Wat-Programm in ein Wasm zu kompilieren:
$ make examples_wat/arith.wasm
Laden Sie nun die kompilierte WASM-Datei und rufen Sie einige Funktionen auf:
$ ./wac examples_wat/arith.wasm add 2 3
0x5:i32
$ ./wac examples_wat/arith.wasm mul 7 8
0x38:i32
wac unterstützt auch einen sehr einfachen REPL-Modus (Read-Eval-Print-Loop), der Befehle in Form von FUNC ARG...
ausführt:
$ ./wac --repl examples_wat/arith.wasm
> sub 10 5
0x5:i32
> div 13 4
0x3:i32
Wachs aufbauen:
$ make wax
Verwenden Sie wasm-as
um ein Wat-Programm zu kompilieren, das die WASI-Schnittstelle verwendet:
$ make examples_wat/echo.wasm
Führen Sie nun die kompilierte WASM-Datei aus. Das Programm liest Text von stdin und gibt ihn an stdout zurück, bis ein EOF (Strg-D) gesendet wird.
$ ./wax examples_wat/echo.wasm
> foo
foo
> bar
bar
> < Ctrl-D >
Wace bauen:
$ make wace
Verwenden Sie emscripten/binaryen, um einige einfache C-Programme zu kompilieren und sie mit wace auszuführen:
$ 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
Verwenden Sie emscripten/binaryen, um einige C-SDL-Programme zu kompilieren und sie mit wace auszuführen:
$ 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 enthält einen runtest.py
-Testtreiber, der zum Ausführen von Tests aus der WebAssembly-Spezifikation verwendet werden kann.
Schauen Sie sich die Spezifikation an:
git clone https://github.com/WebAssembly/spec
Sie benötigen wat2wasm
um die Spezifikationstests zu kompilieren. Auschecken und Erstellen von wabt (wabbit):
git clone --recursive https://github.com/WebAssembly/wabt
make -C wabt gcc-release
Führen Sie die Testdatei func.wast
(um Funktionsaufrufe zu testen) aus der Spezifikation aus:
./runtest.py --wat2wasm ./wabt/out/gcc/Release/wat2wasm --interpreter ./wac spec/test/core/func.wast
Führen Sie alle Spezifikationstests aus, mit Ausnahme einiger weniger, die derzeit fehlschlagen (hauptsächlich, weil runtest.py
die Unterstützung für einige in diesen Testdateien verwendete Syntax fehlt):
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 und wace können mit fooboot so erstellt werden, dass sie als eigenständige bootfähige Programme ausgeführt werden:
cd wac
git clone https://github.com/kanaka/fooboot
make PLATFORM=fooboot clean
make PLATFORM=fooboot wac wace examples_wat/addTwo.wasm
Das fooboot/runfoo
Skript kann zum Booten von wac/wace mit QEMU verwendet werden. fooboot/runfoo
erstellt außerdem eine Verbindung auf einem seriellen Port (COM2), die das Lesen von Dateien vom Hostsystem ermöglicht:
fooboot/runfoo wac --repl examples_wat/addTwo.wasm
QEMU waiting for connection on: disconnected:tcp:localhost:21118,server
webassembly> addTwo 2 3
0x5:i32
Die eigenständigen WAC/Wace-Builds können auch in ein ISO-Image integriert werden, das direkt auf echter Hardware booten kann. Dazu benötigen Sie Grub 2 und die Grub PC/BIOS-Binärdateien (grub-pc-bin) sowie das Programm xorriso. Außerdem müssen die WASM-Module, die Sie ausführen möchten, in die Binärdatei integriert werden, um Teil eines einfachen In-Memory-Dateisystems zu werden:
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
Sie können die ISO nun mit QEMU wie folgt booten:
qemu-system-i386 -cdrom boot.iso
Oder Sie können die ISO auf ein USB-Gerät brennen und von dort auf echter Hardware booten. Dadurch werden sämtliche Daten auf dem USB-Gerät zerstört! Stellen Sie außerdem sicher, dass /dev/MY_USB_DEVICE wirklich das USB-Gerät ist, das Sie überschreiben möchten, und nicht Ihre Festplatte. Sie wurden gewarnt!
sudo dd if=boot.iso of=/dev/MY_USB_DEVICE && sync
# Now boot you can boot from the USB device
MPL-2.0 (siehe LIZENZ).