7 คะแนน โดย GN⁺ 2024-11-19 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • Nova คือเอนจิน JavaScript ที่มีจุดเด่นด้านการออกแบบแบบยึดข้อมูลเป็นศูนย์กลาง โดยใช้โครงสร้างที่ออกแบบมาเพื่อเพิ่มประสิทธิภาพและประสิทธิภาพของแคชให้สูงสุด
    • มุ่งป้องกันช่องโหว่ด้านหน่วยความจำและเพิ่มประสิทธิภาพไปพร้อมกัน
  • คุณสมบัติหลัก:
    • ข้อมูลทั้งหมดที่จัดสรรอยู่บน JavaScript heap จะถูกเก็บไว้ในเวกเตอร์แยกตามชนิด (ตัวเลขอยู่ในเวกเตอร์ตัวเลข สตริงอยู่ในเวกเตอร์สตริง เป็นต้น)
    • การอ้างอิง heap จะถูกจัดการเป็นดัชนีที่แยกตามชนิด ซึ่งช่วยให้ได้ทั้งความปลอดภัยของหน่วยความจำและประสิทธิภาพด้านขนาด
    • อ็อบเจ็กต์จะถูกแยกตามชนิดและจัดเก็บในเวกเตอร์ (อ็อบเจ็กต์ทั่วไป, อาร์เรย์, DataView เป็นต้น)
    • อ็อบเจ็กต์ที่ไม่ใช่แบบทั่วไปถูกออกแบบให้อ้างอิงข้อมูลของอ็อบเจ็กต์ทั่วไปเฉพาะเมื่อจำเป็นเท่านั้น
    • อ็อบเจ็กต์ถูกแยกเก็บอย่างเข้มข้นเพื่อหลีกเลี่ยงการอ่านข้อมูลที่ไม่ได้ใช้งาน
  • ยังอยู่ระหว่างการพัฒนา โดยเอนจินยังมีความสามารถจำกัดมาก จึงผ่านชุดทดสอบ test262 ได้เพียงประมาณ 47%

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

 
GN⁺ 2024-11-19
ความคิดเห็นจาก Hacker News
  • การถกเถียงเรื่องการเลือกสถาปัตยกรรมน่าสนใจ แต่คนส่วนใหญ่มักขาดบริบทสำหรับการเปรียบเทียบ จึงยากที่จะเข้าใจว่ามีข้อดีอะไรเมื่อเทียบกับสถาปัตยกรรมของ V8
  • เคยคิดถึงโปรเจ็กต์อย่าง Lisp interpreter และระบุข้อดีหลักได้บางอย่าง
    • การจัดสรรแบบสม่ำเสมอหมายความว่าไม่มีช่องว่างจากการจัดแนว
    • ข้อดีของการเข้าถึงแบบเชิงเส้นใน garbage collection
    • ดัชนีที่เล็กกว่าพอยน์เตอร์
    • ดัชนีที่แยกตามชนิดข้อมูลอาจช่วยประหยัดขนาดได้
  • ยังไม่จำเป็นต้องเปรียบเทียบกับ V8 ทันที V8 เป็นโปรเจ็กต์ระดับหลายพันล้านดอลลาร์
  • น่าจะดีถ้าอ้างอิง JS engine ของ Fabrice Bellard
  • วิธีการจัดสรรข้อมูลของ V8
    • ข้อมูลทั้งหมดถูกจัดสรรลงในส่วนใดส่วนหนึ่งของ heap หลายส่วน
    • การอ้างอิง heap เป็นพอยน์เตอร์จริง หรือถ้าใช้ pointer compression ก็จะเป็นออฟเซ็ตจาก heap base
    • อ็อบเจ็กต์ของ V8 มีข้อมูลทุกอย่างที่ต้องใช้ และส่วนใหญ่เก็บอยู่ในการจัดสรรครั้งเดียว
  • การออกแบบที่เน้นข้อมูลเป็นศูนย์กลางถูกขับเคลื่อนโดยการรู้วิธีเข้าถึงข้อมูล จึงสงสัยว่าทำไมถึงสมมติว่าการเข้าถึงข้อมูลทั่วไปจะเป็นการเข้าถึงแบบเชิงเส้นต่ออ็อบเจ็กต์ชนิดเดียวกัน
  • "ตัวเลขจะถูกใส่ลงในเวกเตอร์ของตัวเลข" ไม่ใช่แนวทางทั่วไป โดยปกติ JS engine จะใช้ NaN-boxing หรือจำนวนเต็มขนาดเล็กแบบอินไลน์
  • สงสัยว่าได้พิจารณาการใช้ NaN-boxing หรือไม่ และเวกเตอร์แยกตามชนิดข้อมูลนั้นถูกบีบอัดโดย GC หรือคง free list ไว้
  • แนะนำให้อ่าน "Don’t Stop the BIBOP: Flexible and Efficient Storage Management for Dynamically Typed Languages"
  • สงสัยว่า JS engine นี้เป็นเชิงทดลอง หรือกำลังพยายามทำตามข้อกำหนด ECMAscript ให้ครบทั้งหมด
  • ติดตามโปรเจ็กต์ Rust Boa อยู่ แต่คิดว่ายังไม่พร้อมสำหรับ production
  • แนวทางที่เน้นข้อมูลเป็นศูนย์กลางและเวกเตอร์แยกตามชนิดข้อมูลแตกต่างจากสถาปัตยกรรมดั้งเดิมอย่าง V8 อย่างมาก
    • ประสิทธิภาพในสถานการณ์จริง: สงสัยว่ามี benchmark ที่เปรียบเทียบ Nova กับ V8 หรือ SpiderMonkey ในสถานการณ์ที่มีรูปแบบการเข้าถึงข้อมูลซับซ้อนและไม่เป็นเชิงเส้นหรือไม่
    • trade-off ใน garbage collection: สงสัยว่าการขยายและบีบอัดเวกเตอร์จะก่อให้เกิด memory fragmentation หรือคอขวดด้านประสิทธิภาพหรือไม่
  • สงสัยว่ามีโปรไฟล์ของแอปพลิเคชันเฉพาะที่ตั้งใจไว้หรือไม่
    • อาจมีประโยชน์สำหรับการฝัง scripting engine ลงในเกม
  • สงสัยว่าคำว่า "kind" ใน "kind-specific vectors" หมายถึงอะไร
    • สงสัยว่า function X(a) { this.a = a; } และ function Y(b) { this.b = b; } จะถือเป็นอ็อบเจ็กต์คนละชนิดกันหรือไม่
    • เมื่อตอนสร้างอ็อบเจ็กต์ด้วยลิเทอรัล {a: 1} และ {b: 2} จะถือเป็นอ็อบเจ็กต์คนละชนิดกันหรือไม่