- Moteur JavaScript implémenté entièrement en Rust à partir de zéro, avec une architecture visant une prise en charge presque complète de la spécification ECMAScript
- Passe actuellement plus de 97 % du langage ECMAScript, avec une validation basée sur les tests test262
- Inspiré par la conception d’Ignition de V8 et par LibJS de SerenityOS, avec la plupart des composants implémentés en interne avec un minimum de dépendances
- Inclut une VM à bytecode, un ramasse-miettes compactant, un moteur RegExp personnalisé et un parseur, ainsi que des objets et fonctions intégrés conformes à la spécification
- Encore inachevé pour un usage en production, mais représente une avancée importante dans le développement d’un moteur JS en Rust avec des fonctionnalités de niveau ES2025
Présentation de Brimstone
- Brimstone est un moteur JavaScript entièrement réécrit en Rust, dont l’objectif est d’implémenter fidèlement la spécification ECMAScript
- Il prend actuellement en charge plus de 97 % du langage ECMAScript et réussit les tests test262
- Il s’agit encore d’un projet en cours de développement, pas encore prêt pour un usage en production
Conception et implémentation
- Il implémente directement la spécification ECMAScript et s’inspire, sur le plan de la conception, de V8 et de LibJS de SerenityOS
- La plupart des composants du moteur sont implémentés maison sans dépendances, à l’exception de ICU4X
- Principaux composants :
- VM à bytecode inspirée de V8 Ignition
- Ramasse-miettes compactant écrit en Rust très
unsafe
- Moteur RegExp personnalisé et parseur
- Implémentation des objets et fonctions intégrés conforme à la spécification
Compilation et exécution
Système de test
- Utilise un ensemble de tests d’intégration de première et troisième parties, incluant le test officiel test262
- Comprend un runner de tests d’intégration personnalisé (exécutable avec la commande
cargo brimstone-test)
- Les tests unitaires et les tests snapshot s’exécutent avec
cargo test
- Des informations supplémentaires sur les tests sont disponibles dans
tests/README.md
Fonctionnalités non implémentées
- Implémente toutes les fonctionnalités jusqu’à ES2024 ainsi que la plupart des propositions Stage 4 selon la réunion TC39 de février 2025
- Fonctionnalités encore non prises en charge :
- SharedArrayBuffer
- Atomics
2 commentaires
Incroyable...
Commentaires Hacker News
Merci à @ivankra de l’avoir ajouté à javascript-zoo et d’avoir lancé des benchmarks
C’était un projet hobby sur lequel j’ai investi du temps régulièrement ces trois dernières années pour améliorer la maturité et les performances
Il est possible que la taille augmente s’il atteint le niveau de fonctionnalités de Boa et est renforcé pour la production, mais réussir à passer 97 % de la spec avec une taille aussi réduite reste assez impressionnant
Brimstone ne le fait pas, et cela représente l’essentiel de l’écart de taille
Gérer correctement Unicode nécessite plusieurs Mo de données, donc produire de petits exécutables n’est plus si simple aujourd’hui
Si la prise en charge d’Unicode est indispensable, il existe une limite minimale de taille
La configuration par défaut vise généralement les performances, donc modifier des options comme
codegen-units=1ou supprimer les paniques pourrait changer le résultatBoa ne passe qu’environ 91 %, donc Brimstone est plus abouti
Plus un projet est petit, plus le code est petit, propre et facile à maintenir
La collaboration implique toujours un certain overhead
Dépôt Boa
Les fonctionnalités sont presque équivalentes à celles de Boa et, sur certains benchmarks, il est deux fois plus rapide
Je trouve que c’est une évolution naturelle
unsafe, certaines classes de bugs sont bloquées à la sourceCela dit, ce projet utiliserait pas mal d’
unsafeC’est un peu un phénomène Blub
Au final, c’est aussi un élément marketing, mais il est vrai qu’en moyenne le niveau de finition est élevé
J’imagine une intro Ikari s’affichant avant le démarrage de l’OS
C’est du Rust natif complet, sans liaison C/C++
On peut ajouter du scripting JS à un serveur en binaire unique de 40 Mo
C’est vraiment chouette de voir apparaître plusieurs moteurs JS basés sur Rust
unsafe?unsafeun nouveau système de gestion mémoire est un choix rationnelTant que la zone
unsafereste minimale, cela me paraît acceptableVecutilise de l’unsafeen interneL’important est de limiter l’unsafe à de petites zones vérifiables
Une implémentation de GC fait partie de ces zones d’exception
unsafede Rust n’a pas un champ d’undefined behavior aussi large qu’en C++Si je devais moi aussi écrire un runtime JS en Rust, je commencerais par une implémentation sûre et je n’utiliserais
unsafequ’en cas de besoinunsafeest un outil qui permet au développeur de contrôler directement ce que le compilateur ne comprend pasPour implémenter un GC hautes performances, certaines parties sont inévitablement nécessaires
Rust est simplement un langage impératif rapide et de qualité
RcouArc