WebAssembly (หรือเรียกสั้นๆว่า WASM) เป็น Code ประเภทใหม่ที่สามารถทำงานบน Web Browser รุ่นใหม่ๆ ได้ เป็นภาษา Low Level Assembly ที่คล้ายๆ กับภาษาของ Assembly และมีรูปแบบของ Binary ที่กระชับ สามารถทำงานด้วยประสิทธิภาพใกล้เคียงกับภาษา C/C++ และ Rust ที่มีการ Compile เพื่อให้ทำงานบน Web Browser ได้ นอกจากนี้ยังออกแบบมาให้ทำงานร่วมกับ JavaScript ได้อีกด้วย
การพัฒนาเว็บด้วย WebAssembly เป็นทางเลือกให้สามารถรัน Code ที่เขียนด้วยภาษาที่หลากหลายบนเว็บได้ และช่วยให้งานบางอย่างที่มีการประมวลผลกราฟฟิก วิดิโอ หรือ การคำนวณตัวเลขเยอะๆ เร็วขึ้นด้วย
อีกทั้งไม่จำเป็นต้องเรียนรู้วิธีการเขียน Code WASM เพราะ โมดูล WebAssembly สามารถนำเข้าไปยังเว็บได้ และเปิดฟังก์ชันของ WebAssembly ให้ใช้งานผ่าน JavaScript เพื่อเพิ่มประสิทธิภาพและคุณลักษณะใหม่โดยที่ยังทำให้ฟังก์ชันสามารถใช้งานได้ง่ายและสะดวกสำหรับนักพัฒนาเว็บ
เป้าหมายของ WebAssembly
- มีความรวดเร็วและมีประสิทธิภาพสูง : สามารถทำงานได้บนหลากหลายแพลตฟอร์มใกล้เคียงกับความเร็วของภาษาnative โดยใช้ความสามารถของ Hardware
- มีความสามารถในการอ่านและ Debug : เป็นภาษา Low Level Assembly ในรูปแบบข้อความที่คนสามารถอ่านได้ ทำให้สามารถเขียนโค้ด ตรวจสอบและ debug ได้ด้วยตัวเอง
- มีการรักษาความปลอดภัย : WebAssembly อยู่ในสภาพแวดล้อมการดำเนินการแบบ Sandbox ที่ปลอดภัย และบังคับใช้นโยบายการอนุญาตและที่มาเดียวกันของ Browser เช่นเดียวกับเว็บโค้ดอื่นๆ
- ไม่ทำลายเว็บ : WebAssembly ถูกออกแบบให้เข้ากันได้อย่างสมบูรณ์กับเทคโนโลยีเว็บอื่น ๆ และรักษาความเข้ากันแบบย้อนหลังได้
แนวคิดหลักของ WebAssembly
- Module : แทนตัวเลข WebAssembly ที่ถูกคอมไพล์โดย Browser เป็นรหัสเครื่องที่สามารถเรียกใช้ได้ โมดูลไม่มีสถานะจึงเหมือนกับ Blob และสามารถแชร์ได้โดยเฉพาะระหว่าง windows และ workers (ผ่าน postMessage()) โมดูลประกาศการนำเข้าและการส่งออกเหมือนโมดูล ES
- Memory : ArrayBuffer ที่ปรับขนาดได้ของไบต์ที่ถูกอ่านและเขียนโดยคำสั่งการเข้าถึงหน่วยความจำระดับต่ำของ WebAssembly
- Table : Array Of References ที่ปรับขนาดได้ ไม่สามารถเก็บเป็น raw bytes ในหน่วยความจำได้ (เพื่อเหตุผลด้านความปลอดภัยและการพกพา)
- Instance : โมดูลที่จับคู่กับสถานะทั้งหมดที่ใช้ขณะรันไทม์ รวมถึงหน่วยความจำ ตาราง และชุดของค่าที่นำเข้า Instance เป็นเหมือนโมดูล ES ที่ถูกโหลดเข้าสู่กลุ่ม global เฉพาะด้วยชุดค่าที่นำเข้าเฉพาะ
ความแตกต่างระหว่างการพัฒนาเว็บแบบเดิม กับ WebAssembly
- Programming Languages: ในการพัฒนาเว็บแบบเดิมจะใช้ JavaScript เป็นภาษาโปรแกรมสำหรับ Script ฝั่ง Client เป็นหลัก HTML ใช้สำหรับจัดโครงสร้างเนื้อหา และ CSS ใช้สำหรับจัดรูปแบบ ในทางตรงกันข้าม WebAssembly สามารถเขียนภาษาต่างๆ เช่น C, C++, Rust และภาษาอื่นๆ เพื่อเขียน Code ที่ compile เป็นรูปแบบ Binary ทำให้สามารถเรียกใช้โค้ดประสิทธิภาพสูงใน Browser ควบคู่ไปกับ JavaScript
- Execution Model: ในการพัฒนาเว็บแบบเดิม Browser จะอ่านและประมวลผล JavaScript ที่เป็น Text เพื่อแสดงผลบนหน้าเว็บ Browser แต่ WebAssembly จะถูกอ่านทั้ง Module เป็นไฟล์ Binary แล้วประมวลผล
- Performance: JavaScript เป็น Interpreted Language (Code ถูกอ่านและประมวลผลบรรทัดต่อบรรทัดโดยตัวแปลภาษาซึ่งแปลและประมวลผลแต่ละคำสั่งในเวลาจริง) ส่วน WebAssembly ถูกออกแบบมาเพื่อประมวลผลที่มีประสิทธิภาพสูง สามารถประมวลผล Code ในความเร็วใกล้เคียงกับภาษาเครื่องได้
- Codebase And Libraries: ในการพัฒนาเว็บแบบเดิมขึ้นอยู่กับ Libraries และ Frameworks ของ JavaScript โดยมีระบบเครือข่ายขนาดใหญ่ของเครื่องมือที่มีอยู่สำหรับการสร้างแอปพลิเคชันเว็บ ส่วน WebAssembly เป็นเทคโนโลยีที่ใหม่กว่า มีระบบเครือข่ายขนาดเล็กกว่าเมื่อเทียบกับ JavaScript อย่างไรก็ตาม WebAssembly ก็สามารถใช้ Libraries และ Frameworks ของ JavaScript ที่มีอยู่ผ่านการประสานงานและการผูกข้อมูลเข้าด้วยกัน ซึ่งจะช่วยให้นักพัฒนาสามารถนำโค้ดมาใช้ซ้ำและรวมโมดูล WebAssembly เข้ากับแอปพลิเคชันได้
- Portability: WebAssembly เข้ากันได้กับหลายๆ แพลตฟอร์ม ซึ่งหมายความว่าโมดูล WebAssembly เดียวกันสามารถทำงานได้บนระบบปฏิบัติการและเบราว์เซอร์เว็บที่แตกต่างกันโดยไม่ต้องแก้ไข code
- Application Scope: ในการพัฒนาเว็บแบบเดิมเหมาะสำหรับเว็บแอปพลิเคชันที่หลากหลายตั้งแต่เว็บไซต์ง่าย ๆ ไปจนถึงเว็บแอปพลิเคชันที่ซับซ้อน ในขณะที่ WebAssembly มีการให้ความสำคัญกับประสิทธิภาพเหมาะสำหรับแอปพลิเคชันที่ต้องการการคำนวณที่ซับซ้อน เช่น เกม การประมวลผลสื่อ การแสดงข้อมูลแบบสตรีม และการจำลองทางวิทยาศาสตร์
บทสรุป
WebAssembly ยังถือว่าเป็นของใหม่อยู่และยังไม่นิ่ง เพราะถึงแม้ว่าจะเปิดตัวมาตั้งแต่ปี 2015 แต่จนถึงวันนี้ก็ยังอยู่ในสถานะที่กำลังออกแบบกันอยู่ ไม่เหมือนกับ JavaScript ที่มีมาตั้งนานแล้วและค่อนข้างที่จะนิ่ง แต่ถ้าถึงเวลาที่ WebAssembly ออกสู่สาธารณะเป็น Official Release และเริ่มมี Community ที่มากขึ้น ฟีเจอร์นี้ก็น่าจะถูกจับตามองอีกครั้งกับการใช้งานหนักๆ เช่น เกมหรืองานคำนวณ รวมทั้งงานที่เน้นกราฟฟิกหนักๆ
ที่มา:
https://developer.mozilla.org/en-US/docs/WebAssembly/Concepts