- Herramienta que compila JavaScript a WebAssembly, similar a porffor en el sentido de que genera binarios WASM independientes. Está escrita en Rust
- Es una herramienta experimental y todavía no está lista para usarse en producción; le faltan muchas funciones del lenguaje y tipos integrados, o están incompletos
- El objetivo es lograr soporte del 100% del lenguaje.
¿Por qué Jawsm?
- El proyecto Jawsm comenzó mientras se trabajaba en Crowst, una herramienta de pruebas de estrés para ejecutar escenarios de WebAssembly.
- Solo admite código compilado de Rust a WASM, pero Rust no es un lenguaje de uso tan extendido.
- Ejecutar un lenguaje de scripting sobre WASM no es ideal actualmente. Hay que incluir un intérprete o usar una variante del lenguaje objetivo.
- Se cree que, con las propuestas modernas de WASM, es posible implementar el 100% de las funciones de JavaScript sin un intérprete compilado.
Qué funciona
- El objetivo es implementar el 100% del lenguaje y el enfoque está en la implementación de la semántica.
- Hay 4 elementos difíciles de implementar: scope/closures, try/catch, async/await y generadores.
- Actualmente Jawsm implementa la compilación de código con closures, try/catch, una API
Promise limitada y async.
- Funciones que sí funcionan: declaración y asignación de variables,
while, literales de cadena, números y operadores básicos, booleanos y operadores booleanos básicos, literales de arreglo, literales de objeto y la palabra clave new.
Requisitos del host
- Jawsm está construido sobre propuestas recientes de WASM, por lo que los binarios generados tienen poca portabilidad entre runtimes.
- Se está implementando pensando en WASIp2, y usa V8 con polyfills de JavaScript para las funciones de WASIp2.
- Hay un script
run.js que puede ejecutar los binarios generados por Jawsm.
Cómo usarlo
- Se recomienda no usarlo a menos que vayas a contribuir.
- Después de clonar el repositorio, puedes usar el script
execute.sh para generar un archivo WAT, compilarlo a binario y luego ejecutarlo con Node.js.
- Se requiere
cargo de Rust, la versión más reciente de wasm-tools y Node.js v23.0.0 o superior.
Próximos pasos
- El plan es completar primero las funciones difíciles de implementar; lo siguiente es soporte para generadores y la palabra clave
await.
- Se quiere usar la propuesta de stack switching, pero por ahora se está usando transformación CPS para simular continuaciones.
- Después se implementarán la sintaxis y los tipos integrados y APIs.
Cómo funciona
- El proyecto transforma la sintaxis de JavaScript en instrucciones WASM y aprovecha las propuestas de WASM GC, manejo de excepciones y optimización de tail calls.
- Escribe código WASM adicional para simular los scopes y closures de JavaScript en WASM.
1 comentarios
Comentarios en Hacker News
Es un uso ingenioso de la nueva propuesta de WASM GC. Los compiladores previos de JS -> WASM incluían todo el motor de JS, pero este proyecto intenta mapear directamente las estructuras de JS a los elementos básicos de WASM.
Me gusta escribir Rust, pero no es un lenguaje de uso masivo. Rust está recibiendo mucha atención hoy en día y parece usarse en varios lugares.
Estoy seguro de que podrá cubrir el 100% de la especificación de JavaScript. Agradezco ideas, preguntas o críticas.
Leí el README.md del proyecto, pero no me queda claro cuál sería el uso esperado. Me pregunto cómo interactúa el código WASM generado con el runtime. Me pregunto si está pensado como una herramienta compatible con navegadores y otros runtimes de WASM, o si solo es compatible con el runtime acoplado al proyecto.
Se acerca la "ejecución de JS sin runtime de navegador". perforr, jaws u otro proyecto terminará logrando eso.
Me pregunto cómo se manejan las discrepancias de codificación de cadenas y las utilidades relacionadas. WASM soporta UTF-8 y JS soporta UTF-16 (potencialmente inválido).
Me gusta mucho este enfoque. En lugar de intentar generar binarios directamente, construir directamente para WASM significa que puede apoyarse en WASM GC y en el soporte asíncrono que se espera como parte de WASI 0.3.
Algunas personas a esto le llaman compilador. Gran trabajo.
Me pregunto si este código se ejecuta más rápido que ejecutar el mismo código en JS, o si está pensado para la interoperabilidad con otros lenguajes.