11 คะแนน โดย GN⁺ 2025-05-10 | 2 ความคิดเห็น | แชร์ทาง WhatsApp
  • มีการประกาศ สเปก Wasm 2.0 อย่างเป็นทางการ
  • Wasm Community และ Working Groups ได้ทำสเปกให้เสร็จสมบูรณ์ตั้งแต่ปี 2022 และ implementation หลัก ๆ ก็รองรับ 2.0 กันอยู่แล้ว
  • ตั้งแต่ 2.0 เป็นต้นไป มีการนำ โมเดลเอเวอร์กรีน มาใช้ ทำให้เอกสาร Candidate Recommendation ถูกอัปเดตให้ทันสมัยอยู่เสมอ
  • เมื่อมีการประกาศเวอร์ชันใหม่ จะไม่ย้ายไปเป็นข้อแนะนำฉบับสุดท้ายทุกครั้ง แต่ถือว่าร่างข้อแนะนำปัจจุบันเป็นมาตรฐาน

ฟีเจอร์หลักและสิ่งที่เพิ่มเข้ามาใน Wasm 2.0

  • คำสั่งเวกเตอร์ (SIMD): เพิ่มคำสั่งใหม่ 236 รายการ เพื่อใช้ความสามารถ SIMD 128 บิตของ CPU สมัยใหม่ได้อย่างเต็มที่ เหมาะกับงานอย่าง codec เสียง/วิดีโอประสิทธิภาพสูง, machine learning, การเข้ารหัสลับ เป็นต้น
  • คำสั่งหน่วยความจำแบบกลุ่ม (Bulk Memory): เพิ่มชุดคำสั่งที่ช่วยให้คัดลอกและกำหนดค่าเริ่มต้นให้หน่วยความจำและตารางได้อย่างรวดเร็ว
  • การคืนค่าหลายค่า (Multi-value Return): ฟังก์ชันและบล็อกสามารถคืนค่าหลายค่าได้ ทำให้ calling convention ดีขึ้น และเปิดทางให้มีการแปลงโปรแกรมเพิ่มเติม
  • Reference Types: รองรับการอ้างอิงถึงฟังก์ชันหรือพอยน์เตอร์ไปยังอ็อบเจ็กต์ภายนอก (เช่น ค่าใน JavaScript) ในรูปแบบค่า first-class แบบ opaque โดยสามารถใช้ตารางเป็นที่เก็บค่าอ้างอิงเหล่านี้ได้ และรองรับคำสั่งสำหรับจัดการตารางรวมถึงการกำหนดหลายตาราง
  • การแปลงแบบไม่เกิด trap (Non-trapping Conversions): เพิ่มคำสั่งแปลงค่าจาก floating point เป็น integer โดยไม่ทำให้เกิด trap ที่ไม่คาดคิด
  • คำสั่งขยายเครื่องหมาย (Sign-extension Operators): เพิ่มคำสั่งสำหรับขยายความกว้างของ signed integer ได้โดยตรง ทำให้ไม่ต้องเข้าถึงหน่วยความจำเพื่อขยายค่าเหมือนก่อน

ความเข้ากันได้ย้อนหลังและแนวโน้มในอนาคต

  • Wasm 2.0 เข้ากันได้อย่างสมบูรณ์กับ 1.0 ทำให้โปรแกรมเดิมยังทำงานได้เหมือนเดิม
  • Wasm 3.0 ก็มีกำหนดเปิดตัวในเร็ว ๆ นี้

2 ความคิดเห็น

 
caniel 2025-05-10

WA!(SM)

 
GN⁺ 2025-05-10
ความเห็นจาก Hacker News
  • หากสรุปข่าวการประกาศ WASM 2.0 เมื่อเดือนมีนาคม 2025 ก็คือ เป็นการอัปเกรดครั้งใหญ่ด้วยคำสั่งเวกเตอร์ใหม่ 236 รายการ เช่น 128-bit SIMD ที่ช่วยเพิ่มประสิทธิภาพให้แอปพลิเคชันด้านวิดีโอ/เสียงโคเดก, แมชชีนเลิร์นนิง และการเข้ารหัสอย่างมาก, มีคำสั่ง bulk memory สำหรับคัดลอก/กำหนดค่าเริ่มต้นหน่วยความจำอย่างรวดเร็ว, ตอนนี้ฟังก์ชันสามารถคืนค่าหลายค่าได้เพื่อรองรับ calling convention ที่เร็วขึ้นและลดการอ้างอิงทางอ้อม, มี reference types ที่ทำให้พอยน์เตอร์ไปยังอ็อบเจ็กต์ภายนอก (เช่นค่าใน JavaScript) เป็นค่า first-class, สามารถประกาศตารางได้หลายชนิด, และยังเพิ่มคำสั่งขยายความกว้างบิตรวมถึงการแปลงเลขทศนิยมที่ไม่เกิด trap แบบไม่คาดคิดอีกด้วย
    • Rust+LLVM ยังไม่สามารถใช้การคืนค่าหลายค่าได้จริงในตอนนี้ เพราะมีปัญหาเรื่อง ABI compatibility, ส่วนฝั่ง Clang ไม่ค่อยแน่ใจว่าสถานการณ์เป็นอย่างไร
    • ส่วนของคำสั่งเวกเตอร์ (SIMD) ดูเหมือนจะซับซ้อนขึ้นเพราะไล่ตามการ optimize เร็วเกินไป ถ้าใช้ข้อเสนอ flexible-size vectors ไปเลยก็น่าจะสง่างามกว่านี้
    • ความสามารถในการคืนค่าหลายค่าน่าจะ มีประโยชน์ มากกับการพัฒนา Common Lisp runtime
    • ตอนท้ายโพสต์ทางการเขียนไว้ว่า “จะแนะนำ Wasm 3.0 เร็ว ๆ นี้” ดังนั้นดูเหมือนว่า Wasm 3.0 จะมาในอนาคตอันใกล้จริง ๆ
    • ISA ที่เป็นอิสระจากสถาปัตยกรรมและใช้งานได้ทั่วไป กับ ISA ที่รีดการใช้ SIMD เฉพาะ CPU ให้มากที่สุดนั้นไปด้วยกันไม่ได้ ต้องเลือกอย่างใดอย่างหนึ่ง ตอนนี้ยังเช็กไม่ได้ว่า SIMD instruction ของ Wasm2 มีความเป็นสากลพอหรือไม่ เพราะติด rate limit ของ GitHub
  • สเปกของ WebAssembly ค่อนข้างอ่านง่าย แต่ถ้าเป็นมือใหม่ที่ไม่อยากอ่านสเปกเต็ม ขอแนะนำหนังสือออนไลน์ชื่อ WebAssembly from the Ground Up ซึ่งให้เรียนแบบลงมือทำทีละขั้นด้วยการสร้างคอมไพเลอร์ด้วย JavaScript เอง มีตัวอย่างฟรีด้วย และขอแจ้งไว้ก่อนว่าฉันเป็นหนึ่งในผู้เขียน
    • ส่วนตัวที่ชอบ Ada ก็เพราะเรื่องที่ใน JavaScript ต้องเขียนโค้ดเช็ก U32 ที่ยุ่งยาก แต่ใน Ada จัดการได้อย่างเรียบร้อยมากด้วย subtype หรือโมดูล
    • สงสัยว่าสามารถทำ in-process debugging ได้ด้วยการ instrument โค้ด WASM หรือไม่ คือสงสัยว่าสามารถแปลงภาษาคัสตอมเป็น WASM แบบเรียลไทม์ แล้วทำ break point กับ memory inspection บนเว็บได้ครบในที่เดียวหรือเปล่า
  • ช่วง 1 ปีที่ผ่านมาได้ทำงานพัฒนา WebAssembly runtime และประทับใจกับ ความเข้มงวดของสเปก กับชุดทดสอบที่จัดเตรียมไว้อย่างดี ต้องใช้เวลาทำความคุ้นเคยพอสมควร แต่พอเข้าใจแล้วจะพบว่าเป็นสเปกภาษาที่ชาญฉลาดมาก ในกรณีที่คลุมเครือ reference interpreter ที่สร้างตรงจากสเปกช่วยได้มาก และสเปกเทสต์สำหรับตรวจสอบความสอดคล้องก็มีประโยชน์มากเช่นกัน
  • ช่วงหลังข้อเสนอ Wasm Constant Time ถูกย้ายไปสถานะ inactive แล้ว งานจริงส่วนใหญ่เกิดขึ้นตั้งแต่ปี 2018 แต่การเชื่อมกับ SIMD และการรวมเป็นส่วนขยายทางการยังถูกเลื่อนออกไป หากไม่มีใครมารับช่วงงานที่สำคัญมากนี้ต่อ การเข้ารหัสทั้งหมดบน Wasm จะยังเปราะบางต่อ time attack (timing attack) อย่างมาก
  • น่าสนใจที่ Wasm เป็นคำย่อของ WebAssembly แต่ไม่ใช่อักษรย่อแบบ acronym จึงไม่ได้เขียนเป็นตัวใหญ่ WASM
    • ถ้าใช้ตรรกะแบบนั้น งั้นควรเป็น WAsm หรือเปล่า
    • ที่จริงแม้จะเป็น acronym ก็มีหลายคำที่เขียนตัวเล็กทั้งหมดอยู่แล้ว (เช่น scuba, radar, laser)
    • ขอให้มันเวิร์กนะ 555
  • อยากรู้ว่ามีรายการ แอป WASM ที่ใช้งานได้จริง อะไรบ้าง ไอเดียมันดี แต่ให้ความรู้สึกคล้าย DAPPs ที่เหมือนมีไว้ “เพื่อความสนุก” มากกว่า ถ้ามีตัวอย่างใช้งานจริงก็น่าจะดี
    • ขอแนะนำ madewithwebassembly.com และ GitHub ชื่อ Awesome-WebAssembly-Applications เป็นแหล่งรวมแอป WASM จริงที่จัดไว้ดีมาก
  • รีลีส WASM2 ครั้งนี้ยอดเยี่ยม แต่ก็ยังเสียดายที่เลือกใช้ fixed-size SIMD (128 บิต) ถ้าเป็นแนวทางยืดหยุ่นแบบที่คอมไพเลอร์ปรับความกว้าง SIMD ตามประสิทธิภาพอุปกรณ์เหมือน ARM SVE น่าจะดีกว่า
    • แต่ผมกลับคิดว่า fixed-size SIMD เปิดโอกาสการใช้งานได้มากกว่า คำสั่งเวกเตอร์สามารถแทนด้วย fixed-size SIMD ได้ค่อนข้างง่ายอยู่แล้ว ไม่ใช่ว่าทุกกรณีจะต้องมี SIMD แต่ก็มีการใช้งานแบบ opportunistic จำนวนมากที่อาศัยขนาดรีจิสเตอร์เพื่อให้เกิดการเวกเตอร์ไรซ์ ซึ่งในกรณีแบบนี้มันมีประโยชน์มาก
    • การ optimize เร็วเกินไปต่างหากที่เป็นรากของปัญหา ประเด็น SIMD นี้ก็คงจะสง่างามกว่ามากถ้ายึดตาม ข้อเสนอเวกเตอร์ขนาดแปรผัน อย่างเดียว
  • สงสัยว่าตอนที่ฟังก์ชัน C คืนค่าเป็น struct จะคอมไพล์เป็น WASM ได้หรือไม่
    • ทำได้ แต่เท่าที่ทราบตอนนี้ยัง “export” ไปยัง JS ไม่ได้
  • สงสัยว่ามี runtime ไหนบ้างที่รองรับความสามารถของ WASM2 แล้ว
    • ส่วนใหญ่รองรับกันมานานแล้ว ชุมชน Wasm และ working group ได้ปิดสเปกตั้งแต่ต้นปี 2022 และ implementation หลัก ๆ ก็ให้ 2.0 มาก่อนหน้านั้นแล้ว ส่วน 3.0 ก็มีแนวโน้มจะเป็นทางการในไม่ช้า และบางฟีเจอร์ก็มีให้ใช้แล้วผ่าน feature flag
  • มองว่า bytecode สำหรับเว็บเป็นความฝันเก่าแก่ ในฐานะนักพัฒนา C# ประทับใจที่ Blazor เป็นผู้นำการใช้ WASM อย่างกล้าหาญมาตั้งแต่ช่วงแรก ๆ และ .NET ก็ไปไกลมากบน WASM แล้ว กำลังตั้งตารอการเปลี่ยนแปลงใน 2.0 ครั้งนี้