- เอนจิน JavaScript แบบน้ำหนักเบา ที่สร้างบนพื้นฐานของ PrimJS และคอมไพล์เป็น WebAssembly จึงปลอดภัยและพกพาได้ดีเยี่ยม
- มีโครงสร้างแซนด์บ็อกซ์ที่แข็งแกร่งพร้อมความปลอดภัยของหน่วยความจำและการจำกัดความสามารถของ JavaScript รวมถึงแนวคิดแบบ ‘fail-fast’ เพื่อเสริมทั้งความปลอดภัยและการขยายระบบ
- สามารถรัน VM หลายร้อยตัวแบบขนานได้แม้บนเครื่องเดียว และยังตั้งข้อจำกัดหน่วยความจำรวมถึงปริมาณการประมวลผล (gas) ของสคริปต์ได้
- ฝังใช้งานได้บนแทบทุกแพลตฟอร์มด้วยไฟล์
.wasm เพียงไฟล์เดียว โดยไม่ต้องมี build ที่ซับซ้อนหรือ FFI และยังมีขนาดเล็กมากเพียงราว 800KB
- ให้ประสิทธิภาพ ดีกว่า QuickJS สูงสุด 28% และในสภาพแวดล้อม JIT ก็ให้ ความเร็วในการรันระดับเนทีฟ
Hako: เอนจิน JavaScript ที่เล็ก เร็ว และปลอดภัย
Hako คืออะไร?
- เอนจิน JavaScript แบบพกพา เน้นความปลอดภัย และประสิทธิภาพสูง ที่พัฒนาบนพื้นฐานของ PrimJS
- ชื่อ Hako มีที่มาจากคำภาษาญี่ปุ่นที่แปลว่า “กล่อง(箱)”
- เอนจินที่ใช้ WebAssembly เป็นฐาน ซึ่งออกแบบมาให้ใครก็สามารถฝังใช้งานได้ง่ายในทุกสภาพแวดล้อม
ความปลอดภัย: ความปลอดภัยของหน่วยความจำและการจำกัดฟังก์ชัน
- แม้เขียนด้วย C/C++ แต่คอมไพล์เป็น WebAssembly → รับประกันความปลอดภัยของหน่วยความจำและแซนด์บ็อกซ์ขณะรัน
- สามารถจำกัดความสามารถของ JavaScript เองได้ด้วย:
- ลบบางฟังก์ชันออก
- จำกัดไม่ให้มีการจัดสรรหน่วยความจำ
- จำกัดเวลาในการรัน ปริมาณการใช้หน่วยความจำ และ gas เป็นต้น
- ผ่าน
VMContext จึงสามารถ ระบุผู้ใช้ที่เป็นอันตรายและควบคุมทรัพยากรได้
- ใช้ กลยุทธ์ fail-fast เพื่อหยุดโค้ดที่ไม่เสถียรหรือใช้ทรัพยากรมากเกินไปตั้งแต่เนิ่น ๆ
ความง่ายในการฝังใช้งาน: แค่มี .wasm ไฟล์เดียวก็พอ
- ไม่ใช้ Emscripten → จึงฝังใช้งานได้หากมีเพียง WebAssembly runtime สมัยใหม่
- ไม่จำเป็นต้องมี FFI wrapper สำหรับหลายภาษา → ใช้งานได้โดยไม่ต้องผ่านกระบวนการ build ที่ซับซ้อน
- ตัวอย่าง: มี ตัวอย่างการฝัง Hako ใน Go ให้ดู
- รีลีสบิลด์ประกอบด้วยไฟล์
.wasm ขนาดเพียง 800KB เท่านั้น
ประสิทธิภาพ: เร็วกว่า QuickJS
- เช่นเดียวกับที่ PrimJS เร็วกว่า QuickJS, Hako ก็ มีประสิทธิภาพดีกว่า QuickJS โดยเฉลี่ย 28%
- เพิ่มประสิทธิภาพสูงสุดด้วย การปรับแต่ง SIMD และการปรับปรุงบางส่วนของ hot path
- ไม่มีการสูญเสียประสิทธิภาพจาก WebAssembly — บน V8, Wasmtime และ JavaScriptCore ทำความเร็วได้เกือบระดับเนทีฟด้วยการปรับแต่ง JIT
- มี API สำหรับวัดประสิทธิภาพและทำโปรไฟล์ในตัวด้วย
ข้อจำกัดและแผนในอนาคต
- ฟีเจอร์บางส่วนที่เคยใช้ใน PrimJS (template interpreter, GC snapshot) ยังไม่รองรับอย่างสมบูรณ์
- เนื่องจากเครื่องมือ snapshot ของ ByteDance ยังไม่ถูกเปิดซอร์ส นักพัฒนาจึง กำลังพัฒนาเครื่องมือของตนเองอยู่
- ขณะนี้ยังอยู่ในช่วงเบต้าเริ่มต้น และ ฟีดแบ็กมีความสำคัญมากต่อการทำให้ API/ABI เสถียร
- GitHub - hako
2 ความคิดเห็น
https://github.com/fernvenue/hako-go-example
ดูเหมือนจะเป็นลิงก์ที่ไม่มีอยู่แล้ว ตัวอย่างการฝังกับ Go น่าจะเป็น
https://gist.github.com/andrewmd5/197efb527ef40131c34ca12fd6d0a61e
มากกว่าครับ
อ้อ ดูเหมือนว่าจะมีการเปลี่ยนแปลงนะครับ ผมเลยแก้ไขไว้แล้ว ขอบคุณครับ