2 คะแนน โดย GN⁺ 2025-02-05 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

WebAssembly คืออะไร?

  • WebAssembly คือชุดคำสั่งและรูปแบบไบต์โค้ดที่ผ่านการทำให้เป็นมาตรฐาน ซึ่งออกแบบมาเพื่อรันโค้ดฝั่งไคลเอนต์ที่ไม่น่าเชื่อถือในเว็บเบราว์เซอร์ด้วยความเร็วใกล้เคียงเนทีฟ
  • มันพัฒนาต่อยอดมาจาก Emscripten ซึ่งเป็นคอมไพเลอร์จาก C/C++ ไปเป็น JavaScript โดยในช่วงแรกใช้การแปลง LLVM IR เป็น JavaScript เพื่อให้สามารถรันโค้ด C และ C++ บนเว็บได้
  • เมื่อเวลาผ่านไป นักพัฒนาเบราว์เซอร์ได้ร่วมมือกับโครงการ Emscripten เพื่อสร้างส่วนย่อยของ JavaScript ที่เรียบง่ายสำหรับการปรับแต่งประสิทธิภาพ และสิ่งนี้ก็ถูกทำให้เป็นมาตรฐานในชื่อ asm.js
  • หลังจากนั้น เพื่อหลีกเลี่ยงโอเวอร์เฮดของ JavaScript จึงมีการออกแบบรูปแบบไบต์โค้ดแบบอิสระขึ้นมา และนั่นก็คือ Wasm
  • ช่วงหลังมานี้ WebAssembly ได้รับความนิยมเพิ่มขึ้นนอกเหนือจากในเบราว์เซอร์ด้วย โดย Fastly และ Shopify ได้สร้างผลิตภัณฑ์ Edge Compute และ Functions บนพื้นฐานของเอนจิน WebAssembly
  • WebAssembly เป็นแพลตฟอร์มที่น่าสนใจสำหรับการสร้างระบบนิเวศของปลั๊กอิน เนื่องจากสามารถใช้เป็นเป้าหมายจากซอร์สภาษาได้หลากหลาย

ทำไมต้องเป็นอินเทอร์พรีเตอร์ WebAssembly?

  • เช่นเดียวกับวิศวกรซอฟต์แวร์หลายคน ผู้เขียนมักติดอยู่ในรูปแบบของการเริ่มโปรเจกต์งานอดิเรกใหม่ แล้วไม่กี่สัปดาห์ต่อมาก็หมดความสนใจ
  • จึงต้องการโปรเจกต์ขนาดใหญ่ที่สามารถทุ่มเทได้อย่างต่อเนื่อง และเปิดโอกาสให้ได้สัมผัสกับส่วนล่างของสแตกการประมวลผล
  • ผู้เขียนเริ่มสนใจในกระแสของ WebAssembly และมองว่ามันเป็นเครื่องมือด้าน platform engineering ที่น่าสนใจ เพราะสามารถออกแบบ system call แบบกำหนดเองได้

Semblance

  • เพื่อทำความคุ้นเคยกับ WebAssembly Core Specification ผู้เขียนจึงตัดสินใจเขียนอินเทอร์พรีเตอร์ WebAssembly ขึ้นมา
  • เนื่องจากเป้าหมายของโปรเจกต์คือการเรียนรู้ จึงไม่ได้วางแผนจะรองรับทุก opcode หรือผ่านชุดทดสอบหลักทั้งหมด
  • หากสามารถรัน "Hello, World!" ได้ ก็ถือว่าน่าพอใจแล้ว

ผลลัพธ์

  • โปรเจกต์นี้ถือว่าประสบความสำเร็จอย่างมาก แม้ว่าการครอบคลุม opcode จะยังไม่สมบูรณ์ แต่ก็สามารถรันโปรแกรม "Hello, World!" แบบง่ายได้
  • โค้ดอาจจะรก ช้า มี memory leak และอาจเปราะบางต่อโมดูลที่ประสงค์ร้าย แต่ก็ใช้งานได้จริง
  • ผู้เขียนได้เรียนรู้มากมายเกี่ยวกับสเปกหลักของ WebAssembly และสามารถก้าวออกจากพื้นที่ที่ตนเองคุ้นเคยในฐานะวิศวกรได้
  • ตอนนี้ผู้เขียนรู้สึกว่าตนมีความรู้เกี่ยวกับ WebAssembly มากพอที่จะเริ่มมีส่วนร่วมกับรันไทม์ระดับอุตสาหกรรมอย่าง Wasmtime ได้แล้ว

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

 
GN⁺ 2025-02-05
ความคิดเห็นจาก Hacker News
  • เคยมีประสบการณ์เขียน Wasm interpreter ด้วย Scheme เลยดีใจที่ได้เห็นคนอื่นลงมือเขียนเอง Wasm ไม่ได้ยากอย่างที่คิด และแนะนำให้ลองทำเท่าที่สนุกโดยไม่จำเป็นต้องรองรับทุกคำสั่ง

    • คำแนะนำสำหรับผู้เขียน: ใน spec-test มี textual wasm ที่ซับซ้อนรวมอยู่ แต่ถ้าใช้ตัวแปลง wast2json ก็จะได้คำอธิบายแบบ JSON ที่ง่ายกว่าและไฟล์ binary wasm ทั่วไป
  • คำถามจากมือใหม่:

    • สงสัยว่าถ้าไม่ได้เขียน interpreter เอง จะดีบักกันอย่างไร
    • สงสัยว่าการ fuzzing opcode ของสตริงมีประสิทธิภาพแค่ไหน
    • สงสัยว่าความแตกต่างในทางปฏิบัติระหว่าง WASM engine ฝั่งเซิร์ฟเวอร์กับ engine บนเบราว์เซอร์มีมากแค่ไหน และถ้าจะแปลงตัวหนึ่งไปเป็นอีกตัวต้องใช้แรงงานมากเพียงใด
  • เจอบทความที่น่าสนใจเกี่ยวกับการตีความ WASM ด้วยตัวเอง

    • จากจุดนั้นได้สร้าง https://github.com/peterseymour/winter และได้เรียนรู้ว่า WASM ไม่ได้เรียบง่ายอย่างที่คิด
  • เป็นแนวทางที่น่าสนใจและเป็นงานที่ยอดเยี่ยม

  • คิดว่าการนำ Wasm-C-API มาใช้เป็นอินเทอร์เฟซมาตรฐานน่าจะเป็นความคิดที่ดี

    • เป็น API ที่ Wasm runtime ส่วนใหญ่ (Wasmmer, V8, wasmi เป็นต้น) นำมาใช้ และเพราะเขียนด้วย C นักพัฒนาที่คุ้นกับ API นี้จึงสามารถลองใช้งานได้ง่าย
    • ถ้าผู้เขียนคุ้นเคยกับ Wasm อยู่แล้ว การช่วยส่งแพตช์หรือปรับปรุงให้ Wasmer ก็น่ายินดีเช่นกัน
  • ประเด็นที่อาจถกเถียงได้:

    • สงสัยว่าสนใจเพิ่มคำสั่ง tail call แบบดั้งเดิมหรือไม่
    • ผู้ดูแลสเปก WASM ปฏิเสธเรื่องนี้โดยบอกว่าเป็นเรื่อง "ระดับสูง" แต่คณะกรรมการภาษา C ก็เคยปฏิเสธข้อเสนอของ Dennis Ritchie เช่นกัน และ Rob Pike ก็ดูจะสนับสนุนแนวทางของ Ritchie ถ้าไม่ใช่แล้วจะสร้าง Golang ขึ้นมาทำไม? tail call จะเป็นเรื่องระดับสูงก็ต่อเมื่อการเรียกเป็นเรื่องระดับสูงเท่านั้น
  • แนะนำให้ลองดู Orca น่าจะเป็นโอกาสดีในการมีส่วนร่วม: https://orca-app.dev

  • การได้เห็นกระบวนการเจาะลึก WebAssembly และสร้าง interpreter ขึ้นมาตั้งแต่ศูนย์นั้นยอดเยี่ยมมาก

  • เป็นบทความที่ยอดเยี่ยม และทำให้อยากกลับไปทำงานด้านการ implement WASM อีกครั้ง

  • เป็นงานที่เจ๋งมากจริงๆ