Se dio a conocer el borrador del estándar WebAssembly 2.0
El W3C dio a conocer hace poco mediante una publicación, un borrador de una nueva especificación que estandariza el código de preparación de WebAssembly 2.0 y la API asociada para permitir la creación de aplicaciones de alto rendimiento que son portátiles entre navegadores y plataformas de hardware.
Para quienes desconocen de WebAssembly, deben saber que este proporciona un middleware genérico, de bajo nivel e independiente del navegador, para ejecutar aplicaciones compiladas a partir de varios lenguajes de programación. Gracias al uso de JIT para WebAssembly, puede lograr un nivel de rendimiento cercano al código nativo.
Sobre WebAssembly
WebAssembly se puede utilizar para realizar tareas de alto rendimiento en el navegador, como codificación de video, procesamiento de audio, manipulación de gráficos y 3D, desarrollo de juegos, operaciones criptográficas y cálculos matemáticos, mediante la ejecución de código escrito en lenguajes compilados como C/ C++.
Entre las principales tareas de WebAssembly está la provisión de portabilidad, previsibilidad de comportamiento e identidad de ejecución de código en diferentes plataformas. Recientemente, WebAssembly también se ha promocionado como una plataforma universal para la ejecución segura de código en cualquier infraestructura, sistema operativo y dispositivo, sin limitarse a los navegadores.
Sobre el borrador de WebAssembly 2.0
Por la parte de las modificaciones que se han realizado desde WebAssembly estan las propuestas terminadas para WebAssembly 2.0 se encuentran SIMD de ancho fijo, operaciones de memoria masiva, tipos de referencia, compatibilidad con BigInt de JavaScript para WebAssembly i64, compatibilidad con múltiples valores de retorno e importación/exportación de variables globales mutables.
El W3C ha publicado tres borradores de especificaciones de WebAssembly 2.0:
- WebAssembly Core: describe una máquina virtual de bajo nivel para ejecutar código intermedio de WebAssembly. Los recursos relacionados con WebAssembly vienen en formato «.wasm», similar a los archivos Java «.class», que contienen datos estáticos y segmentos de código para trabajar con esos datos.
- Interfaz JavaScript de WebAssembly: proporciona una API para la integración con JavaScript. Le permite obtener valores y pasar parámetros a las funciones de WebAssembly. La ejecución de WebAssembly sigue el modelo de seguridad de JavaScript y toda la interacción con el sistema principal se realiza de manera similar a la ejecución del código JavaScript.
- WebAssembly Web API: define una API basada en el mecanismo Promise para solicitar y ejecutar recursos «.wasm». El formato de recursos de WebAssembly está optimizado para iniciar la ejecución sin esperar a que el archivo se descargue por completo, lo que mejora la capacidad de respuesta de las aplicaciones web.
Diferencias entre WebAssembly y WebAssembly 2.0
Ademas, cabe resaltar que existen algunos cambios importantes en WebAssembly 2.0 en comparación con la primera versión del estándar:
- Compatibilidad con el tipo de vector v128 y las instrucciones de vector relacionadas que le permiten realizar operaciones en múltiples valores numéricos en paralelo (SIMD, instrucción única, datos múltiples).
- Capacidad para importar y exportar variables globales mutables, lo que permite el enlace global para valores como punteros de pila en C++.
- Nuevas instrucciones para convertir float a int, que en lugar de generar una excepción en el desbordamiento de resultados, devuelve el valor mínimo o máximo posible (requerido para SIMD).
- Instrucciones para expandir el signo de números enteros (aumentar la profundidad de bits de un número manteniendo el signo y el valor).
- Soporte para devolver múltiples valores por bloques y funciones (además de pasar múltiples parámetros a funciones).
- Implementar las funciones de JavaScript BigInt64Array y BigUint64Array para convertir entre el tipo de JavaScript BigInt y la representación WebAssembly de enteros de 64 bits.
- Soporte para tipos de referencia (funcref y externref) y sus instrucciones asociadas (select, ref.null, ref.func y ref.is_null).
- Instrucciones memory.copy, memory.fill, memory.init y data.drop para copiar datos entre regiones de memoria y borrar regiones de memoria.
- Instrucciones para acceso directo y modificación de tablas (table.set, table.get, table.size, table.grow).
- Capacidad para crear, importar y exportar múltiples tablas en un módulo. Funciones para copiar/llenar tablas en modo por lotes (table.copy, table.init y elem.drop).
Finalmente si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace.