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 ความคิดเห็น
ความคิดเห็นจาก Hacker News
เคยมีประสบการณ์เขียน Wasm interpreter ด้วย Scheme เลยดีใจที่ได้เห็นคนอื่นลงมือเขียนเอง Wasm ไม่ได้ยากอย่างที่คิด และแนะนำให้ลองทำเท่าที่สนุกโดยไม่จำเป็นต้องรองรับทุกคำสั่ง
คำถามจากมือใหม่:
เจอบทความที่น่าสนใจเกี่ยวกับการตีความ WASM ด้วยตัวเอง
เป็นแนวทางที่น่าสนใจและเป็นงานที่ยอดเยี่ยม
คิดว่าการนำ Wasm-C-API มาใช้เป็นอินเทอร์เฟซมาตรฐานน่าจะเป็นความคิดที่ดี
ประเด็นที่อาจถกเถียงได้:
แนะนำให้ลองดู Orca น่าจะเป็นโอกาสดีในการมีส่วนร่วม: https://orca-app.dev
การได้เห็นกระบวนการเจาะลึก WebAssembly และสร้าง interpreter ขึ้นมาตั้งแต่ศูนย์นั้นยอดเยี่ยมมาก
เป็นบทความที่ยอดเยี่ยม และทำให้อยากกลับไปทำงานด้านการ implement WASM อีกครั้ง
เป็นงานที่เจ๋งมากจริงๆ