2 puntos por GN⁺ 2024-11-11 | 1 comentarios | Compartir por WhatsApp
  • 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

 
GN⁺ 2024-11-11
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.

    • Hace tiempo hice un compilador para embebidos ARM que era casi TypeScript. Algunas técnicas podrían ser útiles.
  • 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.

    • Me pregunto si hay resultados de test262_runner.rb. Estaría bien mostrar ese progreso en el README. Excelente proyecto.
  • 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.

    • También me pregunto cómo reacciona cuando encuentra APIs web o identificadores globales definidos solo en ciertos entornos dentro del código JavaScript. Si no es para ese entorno, me pregunto cómo se manejaría la E/S al usarlos.
  • 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.