7 điểm bởi GN⁺ 2024-11-19 | 1 bình luận | Chia sẻ qua WhatsApp
  • Nova là một engine JavaScript nổi bật với thiết kế hướng dữ liệu, áp dụng kiến trúc được tạo ra để tối đa hóa hiệu năng và hiệu quả bộ nhớ đệm
    • Đồng thời theo đuổi việc ngăn ngừa lỗ hổng bộ nhớ và tối ưu hiệu năng
  • Các đặc điểm chính:
    • Mọi dữ liệu được cấp phát trên heap JavaScript đều được lưu trong các vector theo từng kiểu (số trong vector số, chuỗi trong vector chuỗi, v.v.).
    • Tham chiếu heap được xử lý bằng các chỉ mục phân biệt theo kiểu, giúp đảm bảo an toàn bộ nhớ và hiệu quả về kích thước.
    • Các đối tượng được chia theo kiểu và lưu trong các vector (đối tượng thông thường, mảng, DataView, v.v.).
    • Các đối tượng không thông thường được thiết kế để chỉ tham chiếu dữ liệu của đối tượng thông thường khi cần.
    • Các đối tượng được lưu theo cách tách biệt mạnh nhằm tránh đọc dữ liệu không sử dụng.
  • Vẫn đang trong quá trình phát triển. Engine hiện có chức năng rất hạn chế nên chỉ vượt qua khoảng 47% bộ kiểm thử test262

1 bình luận

 
GN⁺ 2024-11-19
Ý kiến Hacker News
  • Thảo luận về các lựa chọn kiến trúc khá thú vị, nhưng đa số mọi người thiếu bối cảnh để so sánh. Khó hiểu được nó có lợi thế gì khi so với kiến trúc của V8
  • Tôi từng nghĩ về các dự án như trình thông dịch Lisp và đã xác định được một vài lợi ích chính
    • Cấp phát đồng nhất có nghĩa là không có khoảng đệm căn chỉnh
    • Lợi ích của truy cập tuyến tính trong garbage collection
    • Chỉ số nhỏ hơn con trỏ
    • Chỉ số được phân theo kiểu có thể tiết kiệm kích thước
  • Không nhất thiết phải so sánh với V8 ngay lập tức. V8 là một dự án trị giá hàng tỷ đô la
  • Có lẽ nên tham khảo JS engine của Fabrice Bellard
  • Cách V8 cấp phát dữ liệu
    • Mọi dữ liệu được cấp phát vào một trong nhiều phần của heap
    • Tham chiếu heap là con trỏ thực hoặc là độ lệch từ heap base nếu dùng pointer compression
    • Đối tượng của V8 chứa mọi dữ liệu cần thiết và phần lớn được lưu trong một lần cấp phát duy nhất
  • Thiết kế hướng dữ liệu được dẫn dắt bởi việc biết cách dữ liệu sẽ được truy cập. Tôi thắc mắc tại sao lại giả định rằng kiểu truy cập dữ liệu phổ biến là truy cập tuyến tính tới các đối tượng cùng kiểu
  • Câu "số được đưa vào vector số" không phải là cách làm phổ biến. JS engine thường dùng NaN-boxing hoặc số nguyên nhỏ nội tuyến
  • Tôi muốn biết liệu đã cân nhắc dùng NaN-boxing chưa. Tôi cũng tò mò các vector theo từng kiểu có được GC nén lại hay là duy trì free list
  • Khuyên nên đọc "Don’t Stop the BIBOP: Flexible and Efficient Storage Management for Dynamically Typed Languages"
  • Tôi tò mò không biết JS engine này là thử nghiệm hay đang nhắm tới việc triển khai toàn bộ đặc tả ECMAscript
  • Tôi có theo dõi dự án Rust Boa, nhưng vẫn nghĩ nó chưa sẵn sàng cho production
  • Cách tiếp cận hướng dữ liệu và các vector theo từng kiểu khá khác so với kiến trúc truyền thống như V8
    • Hiệu năng trong tình huống thực tế: Tôi muốn biết có benchmark nào so sánh Nova với V8 hoặc SpiderMonkey trong các kịch bản có mẫu truy cập dữ liệu phức tạp, phi tuyến hay không
    • Đánh đổi trong garbage collection: Tôi muốn biết việc tăng trưởng và nén vector có thể gây ra phân mảnh bộ nhớ hoặc nút thắt hiệu năng hay không
  • Tôi tò mò liệu có đang nhắm tới một hồ sơ ứng dụng cụ thể nào không
    • Có thể hữu ích khi nhúng làm scripting engine cho game
  • Tôi tò mò từ "kind" trong "kind-specific vectors" mang nghĩa gì
    • function X(a) { this.a = a; }function Y(b) { this.b = b; } có được xem là các loại đối tượng khác nhau không
    • Khi tạo đối tượng bằng literal, {a: 1}{b: 2} có được xem là các loại đối tượng khác nhau không