วงการเครื่องมือประมวลผล JavaScript กำลังได้เห็นการพัฒนาที่น่าสนใจกับ Nova ซึ่งเป็นเครื่องมือทดลองใหม่ที่เขียนด้วยภาษา Rust โดยใช้แนวทางการออกแบบที่เน้นการจัดการข้อมูลในการประมวลผล JavaScript แม้จะอยู่ในช่วงเริ่มต้น แต่สถาปัตยกรรมที่เป็นเอกลักษณ์ของ Nova กำลังสร้างการถกเถียงอย่างมากในชุมชนนักพัฒนาเกี่ยวกับการปรับปรุงประสิทธิภาพและแนวทางทางเลือกในการออกแบบเครื่องมือประมวลผล JavaScript
คุณสมบัติทางเทคนิคที่สำคัญ:
- พัฒนาด้วยภาษา Rust
- การออกแบบที่เน้นข้อมูลโดยใช้การจัดเก็บแบบเวกเตอร์
- ระบบ Feature flag สำหรับฟีเจอร์ JavaScript ที่เลือกใช้ได้
- ไม่มี JIT compiler (ออกแบบให้เป็นตัวแปลความหมายอย่างเดียว)
- มีเป้าหมายในการปฏิบัติตามข้อกำหนดของ ECMAScript
สถาปัตยกรรมที่เน้นข้อมูล
จุดเด่นที่สุดของ Nova คือการใช้แนวทางการออกแบบที่เน้นข้อมูล ซึ่งแตกต่างอย่างมากจากเครื่องมือประมวลผล JavaScript แบบดั้งเดิมอย่าง V8 แทนที่จะใช้การสืบทอดแบบ object-oriented และการจัดการหน่วยความจำแบบ pointer Nova ใช้ระบบที่อิงจากเวกเตอร์ซึ่งข้อมูลที่มีประเภทเดียวกันจะถูกเก็บไว้ด้วยกันในบล็อกหน่วยความจำที่ต่อเนื่องกัน แนวทางนี้มีจุดมุ่งหมายเพื่อเพิ่มประสิทธิภาพของแคชและรูปแบบการเข้าถึงหน่วยความจำ โดยได้แรงบันดาลใจมาจากการพัฒนาเกม โดยเฉพาะสถาปัตยกรรมแบบ Entity Component System (ECS)
การพิจารณาประสิทธิภาพและการแลกเปลี่ยน
การออกแบบของเครื่องมือนี้นำเสนอการแลกเปลี่ยนที่น่าสนใจซึ่งก่อให้เกิดการอภิปรายทางเทคนิคอย่างละเอียด ในขณะที่แนวทางที่อิงจากเวกเตอร์อาจให้การใช้แคชที่ดีขึ้น แต่ก็นำมาซึ่งความท้าทายในการจัดการขยะและการจัดการหน่วยความจำ โดยเฉพาะในประเด็นการจัดการชุดข้อมูลขนาดใหญ่:
GC จำเป็นต้องย้ายทุกออบเจ็กต์ที่เหลือในเวกเตอร์ลงมาทีละขั้นเพื่อทำให้เวกเตอร์แน่น สิ่งนี้เป็นสิ่งที่ผมไม่สามารถแก้ไขได้จริงๆ: ผมสามารถทำให้มันเกิดขึ้นน้อยลงโดยการใช้ minor GC แต่ในที่สุด major GC ก็ต้องเกิดขึ้น
ข้อจำกัดในปัจจุบัน:
- ยังไม่ได้ติดตั้งระบบการเก็บขยะแบบสอดแทรก ( interleaved garbage collection )
- ขาดคุณสมบัติการเพิ่มประสิทธิภาพ เช่น shapes และการแคชแบบ inline
- มีความท้าทายด้านประสิทธิภาพในการเติบโตและการจัดระเบียบของเวกเตอร์
- มีข้อมูลการทดสอบประสิทธิภาพอยู่อย่างจำกัด
Feature Flags และวิสัยทัศน์ในอนาคต
Nova แนะนำแนวทางที่น่าสนใจในการรองรับฟีเจอร์ของ JavaScript ผ่านการใช้ feature flags อย่างกว้างขวาง ซึ่งช่วยให้นักพัฒนาสามารถปิดฟีเจอร์บางอย่างของ JavaScript ที่อาจส่งผลกระทบต่อประสิทธิภาพ เช่น array holes หรือการกำหนดดัชนีแต่ละตัว โครงการนี้มีเป้าหมายที่จะมีอิทธิพลต่อระบบนิเวศของ JavaScript โดยแสดงให้เห็นถึงประโยชน์ด้านประสิทธิภาพของชุดฟีเจอร์ที่มีข้อจำกัดมากขึ้น
สถานะปัจจุบันและการพัฒนาในอนาคต
แม้ว่า Nova จะยังอยู่ในช่วงเริ่มต้นของการพัฒนาและยังขาดการเพิ่มประสิทธิภาพที่สำคัญบางอย่าง เช่น shapes และ inline caching แต่ก็ได้แสดงผลลัพธ์ที่น่าสนใจในบางสถานการณ์แล้ว ทีมโครงการกำลังทำงานอย่างแข็งขันในการใช้งานการจัดการขยะแบบสลับ ซึ่งจะช่วยให้สามารถเปรียบเทียบประสิทธิภาพกับเครื่องมือที่มีอยู่แล้วอย่าง V8 ได้อย่างครอบคลุมมากขึ้น
โครงการนี้เป็นการทดลองที่น่าสนใจในการออกแบบเครื่องมือประมวลผล JavaScript ท้าทายแนวทางแบบดั้งเดิมในขณะที่อาจให้ข้อมูลเชิงลึกที่สามารถมีอิทธิพลต่อการพัฒนาในอนาคตในวงการนี้ แม้ว่าจะยังเร็วเกินไปที่จะคาดการณ์ว่า Nova จะบรรลุเป้าหมายอันทะเยอทะยานในการแข่งขันกับ V8 หรือไม่ แต่แนวทางที่เป็นนวัตกรรมในการออกแบบสถาปัตยกรรมของมันก็กำลังมีส่วนช่วยให้เกิดข้อมูลเชิงลึกที่มีคุณค่าแก่ชุมชน JavaScript
แหล่งที่มา: Nova - Your favorite javascript and wasm engine