ข้ามไปยังเนื้อหา

Languages to Wasm

การเขียน WAT ด้วยมือเป็นวิธีที่ดีในการเรียนรู้ Execution Model ของ Wasm แต่ในทางปฏิบัติคุณจะคอมไพล์จาก ภาษาโปรแกรมจริง คอมไพเลอร์จะจัดการ Register Allocation, Memory Layout และ Binary Encoding ให้ — คุณเพียงแค่เขียนโค้ดตามสไตล์ของภาษานั้น แล้วได้ไฟล์ .wasm ออกมา

module นี้ครอบคลุม Toolchain สี่ตัวที่ใช้บ่อยที่สุดในปัจจุบัน เปรียบเทียบข้อดีข้อเสีย และให้คำสั่ง Build จริงของแต่ละตัว

ภาษาToolchainขนาด Outputเหมาะกับ
Rustwasm-pack / wasm-bindgenเล็ก (ไม่มี GC, ไม่มี Runtime)โค้ด Wasm ใหม่, แพ็กเกจ npm
C / C++Emscripten (emcc)กลาง–ใหญ่ (มี libc emulation)Port ไลบรารี C/C++ ที่มีอยู่
AssemblyScriptascเล็กมากนักพัฒนา TypeScript, module เรียบง่าย
TinyGotinygo buildเล็กนักพัฒนา Go, ไมโครคอนโทรลเลอร์
flowchart LR
  subgraph Sources
    R["Rust<br/>.rs files"]
    C["C / C++<br/>.c .cpp files"]
    AS["AssemblyScript<br/>.ts files"]
    TG["TinyGo<br/>.go files"]
  end
  subgraph Toolchain
    WP["wasm-pack<br/>(wasm-bindgen)"]
    EM["Emscripten<br/>(emcc)"]
    ASC["asc<br/>(AssemblyScript compiler)"]
    TIGO["tinygo build"]
  end
  subgraph Output
    WASM[".wasm binary"]
    GLUE["JS glue (optional)"]
  end
  R --> WP --> WASM
  C --> EM --> WASM
  C --> EM --> GLUE
  AS --> ASC --> WASM
  TG --> TIGO --> WASM
ภาษา → Toolchain → .wasm

Rust กับ wasm-bindgen สร้าง JS/Wasm Binding อย่างละเอียดอัตโนมัติ คุณสามารถส่ง String, JS Object และ Callback ข้ามขอบเขตได้โดยไม่ต้องเขียน Glue Code เอง ขนาด Binary เล็กเพราะ Rust ไม่มี Garbage Collector หรือ Runtime Heap

Emscripten จำลองสภาพแวดล้อม POSIX-like ไว้ใน Wasm ซึ่งหมายความว่าโค้ด C ที่ใช้ printf, malloc หรือ File I/O มักคอมไพล์ได้โดยไม่ต้องแก้ไข ข้อแลกเปลี่ยนคือ Output มีขนาดใหญ่กว่าเพราะรวม libc emulation และ JS Loader ที่อาจซับซ้อน

AssemblyScript คอมไพล์ TypeScript Subset ลงสู่ Wasm โดยตรง ไม่จำเป็นต้องเรียนภาษาใหม่ — หากรู้จัก TypeScript แล้วก็เริ่มได้ทันที คอมไพเลอร์เร็วและผลิต Binary ขนาดเล็กมาก

TinyGo คอมไพล์ Go Subset ลงสู่ Wasm (และไมโครคอนโทรลเลอร์) เหมาะกับทีมที่เขียน Go อยู่แล้วและต้องการแชร์โลจิกกับ Web Frontend ทว่าไม่รองรับ Standard Library บางแพ็กเกจ

Toolchain ใดเหมาะที่สุดสำหรับการ Port ไลบรารี C ที่มีอยู่แล้วลงสู่ Wasm?
เหตุใด Rust จึงผลิต Wasm Binary ขนาดเล็กกว่า Emscripten โดยค่าเริ่มต้น?
AssemblyScript ออกแบบมาสำหรับนักพัฒนาที่รู้จักภาษาใดเป็นอย่างดี?