ล่าม WebAssembly ขั้นต่ำที่เขียนด้วยภาษา C รองรับเวอร์ชัน WebAssembly MVP (ผลิตภัณฑ์ที่ใช้งานได้ขั้นต่ำ) ของข้อกำหนด WebAssembly
wac มีสามรุ่นที่แตกต่างกัน:
wat2wasm
หรือ wasm-as
ผ่านการทดสอบข้อมูลจำเพาะส่วนใหญ่ นอกเหนือจากการทดสอบการนำเข้า/ส่งออกหลายโมดูล-s SIDE_MODULE=1 -s LEGALIZE_JS_FFI=0
) ในการสร้าง wac/wax/wace คุณต้องมี gcc เวอร์ชัน 32 บิต และ SDL2 และ libedit เวอร์ชัน 32 บิต บน Ubuntu/Debian 64 บิต สามารถติดตั้งได้ดังนี้:
dpkg --add-architecture i386
apt-get update
apt-get install lib32gcc-4.9-dev libSDL2-dev:i386 libedit-dev:i386
ในการรวบรวมไฟล์ต้นฉบับ wat ไปยังโมดูล binary wasm คุณจะต้องมีโปรแกรม wasm-as
จาก Binaryen ในการคอมไพล์โปรแกรม C ให้เป็นโมดูล wasm คุณจะต้องมี Binaryen และ emscripten
แทนที่จะดาวน์โหลดและสร้างเครื่องมือข้างต้น อิมเมจนักเทียบท่า kanaka/wac
(1.7GB) มีคอมไพเลอร์/ไลบรารี gcc แบบ 32 บิต, emscripten และ binaryen ที่ติดตั้งไว้ล่วงหน้า อิมเมจนักเทียบท่าสามารถเริ่มต้นด้วยการเมานต์ไฟล์ที่เหมาะสมดังนี้:
docker run -v `pwd`:/wac -w /wac -it kanaka/wac bash
คำสั่ง build ทั้งหมดด้านล่างนี้สามารถเรียกใช้ภายในคอนเทนเนอร์นักเทียบท่าได้
สร้างวัค:
$ 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
เพื่อคอมไพล์โปรแกรม wat ที่ใช้อินเตอร์เฟส WASI:
$ 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
เพื่อรวบรวมการทดสอบข้อมูลจำเพาะ เช็คเอาท์และสร้าง wabbit (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
สามารถใช้เพื่อบูต 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
MPL-2.0 (ดูใบอนุญาต)