- Rustでゼロから実装されたJavaScriptエンジンで、ECMAScript仕様をほぼ完全にサポートする構成
- 現在 ECMAScript言語の97%以上を通過しており、test262ベースのテストで検証済み
- V8のIgnition設計とSerenityOSのLibJSに着想を得て、ほとんどの構成要素を 依存関係を最小限に抑える 方針で直接実装
- バイトコードVM、コンパクティングGC、カスタムRegExpエンジンとパーサーを含み、仕様準拠の組み込みオブジェクトと関数を提供
- まだ 本番用途としては未完成 だが、ES2025レベルの機能を備えたRustベースJSエンジン開発における重要な前進
Brimstone概要
- Brimstoneは Rustで完全に新規実装されたJavaScriptエンジン で、ECMAScript仕様を忠実に実装することを目指している
- 現在 ECMAScript言語の97%以上をサポートし、test262テストを通過
- まだ本番環境で使う準備はできていない 開発進行中のプロジェクト である
設計と実装
- ECMAScript仕様を直接実装し、V8 と SerenityOSのLibJS から設計上の着想を得ている
- エンジンの大部分の構成要素を 依存なしで自前実装 しており、例外的に ICU4X のみを使用
- 主な構成要素:
- V8 Ignition を参考にした バイトコードベースのVM
- 非常にunsafeなRustコードで書かれたコンパクティングGC
- カスタムRegExpエンジン と パーサー
- 仕様に準拠した 組み込みオブジェクトおよび関数の実装
ビルドと実行
テスト体制
- 公式 test262 を含むファーストパーティおよびサードパーティの統合テストセットを活用
- カスタム統合テストランナー を同梱(
cargo brimstone-test コマンドで実行)
- 単体テストおよびスナップショットテストは
cargo test で実行
- 追加のテスト情報は
tests/README.md で確認可能
未実装機能
- ES2024までのすべての機能 と 2025年2月のTC39会議時点のStage 4提案 の大半を実装
- まだ未対応の機能:
- SharedArrayBuffer
- Atomics
2件のコメント
すごいですね..
Hacker Newsのコメント
@ivankra が javascript-zoo に追加してベンチマークを回してくれたおかげで、感謝しています。
この3年間、完成度と性能を高めるために着実に時間を注いできた趣味プロジェクトです。
Boa レベルの機能を満たして本番向けに強化すればサイズは大きくなるかもしれませんが、この小ささで 仕様の97%を通過しているのはかなり印象的です。
Brimstone はそうではないので、それがサイズ差の大半を占めています。
Unicode 処理をきちんと行うには数MBのデータが必要なので、最近は小さな実行ファイルを作るのが簡単ではありません。
Unicode サポートが必須なら、最小サイズには限界が出ます。
デフォルト設定は通常 性能重視 なので、
codegen-units=1や panic 削減のようなオプションを変えると結果が変わるかもしれません。Boa は約91%しか通過していないので、Brimstone のほうが完成度は高いです。
小規模プロジェクトほどコードが 小さくきれいで保守しやすい ものです。
協業には常に一定の オーバーヘッド が伴います。
Boa リポジトリ
機能は Boa とほぼ同じで、一部のベンチマークでは 速度が2倍 です。
自然な流れだと思います。
ただ、このプロジェクトは unsafe をかなり多く使っているそうです。
一種の Blub 現象 のようなものです。
結局はマーケティング要素でもありますが、平均して完成度が高いのは事実です。
OS の起動前に Ikari のイントロが出るのを想像してしまいました。
C/C++ のリンクなしで完全な Rust ネイティブ です。
40MB の単一バイナリサーバーに JS スクリプティングを追加できます。
Rust ベースの JS エンジンがいくつも出てきたのは本当に素晴らしいことです。
unsafe な領域を最小限に抑えれば問題ないと思います。
Vecのような標準ライブラリですら内部的には unsafe を使っています。重要なのは unsafe を 小さな領域に限定 して検証可能にすることです。
GC 実装はその例外的な領域です。
私が JS ランタイムを Rust で作るとしても、まず安全に実装して必要なときだけ unsafe を使うでしょう。
高性能 GC を実装するには、どうしても必要になる部分です。
Rust は単に速くて良い命令型言語です。
RcやArcを使うときだけ参照カウントが適用されます。