Wasmer 3.0 llega con mejoras en WASI, APIs, gestión de memoria y mas
Después de casi 6 meses desde el lanzamiento anterior, se dio a conocer la nueva versión de Wasmer 3.0, la tercera versión principal del proyecto que desarrolla un tiempo de ejecución para ejecutar módulos WebAssembly que se pueden usar para crear aplicaciones universales que se pueden ejecutar en diferentes sistemas operativos, así como la ejecución de código que no es de confianza.
La capacidad de ejecutar la misma aplicación en diferentes plataformas se proporciona al compilar el código en un código intermedio WebAssembly de bajo nivel que puede ejecutarse en cualquier sistema operativo o integrarse en programas en otros lenguajes de programación. Los programas son contenedores livianos que ejecutan pseudocódigo WebAssembly.
Estos contenedores no están vinculados al sistema operativo y pueden incluir código escrito originalmente en cualquier lenguaje de programación.
Para traducir WebAssembly al código de máquina de la plataforma actual, se admite conectar diferentes backends de compilación (Singlepass, Cranelift, LLVM) y motores (usando JIT o generando código de máquina). El control de acceso y la interacción con el sistema se proporcionan mediante la API WASI (WebAssembly System Interface), que proporciona interfaces de programación para trabajar con archivos, sockets y otras funciones proporcionadas por el sistema operativo.
La plataforma permite lograr un rendimiento de ejecución de aplicaciones cercano al de las compilaciones nativos.
Principales novedades de Wasmer 3.0
En esta nueva versión de Wasmer 3.0, se agregó la capacidad de crear archivos ejecutables nativos para cualquier plataforma. El comando «wasmer create-exe» se ha rediseñado por completo para convertir un archivo de código intermedio de WebAssembly en ejecutables autónomos para plataformas Linux, Windows y macOS que pueden ejecutarse sin instalar Wasmer.
Otra de las novedades que se presenta, es que se agregó la capacidad de ejecutar paquetes WAPM ubicados en el directorio wapm.io usando el comando «wasmer run». Por ejemplo, ejecutar «wasmer run python/python» descargará el paquete python del repositorio wapm.io y lo ejecutará.
La API Wasmer Rust se ha rediseñado por completo, cambiando la forma en que maneja la memoria y brindando la capacidad de almacenar objetos Wasm de forma segura en la estructura Store.
Tambien se destaca en esta nueva versión de Wasmer 3.0 la implementación mejorada de la API WASI (WebAssembly System Interface), ademas de que se corrigieron problemas en la API de WASI para trabajar con el sistema de archivos. Se han rediseñado los tipos internos utilizando WAI (WebAssembly Interfaces), lo que permitirá implementar una serie de nuevas funcionalidades en el futuro.
Ademas de ello, tambien se han simplificado los motores, ya que en lugar de motores separados para JIT, enlace dinámico y estático (Universal, Dylib, StaticLib), ahora se ofrece un motor común y carga y guarda código en el que se controla en el nivel de configuración de parámetros.
Para deserializar artefactos, se utiliza el marco rkyv, que proporciona una operación de copia cero, es decir, no requiere asignación de memoria adicional y realiza la deserialización utilizando solo el búfer proporcionado inicialmente.
De los demás cambios que se destacan de esta nueva versión:
- El uso de rkyv aumentó significativamente la velocidad de inicio.
- El compilador Singlepass se ha mejorado para admitir funciones de valores múltiples, mejorar la confiabilidad y agregar soporte para marcos de manejo de excepciones.
- El conjunto de componentes wasmer-js se ha implementado para ejecutar Wasmer en un navegador web e interactuar con él desde JavaScript utilizando la biblioteca wasm-bindgen.
- Se ha propuesto una nueva estructura MemoryView que permite leer y escribir datos en un área de memoria lineal.
Finalmente, cabe mencionar que los programas se distribuyen en forma de módulos WebAssembly ordinarios, que se pueden administrar mediante el administrador de paquetes WAPM. Wasmer también está disponible como una biblioteca que se puede usar para incrustar código WebAssembly en programas Rust, C/C++, C#, D, Python, JavaScript, Go, PHP, Ruby, Elixir y Java.
El código del proyecto está escrito en Rust y se distribuye bajo la licencia MIT y puedes consultar más al respecto, en el siguiente enlace.