WebAssembly es un formato binario portable que promete aislamiento, rendimiento cercano al nativo y alta portabilidad con un entorno de ejecución con bajos requerimientos de recursos. En palabras del propio creador de Docker, WebAssembly podría venir a reemplazar las tecnologías de containerización clásicas con máquinas virtuales mucho más ligeras y fáciles de desplegar. A simple vista portabilidad y rendimiento parecen incompatibles. ¿Cómo ha logrado WebAssembly conseguir las dos?
Contexto
WebAssembly es una tecnología que permite ejecutar código de alto rendimiento en navegadores y entornos fuera de la web. Fue introducido en 2015 por el W3C como una respuesta a la necesidad de ejecutar aplicaciones complejas con la eficiencia cercana al código nativo sin depender exclusivamente de JavaScript.
Diseñado como un formato binario compacto y seguro, WebAssembly permite compilar código escrito en lenguajes como C, C++, Rust y otros, para ejecutarse en una máquina virtual. Por ello, se podría decir que WebAssembly es una tecnología de virtualización. Sus principales características incluyen portabilidad, rendimiento cercano al nativo, seguridad mediante un entorno de ejecución aislado (sandboxing) y compatibilidad con la gran mayoría de navegadores actuales.
La portabilidad en WebAssembly
El software que se ejecuta en las máquinas se escribe habitualmente en un lenguaje de alto nivel (C, C++, Rust, etc.), que es compilado a un archivo binario. Este archivo binario contiene las instrucciones que se darán al procesador para ejecutar ese código. Los binarios son específicos de una determinada plataforma (tipo de procesador y sistema operativo), lo que limita su portabilidad a la hora de distribuirlos en máquinas de distintas características. Existen algunas soluciones como los lenguajes interpretados como Python, cuyo código es transformado en instrucciones binarias en tiempo de ejecución, o los lenguajes como Java, que se compilan a un formato binario que no es específico de una determianda plataforma y se ejecuta en su propia máquina virtual.

WebAssembly se encuentra en esta segunda categoría. El código a ejecutar en WebAssembly es compilado a un formato binario que es interpretado por la máquina virtual de WebAssembly. Lo que hace verdaderamente portable a WebAssembly respecto a otros formatos binarios con su máquina virtual es el amplio catálogo de lenguajes de programación soportados y la introducción de la WebAssembly System Interface (WASI), una interfaz unificada que permite al código WebAssembly interactuar con el sistema anfitrión de la máquina virtual independientemente de su arquitectura y sistema operativo. Adicionalmente, la máquina virtual encargada de ejecutar los binarios de WebAssembly está estandarizada, por lo que cualquier binario de WebAssembly es compatible con cualquier implementación de la máquina virtual.
Rendimiento cercano al nativo
El alto rendimiento de WebAssembly respecto a otras tecnologías similares y su proximidad al rendimiento nativo son gracias a tres características: la compilación ahead of time (AoT), un modelo de memoria simplificado y la generación de binarios ligeros.
- Compilación AoT. El código en lenguaje de alto nivel es compilado primero a WebAssembly antes de la ejecucion. El código WebAssembly resultante es compilado de nuevo antes de la ejecución, esta vez al formato binario nativo de la plataforma en la que será ejecutado. Esto resulta en un rendimiento similar al nativo.
- Modelo de memoria simplificado. El modelo de memoria de WebAssembly es la memoria lineal, un vector de bytes contiguo que solamente puede crecer hasta los 4 GB. WebAssembly no implementa colectores de basura ni otros mecanismos complejos de gestión de memoria, lo que mejora notablemente el rendimiento del código compilado a WebAssembly.
- Binarios ligeros. A diferencia de los contenedores, cuyas imágenes incluyen un gran número de dependencias, los binarios de WebAssembly solamente incluyen lo imprescindible: el código a ejecutar y las librerías necesarias, todo compilado a WebAssembly. Esto facilita y acelera el despliegue y la ejecución de las aplicaciones.
WebAssembly más allá de la web
Aunque WebAssembly se diseñó inicialmente para ejecutarse en navegadores, su adopción se ha extendido a entornos de servidor, dispositivos móviles y sistemas embebidos. Proyectos como Wasmtime o WAMR (WebAssembly Micro Runtime) permiten ejecutar binarios WebAssembly en entornos fuera del navegador. Estos proyectos son implementaciones de la máquina virtual de WebAssembly que utilizan WASI para proporcionar al código compilado a WebAssembly un mecanismo para interactuar de manera segura con recursos fuera del entorno aislado. La aparición de estas máquinas virtuales ha facilitado la adopción de WebAssembly en contextos como la computación en el borde (edge computing), la nube y el internet de las cosas (IoT).
Específicamente en entornos de servidor, WebAssembly ofrece una alternativa ligera y segura a los contenedores tradicionales, permitiendo la ejecución de microservicios con un menor consumo de recursos y tiempos de arranque más rápidos. Además, su modelo de seguridad garantiza la ejecución aislada, protegiendo el sistema anfitrión de código malicioso. Estas características han hecho de WebAssembly una tecnología atractiva, y algunos proveedores de la nube como Azure ya permiten la ejecución de microservicios en WebAssembly.
Desventajas
Pese a las claras ventajas que WebAssembly ofrece en términos de rendimiento y portabilidad, todavía existen limitaciones significativas. La más importante es la falta de algunas funcionalidades debido a que WASI todavía no implementa las llamadas al sistema requeridas para ofrecerlas. Es el caso de la memoria compartida o la ejecución de múltiples hilos (estos últimos ya han sido portados a WebAssembly, aunque todavía con limitaciones).. Por otro lado, existen aplicaciones que tienen dependencias que son específicas de una determinada plataforma. WebAssembly requiere que esas dependencias puedan ser ejecutadas en la máquina virtual, lo cual es imposible, puesto que se trata de binarios específicos para esa plataforma. Debido a estos problemas, todavía existe un gran número de aplicaciones que no pueden ser compiladas a WebAssembly sin adaptarlas previamente, lo cual a veces supone un proceso tortuoso.
Conclusión
WebAssembly es una tecnología que se está abriendo paso en el mundo de la virtualización y los microservicios. Gracias a su portabilidad, aislamiento ligero, alto rendimiento y bajo consumo de los recursos, las aplicaciones en la nube y el edge se están viendo beneficiadas, reduciendo sus tiempos de ejecución y de despliegue.
Aunque aún enfrenta limitaciones, WebAssembly está en constante evolución y existen todo tipo de propuestas para implementar nuevas funcionalidades que todavía no están disponibles, aumentando el catálogo de aplicaciones compatibles.
Por todas sus características, WebAssembly se perfila como una tecnología clave para el desarrollo de aplicaciones multiplataforma en un futuro cercano.
Leave a Reply