Penerjemah WebAssembly Minimal yang ditulis dalam C. Mendukung versi WebAssembly MVP (produk minimum yang layak) dari spesifikasi WebAssembly.
Ada tiga versi wac yang berbeda:
wat2wasm
atau wasm-as
. Lulus sebagian besar pengujian spesifikasi selain dari beberapa pengujian impor/ekspor multi-modul.-s SIDE_MODULE=1 -s LEGALIZE_JS_FFI=0
). Untuk membangun wac/wax/wace Anda memerlukan gcc versi 32-bit dan SDL2 dan libedit versi 32-bit. Pada Ubuntu/Debian 64-bit, ini dapat diinstal seperti ini:
dpkg --add-architecture i386
apt-get update
apt-get install lib32gcc-4.9-dev libSDL2-dev:i386 libedit-dev:i386
Untuk mengkompilasi file sumber wat ke modul wasm biner, Anda memerlukan program wasm-as
dari Binaryen. Untuk mengkompilasi program C ke modul wasm, Anda memerlukan Binaryen dan emscripten.
Sebagai alternatif untuk mengunduh dan membuat alat di atas, image buruh pelabuhan kanaka/wac
(1,7 GB) memiliki kompiler/library gcc 32-bit, emscripten, dan bineren yang sudah diinstal sebelumnya. Gambar buruh pelabuhan dapat dimulai dengan pemasangan file yang sesuai seperti ini:
docker run -v `pwd`:/wac -w /wac -it kanaka/wac bash
Semua perintah build di bawah ini dapat dijalankan di dalam container buruh pelabuhan.
Bangun wac:
$ make wac
Gunakan wasm-as
untuk mengkompilasi program wat sederhana ke wasm:
$ make examples_wat/arith.wasm
Sekarang muat file wasm yang telah dikompilasi dan aktifkan beberapa fungsi:
$ ./wac examples_wat/arith.wasm add 2 3
0x5:i32
$ ./wac examples_wat/arith.wasm mul 7 8
0x38:i32
wac juga mendukung mode REPL (read-eval-print-loop) yang sangat sederhana yang menjalankan perintah dalam bentuk FUNC ARG...
:
$ ./wac --repl examples_wat/arith.wasm
> sub 10 5
0x5:i32
> div 13 4
0x3:i32
Membangun lilin:
$ make wax
Gunakan wasm-as
untuk mengkompilasi program wat yang menggunakan antarmuka WASI:
$ make examples_wat/echo.wasm
Sekarang jalankan file wasm yang telah dikompilasi. Program membaca teks dari stdin dan menggemakannya ke stdout hingga EOF (Ctrl-D) dikirim.
$ ./wax examples_wat/echo.wasm
> foo
foo
> bar
bar
> < Ctrl-D >
Membangun wace:
$ make wace
Gunakan emscripten/binaryen untuk mengkompilasi beberapa program C sederhana dan menjalankannya menggunakan 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
Gunakan emscripten/binaryen untuk mengkompilasi beberapa program C SDL dan menjalankannya menggunakan 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 menyertakan driver pengujian runtest.py
yang dapat digunakan untuk menjalankan pengujian dari spesifikasi WebAssembly.
Lihat spesifikasinya:
git clone https://github.com/WebAssembly/spec
Anda memerlukan wat2wasm
untuk mengkompilasi tes spesifikasi. Check-out dan bangun wabt (wabbit):
git clone --recursive https://github.com/WebAssembly/wabt
make -C wabt gcc-release
Jalankan file pengujian func.wast
(untuk menguji pemanggilan fungsi) dari spesifikasi:
./runtest.py --wat2wasm ./wabt/out/gcc/Release/wat2wasm --interpreter ./wac spec/test/core/func.wast
Jalankan semua pengujian spesifikasi selain beberapa pengujian yang saat ini gagal (sebagian besar karena runtest.py
tidak memiliki dukungan untuk beberapa sintaksis yang digunakan dalam file pengujian tersebut):
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 dan wace dapat dibuat untuk dijalankan sebagai program bootable mandiri menggunakan fooboot:
cd wac
git clone https://github.com/kanaka/fooboot
make PLATFORM=fooboot clean
make PLATFORM=fooboot wac wace examples_wat/addTwo.wasm
Skrip fooboot/runfoo
dapat digunakan untuk mem-boot wac/wace dengan QEMU. fooboot/runfoo
juga membuat koneksi pada port serial (COM2) yang memungkinkan file dibaca dari sistem host:
fooboot/runfoo wac --repl examples_wat/addTwo.wasm
QEMU waiting for connection on: disconnected:tcp:localhost:21118,server
webassembly> addTwo 2 3
0x5:i32
Pembuatan wac/wace mandiri juga dapat dibuat menjadi image ISO yang dapat melakukan booting langsung pada perangkat keras sebenarnya. Anda memerlukan Grub 2 dan file biner Grub PC/BIOS (grub-pc-bin) dan program xorriso untuk dapat melakukan ini. Selain itu, modul wasm yang ingin Anda jalankan harus dibangun ke dalam biner untuk menjadi bagian dari sistem file dalam memori yang sederhana:
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
Anda sekarang dapat mem-boot ISO dengan QEMU seperti ini:
qemu-system-i386 -cdrom boot.iso
Atau Anda dapat membakar ISO ke perangkat USB dan melakukan booting dari perangkat tersebut pada perangkat keras sebenarnya. Ini akan menghancurkan semua data di perangkat USB! Selain itu, pastikan sepenuhnya bahwa /dev/MY_USB_DEVICE benar-benar perangkat USB yang ingin Anda timpa dan bukan hard drive Anda. Anda telah diperingatkan!
sudo dd if=boot.iso of=/dev/MY_USB_DEVICE && sync
# Now boot you can boot from the USB device
MPL-2.0 (lihat LISENSI).