wabt — The Binary Toolkit
นักพัฒนามักหยิบ WABT ขึ้นมาใช้เมื่อต้องแปลงไปมาระหว่าง .wat กับ .wasm, ตรวจสอบ binary ที่ compile มาจากเครื่องมืออื่นว่าเนื้อในมีอะไรบ้าง หรือ validate module ก่อน deploy จริง
wabt — WebAssembly Binary Toolkit — คือ reference implementation ของ WAT text format งานแปลง ตรวจสอบ หรือ validate ใดก็ตามที่เกี่ยวข้องกับ text ↔ binary boundary จะผ่านหนึ่งในสี่โปรแกรมหลักของตัวเอง
wat2wasm
หัวข้อที่มีชื่อว่า “wat2wasm”wat2wasm คือ compiler หลัก ทำหน้าที่แยกวิเคราะห์ต้นฉบับ .wat, type-check และ emit binary .wasm ที่ถูกต้อง flags ที่มีประโยชน์ได้แก่ --debug-names (เก็บ annotation $name ไว้ใน name section ของ binary) และ --output / -o เพื่อควบคุมไฟล์ output
# การคอมไพล์พื้นฐานwat2wasm add.wat -o add.wasm
# เก็บ debug names ไว้ใน binarywat2wasm add.wat --debug-names -o add.debug.wasm
# Validate เท่านั้น ไม่เขียน outputwat2wasm add.wat --no-check=false --output=/dev/nullwasm2wat
หัวข้อที่มีชื่อว่า “wasm2wat”wasm2wat ทำ process ย้อนกลับ: อ่าน binary .wasm และ emit WAT text ที่อ่านได้ สิ่งนี้มีค่ามากเมื่อคุณต้องการตรวจสอบว่า compiler ระดับสูง (Emscripten, wasm-pack ฯลฯ) ผลิตอะไรออกมาจริงๆ
# Disassemble ไปยัง stdoutwasm2wat add.wasm
# Disassemble ไปยังไฟล์wasm2wat add.wasm -o add.wat
# รวม source locations จาก DWARF sectionwasm2wat add.wasm --generate-nameswasm-objdump
หัวข้อที่มีชื่อว่า “wasm-objdump”wasm-objdump แสดง metadata ที่มีโครงสร้างเกี่ยวกับไฟล์ .wasm — การจัดเรียง section, imports, exports และ function signatures — โดยไม่ต้องสร้าง WAT disassembly ทั้งหมด ใช้ -x สำหรับสรุปทั้งหมด หรือ -d เพื่อ disassemble เฉพาะ code section
# สรุป section ทั้งหมดwasm-objdump -x add.wasm
# Disassemble code section เท่านั้นwasm-objdump -d add.wasm
# แสดงเฉพาะ export sectionwasm-objdump -j export add.wasmผลลัพธ์ -x โดยทั่วไปมีลักษณะดังนี้:
add.wasm: file format wasm 0x1
Section Details:
Type[1]: - type[0] (i32, i32) -> i32Function[1]: - func[0] sig=0Export[1]: - func[0] <add> -> "add"Code[1]: - func[0] size=7wasm-validate
หัวข้อที่มีชื่อว่า “wasm-validate”wasm-validate ตรวจสอบว่า binary เป็นไปตามข้อกำหนด WebAssembly โดยจะออกด้วย code 0 เมื่อสำเร็จและแสดง diagnostic เมื่อล้มเหลว ใช้ใน CI เพื่อตรวจจับ module ที่เสียหายหรือไม่ถูกต้องก่อนที่จะถึง production
# Validate โมดูลwasm-validate add.wasm# → add.wasm: OK
# Validate โมดูลพร้อม future proposalwasm-validate --enable-threads shared.wasmRun it — magic bytes และความยาว binary
หัวข้อที่มีชื่อว่า “Run it — magic bytes และความยาว binary”สี่ไบต์แรกที่ offset 0 ของทุกไฟล์ .wasm ที่ถูกต้องคือ 00 61 73 6d — module magic (\0asm) runnable ด้านล่างคอมไพล์ module WAT ขั้นต่ำและแสดงทั้งความยาว binary และสี่ magic bytes เหล่านั้น
ข้อแลกเปลี่ยน
หัวข้อที่มีชื่อว่า “ข้อแลกเปลี่ยน”| ตัวเลือก | Benefit | Cost |
|---|---|---|
wasm-opt -Oz (การ optimise เชิงรุกสุด หลัง wat2wasm) | ได้ size และ speed ที่ดีที่สุด | build time นานขึ้น และ binary ที่ได้ห่างไกลจาก .wat ต้นฉบับจน debug ยากขึ้น |
เก็บ --debug-names ไว้ตอน wat2wasm | wasm2wat/wasm-objdump แสดงชื่อฟังก์ชันที่อ่านออกได้ | เพิ่มขนาด binary ที่ต้อง ship ให้ผู้ใช้จริง |
ข้อผิดพลาดที่พบบ่อย
หัวข้อที่มีชื่อว่า “ข้อผิดพลาดที่พบบ่อย”- คอมไพล์
.watเป็น.wasmแล้ว ship ตรงๆ โดยไม่ผ่านwasm-optเลย พลาดการลดขนาดที่ได้มาแทบฟรีๆ - รัน
wasm-validateหลังจาก deploy ไปแล้ว แทนที่จะ validate ทุก module ใน CI ก่อน ship เสมอ - เปิด
--debug-namesทิ้งไว้ใน production build โดยไม่คิดเรื่อง trade-off ของขนาด binary ที่เพิ่มขึ้น
💡 ตัวอย่างจากของจริง
Emscripten เรียก
wasm-optของ Binaryen ให้อัตโนมัติหลังขั้นตอนที่เทียบเท่ากับwat2wasmเมื่อ build ด้วย-O2/-O3ส่วนทีมที่ ship ไปที่ Cloudflare Workers/CDN มักใช้wasm-validateเป็นด่านบังคับใน CI ก่อน deploy ทุกครั้ง