WebAssembly: ¿la versión rápida de JavaScript?
Las aplicaciones que se ejecutan en navegador en lugar de ir instaladas en un disco duro son cada vez más completas. Además de los típicos programas de oficina como Microsoft 365 o Google Docs, que siempre presentan funciones nuevas, los juegos de navegador son cada vez más complejos y requieren más recursos. Este tipo de aplicaciones web se ofrece a menudo en JavaScript, pero, entretanto, cada vez más desarrolladores apuestan por WebAssembly: un nuevo planteamiento con resultados sorprendentes.
¿Qué es WebAssembly?
WebAssembly (abreviado, Wasm) es una nueva forma con la que los desarrolladores web pueden generar aplicaciones en internet. Hasta ahora, para ello había que recurrir a JavaScript. Pero JavaScript es relativamente lento y, en determinados escenarios, se ve limitado. Por eso, el World Wide Web Consortium (W3C) ha impulsado este nuevo método. Sin embargo, para que Wasm pueda funcionar, el navegador debe ser compatible con este lenguaje. Por este motivo, Mozilla (Firefox), Microsoft (Edge), Apple (Safari) y Google (Chrome) han participado en el desarrollo. En todas las versiones de navegador actuales de estos proveedores se pueden ejecutar aplicaciones en WebAssembly.
Para experimentar la capacidad de rendimiento de WebAssembly merece la pena jugar una partida a Funky Karts. El juego —en realidad, una aplicación móvil— se convirtió a WebAssembly para poder ejecutarse también en navegadores. El desarrollador ha escrito sobre el proyecto en un interesante blog, en el que ha descrito cada uno de los pasos de la conversión.
Fundamentalmente, WebAssembly se representa en forma de bytecode, que puede considerarse como un nivel intermedio entre el código máquina —que solo un ordenador puede entender— y un típico lenguaje de programación —legible para humanos, a condición de que se compile primero. Al requerir apenas esfuerzo para convertir el código, esto hace que WebAssembly sea más rápido. Sin embargo, escribir en bytecode es bastante inusual. La ventaja de Wasm es que no hace falta trabajar con este lenguaje de programación, ya que, en la práctica, la aplicación web puede escribirse en C o C++.
El texto fuente se convierte con la aplicación Emscripten. Antes de que existiera WebAssembly, esta herramienta ya estaba en uso para convertir código C/C++ a JavaScript (o ams.js). Actualmente, con ella también es posible transcribir código en Wasm. Esto significa que el código está precompilado y por ello no tiene que compilarse o interpretarse en el momento de la ejecución. Cuando el usuario abre finalmente la aplicación en el navegador, se inicia una pequeña máquina virtual. Y en ella se ejecuta la aplicación.
Ventajas de WebAssembly
Actualmente, WebAssembly presenta un único inconveniente: se difunde con mucha lentitud. Los desarrolladores web están acostumbrados al trabajo con JavaScript y no hay planes para desbancarlo. La dirección del proyecto da una gran importancia a que en la comunicación Wasm se presente como una opción complementaria de JavaScript. Pero, gracias a la compatibilidad con los grandes proveedores de navegadores y el W3C, la difusión está comenzando a despegar. Esto también se debe a que los visitantes de las páginas web no tienen que realizar ningún paso por su cuenta: las aplicaciones web en WebAssembly se cargan de manera tan sencilla como el código en JavaScript, solo que más rápido.
Muchos desarrolladores que ya escriben en C, C++ o en Rust, ahora también pueden programar directamente para la web. Los lenguajes de programación a veces también ofrecen otras posibilidades para el diseño de las aplicaciones: quien no encuentra en JavaScript las bibliotecas o los marcos adecuados para su programa, ahora cuenta con una selección más amplia para conseguir su objetivo. Los desarrolladores tienen por lo tanto varios motivos para estudiar WebAssembly con más detenimiento:
- Estándar web abierto de W3C
- Alto rendimiento y tamaños de archivo reducidos
- Por lo tanto, también perfecto para la navegación móvil
- En teoría, hace posible la realidad virtual en el navegador
- No se requiere ningún lenguaje de programación nuevo
- También se pueden utilizar C, C++ o Rust para la programación de aplicaciones web
- Compatible con todos los grandes proveedores de navegadores
- Sin limitaciones para el usuario
WebAssembly en la práctica
Realmente, no se espera que nadie programe en WebAssembly. De hecho, la principal ventaja de esta tecnología es que el programador puede usar uno de los lenguajes conocidos, como C. El código se transfiere luego al formato Wasm. No obstante, tiene sentido ahondar en el código ya compilado y echar un vistazo al funcionamiento de WebAssembly.
Hay dos variantes diferentes del código fuente: WebAssembly Text Format (WAT) y WebAssembly Binary Format (Wasm). Este último es el código real que la máquina ejecuta. Sin embargo, como está compuesto exclusivamente de código binario, no resulta útil para un análisis humano, motivo por el que existe el formato intermedio WAT. Como el código utiliza expresiones legibles, los propios programadores pueden analizarlo, si bien carece de la comodidad de trabajo que se conoce de los lenguajes de programación establecidos.
En este ejemplo se usa un código fuente muy simple en C:
El mismo código en formato WAT es mucho más largo:
La legibilidad está muy limitada, si bien se pueden distinguir algunos elementos. En WebAssembly todo se divide en diferentes módulos. A su vez los módulos se dividen en funciones, que se especifican con parámetros. En total se distinguen cinco elementos:
- module: la unidad superior de WebAssembly
- function: agrupación dentro de un módulo
- memory: array con Bytes
- global: valor que se puede usar con diferentes módulos
- table: almacenamiento de referencias
Si el código se traduce en forma binaria, es imposible entender nada:
Si quieres experimentar con WebAssembly por primera vez, puedes hacerlo en el WebAssembly Studio. Aquí hay disponible un entorno de desarrollo online para Wasm.