- Một engine JavaScript được triển khai hoàn toàn từ đầu bằng Rust, với kiến trúc hỗ trợ gần như đầy đủ đặc tả ECMAScript
- Hiện đã vượt qua hơn 97% bài kiểm tra của ngôn ngữ ECMAScript, được xác thực bằng bộ kiểm thử dựa trên test262
- Lấy cảm hứng từ thiết kế Ignition của V8 và LibJS của SerenityOS, đồng thời tự triển khai hầu hết các thành phần theo hướng giảm thiểu phụ thuộc
- Bao gồm VM bytecode, bộ gom rác nén, engine RegExp tùy biến và parser, cùng các đối tượng và hàm dựng sẵn tuân theo đặc tả
- Dù vẫn chưa hoàn thiện để dùng trong production, đây là một bước tiến quan trọng trong việc phát triển engine JS nền tảng Rust với mức tính năng tương đương ES2025
Tổng quan về Brimstone
- Brimstone là một engine JavaScript được viết mới hoàn toàn bằng Rust, hướng tới việc hiện thực trung thực đặc tả ECMAScript
- Hiện hỗ trợ hơn 97% ngôn ngữ ECMAScript và đã vượt qua các bài kiểm tra test262
- Đây vẫn là một dự án đang được phát triển, chưa sẵn sàng để sử dụng trong môi trường production
Thiết kế và triển khai
- Tự hiện thực trực tiếp đặc tả ECMAScript, đồng thời lấy cảm hứng thiết kế từ V8 và LibJS của SerenityOS
- Tự triển khai phần lớn các thành phần của engine mà không cần phụ thuộc, ngoại lệ duy nhất là ICU4X
- Các thành phần chính:
- VM dựa trên bytecode tham khảo V8 Ignition
- Bộ gom rác nén được viết bằng mã Rust rất nhiều
unsafe
- Engine RegExp tùy biến và parser
- Hiện thực các đối tượng và hàm dựng sẵn tuân theo đặc tả
Build và chạy
Hệ thống kiểm thử
- Sử dụng bộ kiểm thử tích hợp của bên thứ nhất và bên thứ ba, bao gồm test262 chính thức
- Có kèm trình chạy kiểm thử tích hợp tùy biến (chạy bằng lệnh
cargo brimstone-test)
- Kiểm thử đơn vị và snapshot được chạy bằng
cargo test
- Có thể xem thêm thông tin kiểm thử trong
tests/README.md
Các tính năng chưa được hiện thực
- Đã hiện thực mọi tính năng đến ES2024 và phần lớn các đề xuất Stage 4 tính đến cuộc họp TC39 tháng 2/2025
- Các tính năng hiện vẫn chưa được hỗ trợ:
- SharedArrayBuffer
- Atomics
2 bình luận
Đỉnh thật..
Ý kiến trên Hacker News
Cảm ơn @ivankra đã thêm nó vào javascript-zoo và chạy benchmark
Đây là một dự án làm vì sở thích mà tôi đã đều đặn dành thời gian trong 3 năm qua để nâng cao độ hoàn thiện và hiệu năng
Dù có thể kích thước sẽ tăng nếu bổ sung mức tính năng tương đương Boa và gia cố để dùng production, việc vượt qua 97% spec với kích thước nhỏ như vậy vẫn khá ấn tượng
Brimstone thì không, nên đó là phần lớn nguyên nhân tạo ra chênh lệch kích thước
Để xử lý Unicode đúng cách thì cần dữ liệu cỡ vài MB, nên thời nay không dễ để tạo ra file thực thi nhỏ
Nếu hỗ trợ Unicode là bắt buộc thì sẽ có một giới hạn tối thiểu về kích thước
Thiết lập mặc định thường ưu tiên hiệu năng, nên nếu đổi các tùy chọn như
codegen-units=1hoặc loại bỏ panic thì kết quả có thể sẽ khácBoa chỉ vượt qua khoảng 91%, nên Brimstone hoàn thiện hơn
Dự án quy mô nhỏ thường nhỏ gọn, sạch sẽ và dễ bảo trì hơn
Cộng tác luôn đi kèm một mức overhead nhất định
Kho lưu trữ Boa
Tính năng gần như tương đương Boa, và ở một số benchmark thì nhanh gấp đôi
Tôi nghĩ đó là một diễn biến tự nhiên
Tuy nhiên dự án này được nói là dùng unsafe khá nhiều
Nó giống một kiểu hiện tượng Blub
Cuối cùng đây vẫn là một yếu tố marketing, nhưng đúng là trung bình mức độ hoàn thiện cao hơn
Tôi tưởng tượng cảnh intro của Ikari hiện ra trước khi OS khởi động
Rust native hoàn toàn, không cần liên kết C/C++
Có thể thêm scripting JS vào một server nhị phân đơn 40MB
Việc xuất hiện nhiều JS engine nền Rust thật sự rất tuyệt
Tôi nghĩ chỉ cần giảm tối đa vùng unsafe là ổn
Vecbên trong cũng dùng unsafeĐiều quan trọng là giới hạn unsafe vào những vùng nhỏ để có thể kiểm chứng
Hiện thực GC là một trong những vùng ngoại lệ như vậy
Nếu tôi làm JS runtime bằng Rust thì cũng sẽ ưu tiên hiện thực an toàn trước, rồi chỉ dùng unsafe khi cần
Để hiện thực GC hiệu năng cao thì có những chỗ bắt buộc phải dùng
Rust đơn giản là một ngôn ngữ mệnh lệnh nhanh và tốt
RchoặcArcthì mới áp dụng reference counting