- Eine von Grund auf in Rust implementierte JavaScript-Engine, die die ECMAScript-Spezifikation nahezu vollständig unterstützt
- Besteht derzeit mehr als 97 % der ECMAScript-Sprache und ist durch test262-basierte Tests verifiziert
- Von V8s Ignition-Design und SerenityOS' LibJS inspiriert, wobei die meisten Komponenten mit minimalen Abhängigkeiten selbst implementiert wurden
- Enthält eine Bytecode-VM, einen komprimierenden Garbage Collector, eine eigene RegExp-Engine und einen Parser sowie spezifikationskonforme eingebaute Objekte und Funktionen
- Noch nicht produktionsreif, aber ein wichtiger Fortschritt bei der Entwicklung einer Rust-basierten JS-Engine mit Funktionsumfang auf ES2025-Niveau
Überblick über Brimstone
- Brimstone ist eine vollständig neu in Rust geschriebene JavaScript-Engine mit dem Ziel, die ECMAScript-Spezifikation originalgetreu umzusetzen
- Unterstützt derzeit mehr als 97 % der ECMAScript-Sprache und besteht die test262-Tests
- Es handelt sich noch um ein laufendes Projekt, das noch nicht für den Einsatz in Produktionsumgebungen bereit ist
Design und Implementierung
- Implementiert die ECMAScript-Spezifikation direkt und ist konzeptionell von V8 und SerenityOS' LibJS inspiriert
- Die meisten Komponenten der Engine sind ohne Abhängigkeiten selbst implementiert, mit ICU4X als einziger Ausnahme
- Zentrale Bestandteile:
- Eine Bytecode-basierte VM nach dem Vorbild von V8 Ignition
- Ein komprimierender Garbage Collector, geschrieben in sehr viel unsafe Rust-Code
- Eine eigene RegExp-Engine und ein Parser
- Spezifikationskonforme eingebaute Objekte und Funktionen
Build und Ausführung
Testsystem
- Nutzt ein Integrations-Testset aus offiziellen test262-Tests sowie Tests von Erst- und Drittanbietern
- Enthält einen eigenen Integrations-Test-Runner (ausführbar mit dem Befehl
cargo brimstone-test)
- Unit- und Snapshot-Tests werden mit
cargo test ausgeführt
- Weitere Testinformationen finden sich in
tests/README.md
Noch nicht implementierte Funktionen
- Alle Features bis ES2024 sowie die meisten Stage-4-Vorschläge nach dem Stand der TC39-Sitzung im Februar 2025 sind implementiert
- Noch nicht unterstützte Funktionen:
- SharedArrayBuffer
- Atomics
2 Kommentare
Krass ..
Hacker-News-Kommentare
Vielen Dank an @ivankra dafür, dass er es zu javascript-zoo hinzugefügt und Benchmarks laufen lassen hat
In den letzten drei Jahren war das ein Hobbyprojekt, in das ich kontinuierlich Zeit investiert habe, um Reifegrad und Performance zu steigern
Wenn es den Funktionsumfang von Boa erreicht und für den Produktionseinsatz gehärtet wird, könnte es größer werden, aber mit dieser kleinen Größe 97 % der Spezifikation zu bestehen ist ziemlich beeindruckend
Brimstone tut das nicht, und das macht den Großteil des Größenunterschieds aus
Für eine saubere Unicode-Verarbeitung werden mehrere MB an Daten benötigt, daher ist es heutzutage nicht einfach, kleine Executables zu bauen
Wenn Unicode-Unterstützung Pflicht ist, gibt es eine Mindestgröße, unter die man kaum kommt
Die Standardeinstellungen sind normalerweise eher auf Performance ausgelegt, daher könnten Optionen wie
codegen-units=1oder das Entfernen von Panics das Ergebnis verändernBoa besteht nur etwa 91 %, also ist Brimstone vollständiger
Gerade bei kleineren Projekten ist der Code oft klein, sauber und leicht wartbar
Zusammenarbeit bringt immer einen gewissen Overhead mit sich
Boa-Repository
Der Funktionsumfang ist Boa fast ebenbürtig, und in einigen Benchmarks ist es doppelt so schnell
Ich halte das für einen natürlichen Verlauf
Allerdings soll dieses Projekt ziemlich viel unsafe einsetzen
Das wirkt wie eine Art Blub-Phänomen
Letztlich ist es auch Marketing, aber im Durchschnitt ist der Reifegrad tatsächlich höher
Ich stelle mir vor, wie vor dem OS-Boot ein Ikari-Intro erscheint
Komplett Rust-nativ, ohne C/C++-Linking
Man kann einem 40-MB-Single-Binary-Server JS-Scripting hinzufügen
Es ist wirklich großartig, dass es inzwischen mehrere Rust-basierte JS-Engines gibt
Solange der unsafe-Bereich klein gehalten wird, halte ich das für in Ordnung
VecWichtig ist, unsafe auf kleine Bereiche zu begrenzen, damit sie überprüfbar bleiben
Die Implementierung eines GC ist so ein Ausnahmebereich
Wenn ich selbst eine JS-Runtime in Rust bauen würde, würde ich sie zuerst sicher implementieren und nur bei Bedarf unsafe einsetzen
Für die Implementierung eines Hochleistungs-GC ist das stellenweise unvermeidlich
Rust ist einfach eine schnelle und gute imperative Sprache
RcoderArcverwendet