Software
Java
Desarrollo

¿Qué es WebAssembly? La plataforma web de próxima generación explicada

WebAssembly es un formato de instrucciones binarias y una máquina virtual que aporta un rendimiento casi nativo a las aplicaciones de los navegadores web y permite a los desarrolladores crear aplicaciones web de alta velocidad en el lenguaje que deseen.

programación desarrollo ordenador

Desde hace dos décadas, sólo tenemos un lenguaje de programación disponible para utilizarlo de forma nativa en un navegador web: JavaScript. La lenta muerte de los plug-ins binarios de terceros ha descartado otros lenguajes, como Java y ActionScript de Flash, como ciudadanos de primera clase para el desarrollo web. Otros lenguajes web, como CoffeeScript, se limitan a compilar a JavaScript.

Pero ahora tenemos una nueva posibilidad: WebAssembly, o Wasm para abreviar. WebAssembly es un formato binario pequeño y rápido que promete un rendimiento casi nativo para las aplicaciones web. Además, WebAssembly está diseñado para ser un objetivo de compilación para cualquier lenguaje, siendo JavaScript uno de ellos.

Ahora que todos los principales navegadores son compatibles con WebAssembly, es hora de empezar a pensar seriamente en escribir aplicaciones del lado del cliente para la web que puedan compilarse como WebAssembly.

Hay que tener en cuenta que las aplicaciones WebAssembly no están pensadas para sustituir a las aplicaciones JavaScript, al menos no todavía. En su lugar, piensa en WebAssembly como un compañero de JavaScript. Mientras que JavaScript es flexible, está tipado dinámicamente y se suministra a través de un código fuente legible, WebAssembly es de alta velocidad, está fuertemente tipado y se suministra a través de un formato binario compacto.

Los desarrolladores deberían tener en cuenta WebAssembly para casos de uso intensivo de rendimiento, como juegos, transmisión de música, edición de vídeo y aplicaciones CAD. Muchos servicios web ya han dado el paso, como Google Earth. Figma, una aplicación de dibujo y diagramación colaborativa, recurrió a WebAssembly para reducir los tiempos de carga y la velocidad de ejecución incluso cuando WebAssembly era relativamente nuevo.

 

Cómo funciona WebAssembly

WebAssembly, desarrollado por el W3C, en palabras de sus creadores, es un "objetivo de compilación". Los desarrolladores no escriben WebAssembly directamente; escriben en el lenguaje de su elección, que luego se compila en bytecode WebAssembly. A continuación, el código de bytes se ejecuta en el cliente —normalmente en un navegador web—, donde se traduce a código máquina nativo y se ejecuta a gran velocidad.

El código WebAssembly está pensado para ser más rápido de cargar, analizar y ejecutar que JavaScript. Cuando WebAssembly es utilizado por un navegador web, todavía existe la sobrecarga de descargar el módulo Wasm y configurarlo. En los proyectos Wasm más grandes, esos módulos pueden alcanzar varios megabytes, por lo que esos retrasos pueden ser significativos. Pero en igualdad de condiciones, WebAssembly funciona más rápido.

WebAssembly también proporciona un modelo de ejecución en espacio aislado, basado en los mismos modelos de seguridad que existen ahora para JavaScript. Las aplicaciones Wasm no pueden acceder a nada fuera de la zona de pruebas directamente, incluyendo el DOM de la página web en la que se están ejecutando. Cualquier interacción con el resto de la máquina debe utilizar ABI como la WebAssembly System Interface (WASI). WASI proporciona un acceso controlado a los archivos, a la red, al reloj del sistema y a otros servicios del sistema que suelen ser necesarios en los programas.

Ahora mismo, la ejecución de WebAssembly en los navegadores web es el caso de uso más común, pero WebAssembly pretende ser algo más que una solución basada en la web. El proyecto Wasmer ejecuta las aplicaciones WebAssembly en el lado del servidor, de la misma manera que el tiempo de ejecución Node.js ejecuta JavaScript fuera del navegador.

 

Casos de uso de WebAssembly

El caso de uso más básico de WebAssembly es como objetivo para escribir software dentro del navegador. Los componentes que se compilan en WebAssembly pueden escribirse en cualquiera de los distintos lenguajes; la carga útil final de WebAssembly se entrega entonces al cliente a través de JavaScript.

WebAssembly se ha diseñado pensando en una serie de casos de uso intensivo en el navegador: juegos, transmisión de música, edición de vídeo, CAD, encriptación y reconocimiento de imágenes, por nombrar sólo algunos.

En general, es instructivo centrarse en estas tres áreas al determinar tu caso de uso particular de WebAssembly:

  • Código de alto rendimiento que ya existe en un lenguaje seleccionable. Por ejemplo, si tiene una función matemática de alta velocidad ya escrita en C y desea incorporarla a una aplicación web, podría desplegarla como un módulo de WebAssembly. Las partes de la aplicación menos críticas para el rendimiento y orientadas al usuario pueden permanecer en JavaScript.
  • Código de alto rendimiento que necesita ser escrito desde cero, donde JavaScript no es ideal. Anteriormente, uno podría haber utilizado asm.js para escribir dicho código. Todavía se puede hacer, pero WebAssembly se está posicionando como una mejor solución a largo plazo.
  • Portar una aplicación de escritorio a un entorno web. Muchas de las demostraciones tecnológicas de asm.js y WebAssembly entran en esta categoría. WebAssembly puede proporcionar un sustrato para aplicaciones más ambiciosas que una simple interfaz gráfica de usuario presentada a través de HTML. Vea las demostraciones de WebDSP y Windows 2000 en el navegador, para ver dos ejemplos.

Si tienes una aplicación de JavaScript que no supera los límites de rendimiento, es mejor dejarla sola en esta etapa de desarrollo de WebAssembly. Pero si necesitas que esa aplicación vaya más rápido, WebAssembly puede ayudarte.

 

Compatibilidad con el lenguaje WebAssembly 

WebAssembly no está pensado para ser escrito directamente. Como su nombre indica, se parece más a un lenguaje ensamblador, algo para que lo consuma la máquina, que a un lenguaje de programación de alto nivel y amigable para el ser humano. WebAssembly está más cerca de la representación intermedia (IR) generada por la infraestructura del compilador de lenguajes LLVM, que de C o Java.

Así, la mayoría de los escenarios para trabajar con WebAssembly implican escribir código en un lenguaje de alto nivel y convertirlo en WebAssembly. Esto puede hacerse de tres maneras básicas:

  • Compilación directa. El código fuente se traduce a WebAssembly por medio de la cadena de herramientas del compilador propio del lenguaje. Rust, C/C++, Kotlin/Native y D tienen ahora formas nativas de emitir Wasm desde los compiladores que soportan esos lenguajes.
  • Herramientas de terceros. El lenguaje no tiene soporte nativo para Wasm en su cadena de herramientas, pero se puede utilizar una utilidad de terceros para convertir a Wasm. Java, Lua y la familia de lenguajes .Net tienen algún tipo de soporte como este.
  • Intérprete basado en WebAssembly. En este caso, el lenguaje en sí no se traduce a WebAssembly, sino que un intérprete para el lenguaje, escrito en WebAssembly, ejecuta el código escrito en el lenguaje. Este es el enfoque más engorroso, ya que el intérprete puede tener varios megabytes de código, pero permite que el código existente escrito en el lenguaje se ejecute sin cambios. Python (a través de PyScript, por ejemplo) y Ruby tienen intérpretes traducidos a Wasm.
  •  

Características de WebAssembly

WebAssembly se encuentra todavía en una fase inicial. La cadena de herramientas y la implementación de WebAssembly siguen siendo más una prueba de concepto que una tecnología de producción. Dicho esto, los responsables de WebAssembly tienen la vista puesta en hacer que WebAssembly sea más útil a través de una serie de iniciativas:

Elementos primitivos de recolección de basura

WebAssembly no admite directamente lenguajes que utilicen modelos de memoria con recolección de basura. Lenguajes como Lua o Python sólo pueden soportarse restringiendo los conjuntos de características o incrustando todo el tiempo de ejecución como un ejecutable de WebAssembly. Sin embargo, se está trabajando en la compatibilidad con los modelos de memoria recolectada, independientemente del lenguaje o la implementación.

Enhebrado

El soporte nativo de hilos es común a lenguajes como Rust y C++. La ausencia de soporte para threading (enhebrado) en WebAssembly significa que clases enteras de software orientado a WebAssembly no pueden ser escritas en esos lenguajes. La propuesta de añadir hilos a WebAssembly utiliza el modelo de hilos de C++ como una de sus inspiraciones.

Operaciones de memoria masiva y SIMD

Las operaciones de memoria masiva y el paralelismo SIMD (instrucción única, datos múltiples) son imprescindibles para las aplicaciones que procesan montones de datos y necesitan la aceleración nativa de la CPU para no ahogarse, como el aprendizaje automático o las aplicaciones científicas. Hay propuestas sobre la mesa para añadir estas capacidades a WebAssembly mediante nuevos operadores.

Construcciones de lenguaje de alto nivel

Muchas otras funciones que se están considerando para WebAssembly se corresponden directamente con construcciones de alto nivel de otros lenguajes.

  • Las excepciones pueden emularse en WebAssembly, pero no pueden implementarse de forma nativa a través del conjunto de instrucciones de WebAssembly. El plan propuesto para las excepciones incluye primitivas de excepción compatibles con el modelo de excepción de C++, que a su vez podrían ser utilizadas por otros lenguajes compilados en WebAssembly.
  • Los tipos de referencia facilitan el paso de objetos utilizados como referencias al entorno anfitrión. Esto haría que la recolección de basura y otras funciones de alto nivel fueran más fáciles de implementar en WebAssembly.
  • Llamadas de cola, un patrón de diseño utilizado en muchos lenguajes.
  • Funciones que devuelven múltiples valores, por ejemplo, mediante tuplas en Python o C#.
  • Operadores de extensión de signos, una útil operación matemática de bajo nivel. (LLVM también los soporta).

Herramientas de depuración y perfilado

Uno de los mayores problemas con el JavaScript transpilado era la dificultad para depurar y perfilar, debido a la incapacidad de correlacionar el código transpilado con el fuente. Con WebAssembly, tenemos un problema similar, y se está abordando de forma parecida (soporte de mapa de fuentes). Véase la nota del proyecto sobre el soporte de herramientas previsto.



TE PUEDE INTERESAR...

Nuevo número de nuestra revista de canal 
 
DealerWorld Digital

 

Cobertura de nuestros encuentros

 

Documentos ComputerWorld



Forma parte de nuestra comunidad

 

¿Te interesan nuestras conferencias?