El consorcio W3C ha anunciado la finalización de la especificación que estandariza el código intermedio WebAssembly 3.0 y su API asociada, permitiendo la creación de aplicaciones de alto rendimiento que son portables entre navegadores y plataformas de hardware. WebAssembly proporciona un código intermedio universal de bajo nivel independiente del navegador para ejecutar aplicaciones compiladas desde varios lenguajes de programación.
La tecnología WebAssembly puede ser utilizada para ejecutar en el navegador tareas que requieren un alto rendimiento, como la codificación de video, el procesamiento de audio, la manipulación de gráficos y 3D, el desarrollo de juegos, operaciones criptográficas y cálculos matemáticos mediante la organización de la ejecución en el navegador de código escrito en lenguajes compilables, como C/C++. Gracias al uso de JIT para WebAssembly, se puede alcanzar un nivel de rendimiento cercano al código nativo.
Entre los principales objetivos de WebAssembly se destacan la portabilidad, la previsibilidad del comportamiento y la identidad de la ejecución del código en diferentes plataformas. WebAssembly no se limita a los navegadores y también se promueve como una plataforma universal para la ejecución segura de código en cualquier infraestructura, sistema operativo y dispositivo.
Las siguientes especificaciones están disponibles:
- WebAssembly Core — describe una máquina virtual de bajo nivel para ejecutar código intermedio de WebAssembly. Los recursos relacionados con WebAssembly se entregan en formato «.wasm», similar a los archivos «.class» en Java y que contienen datos estáticos y segmentos de código para trabajar con estos datos.
- WebAssembly JavaScript API — proporciona una API para la integración con JavaScript. 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 interacción con el sistema subyacente se realiza de manera análoga a la ejecución del código JavaScript.
- WebAssembly Web API — define una interfaz de programación basada en el mecanismo de Promesas para solicitar y ejecutar recursos «.wasm». El formato de los recursos de WebAssembly está optimizado para iniciar la ejecución sin esperar a que se complete la carga del archivo, lo que mejora la capacidad de respuesta de las aplicaciones web.
- WASI API — define un interfaz de sistema modular para ejecutar WebAssembly fuera de los navegadores y proporcionar acceso a recursos como archivos, conexiones de red, generadores de números pseudoaleatorios y relojes del sistema.
Se destaca que en la nueva versión del estándar se ha mejorado significativamente el soporte para la compilación de lenguajes de alto nivel a WebAssembly. Por ejemplo, se ha implementado la posibilidad de compilar proyectos en lenguajes como Java, OCaml, Scala, Kotlin, Scheme y Dart. Los principales cambios en WebAssembly 3.0 en comparación con la segunda versión del estándar son:
- Se ha implementado soporte para un espacio de direcciones de 64 bits. Ahora se puede utilizar el tipo i64 para la direccionamiento de memoria, no solo el i32, lo que amplía el espacio de direcciones disponible para las aplicaciones de 4 GB a 16 EB (cuando se ejecuta en el navegador hay un límite de 16 GB).
- Se proporciona la posibilidad de utilizar simultáneamente múltiples objetos de memoria en un solo módulo de WebAssembly y trabajar con diferentes espacios de direcciones. Entre otras cosas, es posible copiar datos entre diferentes instancias de objetos de memoria ubicados en diferentes espacios de direcciones.
- Se ha agregado soporte para la recolección de basura. Además de la memoria lineal disponible anteriormente, se ha propuesto un tipo de almacenamiento separado, que se gestiona automáticamente mediante un recolector de basura. El compilador ahora puede utilizar estructuras de datos, matrices y variables separadas, de las que WebAssembly se encarga de la asignación de memoria y la gestión del ciclo de vida.
- Se ha agregado soporte para enlaces tipificados, que pueden describir la estructura exacta del valor al que apunta el enlace, lo que permite evitar verificaciones adicionales en tiempo de ejecución. Se admiten subtipos, recursión de tipos y la posibilidad de usar enlaces a funciones de manera segura, sin necesidad de verificaciones de tipos y límites en tiempo de ejecución.
- Se ha agregado soporte para llamadas en cola (Tail call), donde la función actual termina inmediatamente después de llamar a otra función, sin consumir espacio en la pila.
- Se ha agregado soporte para el manejo de excepciones.
- Se ha agregado soporte para instrucciones SIMD de vecto 'relajadas' (relaxed), que permiten lograr un mayor rendimiento al renunciar a una estricta adhesión a la semántica en todas las plataformas de hardware.
- Se ha añadido soporte para un perfil de ejecución determinista, que define un comportamiento independiente de la plataforma actual para las instrucciones cuyos resultados de ejecución pueden variar en diferentes plataformas (operaciones de punto flotante, retorno del valor NaN, instrucciones vectoriales debilitadas). Al seleccionar este perfil, Wasm garantiza un comportamiento determinista, reproducibilidad y portabilidad.
- Se ha añadido la sintaxis para crear anotaciones personalizadas, que permiten adjuntar información adicional al código WebAssembly. Anteriormente, el soporte para secciones personalizadas que permiten almacenar información arbitraria estaba presente en el formato binario de WebAssembly, pero faltaba en el formato de texto de WebAssembly. Ahora es posible agregar esta información de manera legible y editable.
- Se han añadido funciones integradas en la API de JavaScript para trabajar con cadenas. Anteriormente, las cadenas de JavaScript solo podían pasarse a WebAssembly como referencias externas, pero ahora se pueden acceder y manipular directamente dentro de WebAssembly.
Fuente: opennet.ru
