- Motor JavaScript implementado desde cero en Rust, con una arquitectura que soporta casi por completo la especificación ECMAScript
- Actualmente supera más del 97% del lenguaje ECMAScript, validado con pruebas basadas en test262
- Inspirado en el diseño de Ignition de V8 y en LibJS de SerenityOS, implementa directamente la mayoría de sus componentes con un enfoque de mínimas dependencias
- Incluye una VM de bytecode, un garbage collector compactante, un motor RegExp personalizado y un parser, además de objetos y funciones integrados conformes a la especificación
- Aún no está terminado para uso en producción, pero representa un avance importante en el desarrollo de un motor JS en Rust con capacidades de nivel ES2025
Resumen de Brimstone
- Brimstone es un motor JavaScript completamente nuevo escrito en Rust, cuyo objetivo es implementar fielmente la especificación ECMAScript
- Actualmente soporta más del 97% del lenguaje ECMAScript y pasa las pruebas de test262
- Sigue siendo un proyecto en desarrollo y todavía no está listo para usarse en producción
Diseño e implementación
- Implementa directamente la especificación ECMAScript y toma inspiración de diseño de V8 y de LibJS de SerenityOS
- La mayoría de los componentes del motor están implementados directamente sin dependencias, con ICU4X como única excepción
- Componentes principales:
- VM basada en bytecode inspirada en V8 Ignition
- Garbage collector compactante escrito con código Rust muy unsafe
- Motor RegExp personalizado y parser
- Implementación de objetos y funciones integrados conforme a la especificación
Compilación y ejecución
Sistema de pruebas
- Utiliza un conjunto de pruebas de integración de primera y tercera parte, incluyendo el oficial test262
- Incluye un runner de pruebas de integración personalizado (se ejecuta con el comando
cargo brimstone-test)
- Las pruebas unitarias y de snapshot se ejecutan con
cargo test
- Se puede consultar más información de pruebas en
tests/README.md
Funcionalidades no implementadas
- Ya implementa todas las funciones hasta ES2024 y la mayoría de las propuestas Stage 4 según la reunión de TC39 de febrero de 2025
- Funcionalidades aún no soportadas:
- SharedArrayBuffer
- Atomics
2 comentarios
Está brutal..
Comentarios de Hacker News
Gracias a @ivankra por añadirlo a javascript-zoo y correr los benchmarks.
Ha sido un proyecto de hobby al que le he dedicado tiempo de forma constante durante los últimos 3 años para mejorar su nivel de terminación y rendimiento.
Puede que crezca si alcanza el nivel de funciones de Boa y se refuerza para producción, pero aun así es bastante impresionante que con este tamaño pase el 97% de la especificación.
Brimstone no, y eso explica la mayor parte de la diferencia de tamaño.
Como para manejar Unicode correctamente se necesitan varios MB de datos, hoy en día no es fácil hacer ejecutables pequeños.
Si el soporte de Unicode es obligatorio, hay un límite mínimo de tamaño.
La configuración por defecto normalmente prioriza el rendimiento, así que cambiar opciones como
codegen-units=1o quitar panic podría alterar el resultado.Boa solo pasa alrededor del 91%, así que Brimstone está más completo.
Mientras más pequeño es el proyecto, más compacto, limpio y fácil de mantener suele ser el código.
La colaboración siempre trae cierto overhead.
Repositorio de Boa
En funciones está casi al nivel de Boa, y en algunos benchmarks es dos veces más rápido.
Me parece algo natural.
unsafe, ciertas clases de bugs quedan bloqueadas de raíz.Aunque dicen que este proyecto usa bastante
unsafe.Es una especie de efecto Blub.
Al final sí es un elemento de marketing, pero también es cierto que en promedio el nivel de terminación es alto.
Me imaginé una intro de Ikari apareciendo antes de arrancar el SO.
Es completamente nativo de Rust, sin enlazar C/C++.
Puedes agregar scripting en JS a un servidor en un solo binario de 40 MB.
Es realmente genial que ya existan varios motores JS basados en Rust.
unsafe.Si mantienes el área unsafe al mínimo, me parece bien.
Vec, usaunsafeinternamente.Lo importante es limitar unsafe a una zona pequeña para que se pueda verificar.
Implementar un GC es una de esas áreas excepcionales.
Si yo hiciera un runtime de JS en Rust, primero lo implementaría de forma segura y solo usaría
unsafecuando fuera necesario.unsafees una herramienta para que el desarrollador controle directamente las partes que el compilador no puede comprender.Si quieres implementar un GC de alto rendimiento, hay partes donde simplemente es inevitable.
Rust es simplemente un lenguaje imperativo rápido y bueno.
RcoArc.