مترجم Minimal 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. في نظام Ubuntu/Debian 64 بت، يمكن تثبيت هذه العناصر على النحو التالي:
dpkg --add-architecture i386
apt-get update
apt-get install lib32gcc-4.9-dev libSDL2-dev:i386 libedit-dev:i386
لتجميع ملفات مصدر Watt إلى وحدات Wasm الثنائية، ستحتاج إلى برنامج wasm-as
من Binaryen. لتجميع برامج C إلى وحدات Wasm، ستحتاج إلى Binaryen وemscripten.
كبديل لتنزيل الأدوات المذكورة أعلاه وإنشائها، تحتوي صورة kanaka/wac
docker image (1.7 جيجابايت) على مترجم/مكتبات gcc 32 بت وemscripten وbinaryen مثبتة مسبقًا. يمكن بدء صورة عامل الإرساء بتركيبات الملفات المناسبة مثل هذا:
docker run -v `pwd`:/wac -w /wac -it kanaka/wac bash
يمكن تشغيل جميع أوامر الإنشاء أدناه داخل حاوية عامل الإرساء.
بناء واك:
$ make wac
استخدم wasm-as
لتجميع برنامج Watm بسيط إلى 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
لتجميع برنامج Watt الذي يستخدم واجهة 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 (انظر الترخيص).