Skip to content

WebAssembly: el estándar olvidado del W3C

Published:

Si pregunto qué estándares web conocéis, probablemente diréis HTML, CSS, JavaScript, HTTP… pero ¿y WebAssembly? A pesar de ser un estándar oficial del W3C desde diciembre de 2019, sigue siendo el gran desconocido para muchos desarrolladores y desarrolladoas frontend.

WebAssembly (WASM) es un formato de instrucciones binario, portable, compacto y seguro, diseñado para ejecutarse en navegadores modernos con rendimiento cercano al nativo. Y está en todos lados.

¿Qué es WebAssembly realmente?

WebAssembly es un objetivo de compilación, no un lenguaje de programación. Escribes código en C, C++, Rust, Go (con TinyGo), C# (con Blazor) o incluso AssemblyScript (un subset de TypeScript), y lo compilas a un binario .wasm que el navegador puede ejecutar.

Características clave

Binario y compacto

A diferencia de JavaScript, que se envía como texto, WASM es un formato binario. Esto significa archivos más pequeños y parsing más rápido. Un módulo WASM se descarga, valida e instancia en milisegundos.

Portable

El mismo archivo .wasm funciona en Chrome, Firefox, Safari, Edge, Node.js, Deno, Bun, Cloudflare Workers… cualquier runtime con soporte para WASM. Escribe una vez, ejecuta en todas partes (esta vez de verdad).

Seguro

WASM se ejecuta en un entorno sandboxed. No puede acceder al sistema de archivos, la red o la memoria fuera de su linear memory asignada sin pasar explícitamente por JavaScript. Es tan seguro como JavaScript.

Rápido

WASM se compila a código máquina nativo mediante compilación JIT (o AOT en algunos runtimes). No hay interpretación, no hay warm-up. El código empieza a ejecutarse a máxima velocidad desde el primer frame.

De asm.js a estándar W3C

WebAssembly no surgió de la nada. Su precursor fue asm.js, un subset estricto de JavaScript desarrollado por Mozilla en 2013. La idea era simple: escribir JavaScript de una forma tan predecible que los motores pudieran optimizarlo de forma muy efectiva.

// asm.js - JavaScript optimizable
function add(x, y) {
  x = x | 0; // cast to int32
  y = y | 0;
  return (x + y) | 0;
}

asm.js funcionaba, pero tenía límites: seguía siendo texto, seguía necesitando parsing, y los tipos se inferían mediante operaciones bitwise. Era un hack brillante, pero un hack al fin y al cabo.

En 2015, Mozilla, Google, Microsoft y Apple se unieron para crear algo mejor: WebAssembly. En marzo de 2017 se lanzó el MVP (Minimum Viable Product) en los cuatro navegadores principales. En diciembre de 2019, el W3C lo declaró estándar oficial.

Hoy, WebAssembly tiene soporte universal:

Misconceptions comunes

”WebAssembly va a reemplazar JavaScript”

No. WASM no tiene acceso directo al DOM, no puede manejar eventos, no puede hacer fetch. Para eso, necesita llamar a JavaScript. WASM y JS están diseñados para trabajar juntos.

JavaScript sigue siendo el lenguaje de scripting de la web. WASM es una herramienta para casos específicos donde necesitamos un alto nivel de optimización.

”WebAssembly es solo para juegos y demos”

Falso. Figma usa WASM para renderizar su editor gráfico y redujo el tiempo de carga 3x. Photoshop Web usa WASM para edición de imágenes. Google Earth usa WASM para renderizar el globo 3D. Shopify usa WASM para evaluar temas de forma segura.

Casos de uso reales:

”WebAssembly es difícil de usar”

Depende. Si tenemos un background de C o Rust, el tooling es excelente. wasm-pack (para Rust) genera bindings automáticamente. Emscripten (para C/C++) hace lo mismo.

Si solo hemos desarrollado en JavaScript, AssemblyScript permite escribir algo parecido a TypeScript y compilarlo a WASM. No tendréis el mismo rendimiento que Rust, pero es accesible.

El ecosistema actual

Lenguajes con soporte WASM

Tooling

Casos de uso en producción

Figma

Migró su motor de renderizado de C++ (vía asm.js) a C++ (vía WASM). Resultado: tiempo de carga 3x más rápido, mejor performance en dispositivos de gama baja.

Shopify

Usa WASM para ejecutar código de temas de terceros de forma segura. El código se ejecuta en un sandbox WASM sin acceso a recursos sensibles.

Google Earth

Renderiza el globo 3D usando WASM. El mismo código que corría en Google Earth nativo (C++) ahora corre en el navegador.

Photoshop Web

Adobe portó Photoshop a la web usando WASM. Más de 20 años de código C++ corriendo en el navegador con buen rendimiento.

WebAssembly más allá del navegador

Gracias a WASI (WebAssembly System Interface), WASM ya no es solo para navegadores. Puedes ejecutar módulos WASM en:

Solomon Hykes (co-fundador de Docker) dijo en 2019: “Si WASM+WASI hubiera existido en 2008, no habríamos necesitado crear Docker”.

¿Por qué debería importarnos?

WebAssembly no va a dominar la web mañana y JavaScript sigue siendo el rey indiscutible, pero WASM permite:

Si trabajáis con procesamiento de imagen, video, audio, parsers, cryptography o cualquier tarea CPU-intensive, WebAssembly puede ser la diferencia entre una experiencia lenta y una fluida.

Conclusión

WebAssembly es un estándar maduro, con soporte universal, tooling sólido y casos de uso reales en producción. No es una bala de plata ni va a reemplazar JavaScript, pero es una herramienta útil que deberíamos conocer.

En el próximo artículo de esta serie veremos cuándo usar WebAssembly (y cuándo no). Porque sí, hay muchos casos donde WASM no tiene sentido, y el overhead de comunicación con JavaScript puede destruir cualquier ganancia de performance.

Serie WebAssembly

  • Parte 1: WebAssembly: el estándar olvidado del W3C (estás aquí)
  • Parte 2: WebAssembly: cuándo usarlo (y cuándo no) (próximamente)
  • Parte 3: Caso práctico: optimización de imágenes con Rust y WASM (próximamente)
  • Parte 4: WebAssembly y Web Performance: benchmarks reales (próximamente)

Recursos


Previous Post
WebPerf Snippets + WebMCP: métricas web que entiende la IA
Next Post
SVGs en la web: comparativa de rendimiento según cómo los cargas