11 puntos por GN⁺ 2025-05-10 | 2 comentarios | Compartir por WhatsApp
  • La especificación de Wasm 2.0 fue anunciada oficialmente
  • La comunidad de Wasm y los Working Groups completaron la especificación desde 2022, y las implementaciones principales ya eran compatibles con 2.0
  • A partir de 2.0 se introduce un modelo evergreen, por lo que el documento Candidate Recommendation se actualiza continuamente para mantenerse al día
  • En lugar de moverlo a una recomendación final cada vez que se anuncia una nueva versión, el borrador actual de recomendación se considera el estándar

Principales funciones y añadidos de Wasm 2.0

  • Instrucciones vectoriales (SIMD): se agregan 236 instrucciones nuevas para aprovechar las capacidades SIMD de 128 bits de las CPU modernas; son eficientes para códecs de audio/video de alto rendimiento, machine learning, criptografía y más
  • Instrucciones de memoria masiva: se añade un conjunto de instrucciones que permite copiar e inicializar memoria y tablas rápidamente
  • Retorno multivalor: las funciones y bloques pueden devolver varios valores, lo que mejora la convención de llamada y habilita transformaciones adicionales del programa
  • Tipos de referencia: se admiten referencias a funciones o punteros a objetos externos (por ejemplo, valores de JavaScript) como valores opacos de primera clase; las tablas pueden usarse como almacenamiento de estos valores de referencia, y se habilitan instrucciones para manejar tablas y la definición de múltiples tablas
  • Conversiones sin trap: se introducen instrucciones de conversión que evitan traps inesperados al convertir de punto flotante a entero
  • Instrucciones de extensión de signo: se añaden instrucciones para extender directamente el ancho de enteros con signo, lo que permite hacerlo sin acceso a memoria como antes

Compatibilidad hacia atrás y perspectivas futuras

  • Wasm 2.0 es totalmente compatible con 1.0, por lo que los programas existentes funcionan sin cambios
  • El lanzamiento de Wasm 3.0 también está previsto próximamente

2 comentarios

 
caniel 2025-05-10

WA!(SM)

 
GN⁺ 2025-05-10
Opiniones en Hacker News
  • Resumiendo el anuncio de WASM 2.0 de marzo de 2025: es una gran actualización con 236 nuevas instrucciones vectoriales, incluyendo SIMD de 128 bits, que mejoran mucho el rendimiento de códecs de video/audio, aplicaciones de machine learning y criptografía; instrucciones de bulk memory para copia/inicialización rápida de memoria; las funciones ahora pueden devolver múltiples resultados, lo que permite convenciones de llamada más rápidas y menos indirección; con reference types, los punteros a objetos externos (como valores de JavaScript) se tratan como valores de primera clase; se pueden declarar tablas de varios tipos; además de instrucciones de expansión de ancho de bits y conversiones de punto flotante sin traps inesperados
    • Rust+LLVM todavía no puede aprovechar en la práctica el soporte de retorno de múltiples resultados por un problema de compatibilidad ABI; no sé bien cómo está la situación del lado de Clang
    • La parte de instrucciones vectoriales (SIMD) parece haberse vuelto demasiado compleja por buscar optimización demasiado pronto; habría sido más elegante usar simplemente la propuesta de vectores de tamaño flexible
    • La función de retorno de múltiples resultados también sería muy beneficiosa para el desarrollo de runtimes de Common Lisp
    • Al final del post oficial dice “presentaremos Wasm 3.0 pronto”, así que parece que Wasm 3.0 realmente llegará dentro de poco
    • Una ISA independiente de la arquitectura y de propósito general, y una ISA que aproveche al máximo el SIMD específico de cada CPU, no pueden coexistir; hay que elegir una de las dos. No pude verificar si las instrucciones SIMD de Wasm 2 son lo bastante generales por culpa del rate limit de GitHub
  • La especificación de WebAssembly es bastante fácil de leer, pero para principiantes que no quieran meterse con el texto completo de la spec recomiendo el libro en línea WebAssembly from the Ground Up; está pensado para aprender paso a paso construyendo directamente un compilador en JavaScript, así que va muy bien para práctica, y también tiene muestras gratis. Como referencia, soy uno de los autores
    • Personalmente, una de las razones por las que me gusta Ada es que código engorroso como las funciones de verificación de U32 en JavaScript se puede resolver de forma muy limpia en Ada con subtipos (subtype) o módulos
    • Me pregunto si es posible instrumentar código WASM para hacer depuración in-process; es decir, convertir un lenguaje personalizado a WASM en tiempo real y poder implementar de una vez breakpoints e inspección de memoria en la web
  • Trabajando el último año en el desarrollo de un runtime de WebAssembly, me impresionaron la rigurosidad de la spec y lo bien provistas que están las pruebas; toma algo de tiempo acostumbrarse, pero una vez que lo haces es una especificación de lenguaje muy inteligente. En situaciones ambiguas ayuda mucho el intérprete de referencia generado directamente desde la spec, y las pruebas de la spec para verificar consistencia también son muy útiles
  • La propuesta de Wasm Constant Time pasó recientemente a estado inactive; la mayor parte del trabajo real se hizo en 2018, pero la integración con SIMD y la incorporación como extensión oficial siguen pospuestas. A menos que alguien retome este trabajo tan importante, toda la criptografía en Wasm seguirá siendo muy vulnerable a ataques de timing
  • Me llamó la atención que Wasm sea una abreviación de WebAssembly, pero no un acrónimo, así que no se escribe en mayúsculas como WASM
    • Siguiendo esa lógica, ¿no debería ser WAsm?
    • Incluso si fuera un acrónimo, hay muchos casos que se escriben totalmente en minúsculas (por ejemplo: scuba, radar, laser)
    • Ojalá salga bien jaja
  • Me da curiosidad ver una lista de apps WASM que realmente funcionen; la idea suena bien, pero da la impresión de ser como las DAPPs, algo que “existe más por diversión” que por uso real. Estaría bueno ver ejemplos concretos
    • Recomiendo madewithwebassembly.com y el GitHub de Awesome-WebAssembly-Applications. Son buenos recursos con apps WASM reales bien recopiladas
  • Este lanzamiento de WASM 2 es excelente, pero deja un sabor agridulce la introducción de SIMD de tamaño fijo (128 bits); habría sido mejor un enfoque flexible, como ARM SVE, donde el compilador ajusta el ancho SIMD según el rendimiento del dispositivo
    • Pero yo más bien creo que el SIMD de tamaño fijo abre más casos de uso. Las instrucciones vectoriales se pueden sustituir relativamente fácil incluso con SIMD de tamaño fijo. SIMD no siempre es indispensable, pero hay muchos usos oportunistas que se vectorizan gracias al tamaño de los registros, y en esos casos puede ser bastante útil
    • El problema de raíz es optimizar demasiado pronto; este tema de SIMD también habría sido mucho más elegante si simplemente hubieran seguido la propuesta de vectores de tamaño variable
  • Me pregunto si una función en C que devuelve un valor como struct se puede compilar a WASM
    • Sí se puede, pero hasta donde sé, por ahora no se puede “exportar” a JS
  • Me pregunto si ya existe algún runtime que haya implementado las funciones de WASM 2
    • La mayoría ya las viene implementando desde hace tiempo; la comunidad y el working group de Wasm cerraron la spec a inicios de 2022, y las implementaciones principales ya ofrecían 2.0 desde antes. 3.0 también se oficializará pronto, y algunas funciones ya existen detrás de un feature flag
  • Pienso que el bytecode para la web es un sueño viejo; como desarrollador de C#, me impresiona que Blazor haya liderado WASM con tanta decisión desde sus inicios. .NET va bastante adelantado en WASM, y tengo expectativas por estos cambios de 2.0