coldwa.st
Todas las guíasProgramaciónWebDatosHerramientasBases de datosHaskellConceptosCabal y buildsToolchainCompiladorRendimientoEditor y HLS

WebAssembly · compilación · máquinas virtuales

¿Qué es WebAssembly, exactamente?

Por ColdwastActualizado el 2 de agosto de 20267 min de lectura#wasm#compilers#web
Contenedores de transporte apilados en varias filas de altura contra un cielo azul
Contenedores de transporte apilados en varias filas de altura contra un cielo azul, idénticos en forma sea cual sea su carga.

El malentendido más común sobre WebAssembly es creer que es un lenguaje que se escribe. No lo es. La definición oficial es precisa, y leerla al pie de la letra responde a la mayoría de las preguntas que la gente tiene.

La definición, palabra por palabra

WebAssembly, abreviado Wasm, es un formato de instrucciones binario para una máquina virtual basada en pila. Está diseñado como un objetivo de compilación portable para lenguajes de programación, que permite el despliegue en la web para aplicaciones cliente y servidor.

De ahí se siguen dos cosas de inmediato. Es un objetivo, lo que significa que otra cosa se compila hacia él, igual que C se compila a código máquina. Y está basado en pila, que es una decisión de diseño sobre cómo la máquina virtual guarda los operandos, no un detalle con el que interactúes directamente.

No se espera que nadie escriba Wasm a mano para producción, igual que nadie escribe x86 a mano. Tú escribes Rust, C, Go u otro lenguaje, y el compilador emite Wasm.

Los cuatro objetivos de diseño, y lo que cuesta cada uno

El proyecto enuncia cuatro objetivos, y merece la pena leerlos como compromisos y no como una lista de características.

Eficiencia. La máquina de pila está diseñada para ejecutarse a velocidad nativa aprovechando las capacidades de hardware comunes disponibles en una amplia gama de plataformas. Fíjate en el matiz: capacidades comunes, en una amplia gama. La velocidad aquí viene de apuntar a lo que toda plataforma tiene, no de explotar lo que una sola hace mejor.

Seguridad. Wasm describe un entorno de ejecución seguro en memoria y aislado en un sandbox, que además puede implementarse dentro de las máquinas virtuales de JavaScript existentes. El módulo no puede alcanzar nada fuera de lo que el anfitrión le entrega.

Apertura. Está diseñado para imprimirse de forma legible en un formato textual para depurar, probar, experimentar, optimizar, aprender, enseñar y escribir programas a mano. Un formato binario que envía una contraparte legible está tomando una decisión deliberada contra la opacidad.

Portabilidad. El objetivo declarado es preservar la naturaleza sin versiones, probada por características y retrocompatible de la web. Esa sola frase explica por qué Wasm no tiene números de versión que negociar: compruebas si hay una característica, no preguntas con qué versión estás hablando.

Una pala de plástico naranja tumbada sobre arena húmeda
Una pala de plástico naranja olvidada en un arenero, el lugar donde se te permite cavar sin consecuencias.

La relación con JavaScript

Wasm no sustituye a JavaScript, y la redacción oficial sobre su interacción es cuidadosa de un modo que conviene advertir. Los módulos podrán llamar hacia dentro y hacia fuera del contexto de JavaScript y acceder a la funcionalidad del navegador a través de las mismas Web APIs accesibles desde JavaScript.

Ese tiempo futuro, podrán, aparece en la descripción oficial. Es un recordatorio de que la frontera entre ambos ha sido un objetivo móvil, y de que cualquier cosa que leas sobre Wasm y el DOM debería comprobarse contra la versión que realmente estás desplegando y no contra una entrada de blog.

La forma práctica hoy: Wasm calcula, JavaScript orquesta. El trabajo numérico pesado, los códecs, la compresión, la simulación y la criptografía encajan todos en el primer papel. Llegar a la página, manejar eventos y llamar a las API del navegador encajan en el segundo.

Nunca fue solo para navegadores

El nombre confunde a la gente, y el sitio lo dice sin rodeos: WebAssembly también admite integraciones fuera de la web. La propia definición menciona aplicaciones cliente y servidor.

Por eso Wasm aparece en lugares donde no hay ningún navegador: sistemas de plugins que necesitan ejecutar código no confiable de forma segura, runtimes en el borde, scripting embebido dentro de aplicaciones mayores. En todos ellos el atractivo es el mismo par de propiedades, un sandbox con un formato binario portable, y el navegador es sencillamente el anfitrión más visible y no el único.

Cuándo es la herramienta equivocada

Si tu cuello de botella es la red, Wasm no ayuda. Un módulo todavía tiene que descargarse, y un cálculo rápido detrás de una transferencia lenta sigue siendo lento.

Si tu trabajo es sobre todo manipulación del DOM, cruzar la frontera para hacerlo cuesta más de lo que ahorra. Eso es en lo que JavaScript ya es bueno.

Si tuvieras que reescribir código que funciona, sopésalo con honestidad. Wasm brilla cuando un lenguaje compilado ya es el encaje natural, o cuando tienes una base de código C o Rust existente que traer contigo.

La versión corta

WebAssembly es un formato de instrucciones binario para una máquina virtual basada en pila, y un objetivo de compilación portable más que un lenguaje que se escribe. Sus cuatro objetivos son la eficiencia a velocidad nativa sobre hardware común, un sandbox seguro en memoria, un formato de texto legible junto al binario, y la portabilidad sin versiones y probada por características de la web.

Complementa a JavaScript en lugar de sustituirlo, y admite integraciones fuera de la web, que es la razón por la que aparece en sistemas de plugins y runtimes de servidor con la misma facilidad que en los navegadores. Lee la definición al pie de la letra y casi toda la confusión que la rodea desaparece.

Si te estás metiendo en cómo los lenguajes compilados alcanzan un objetivo siquiera, nuestra nota sobre qué es un algoritmo empieza un nivel por debajo de esto.

La definición, los cuatro objetivos de diseño y su redacción, la afirmación sobre llamar hacia dentro y hacia fuera del contexto de JavaScript, y la nota sobre las integraciones fuera de la web están tomadas del sitio oficial de WebAssembly, comprobado en el momento de escribir. La especificación evoluciona; verifica con la documentación actual antes de apoyarte en una capacidad concreta.