system onlinepath: /guias/programacion/desarrollo-con-webassembly/mode: knowledge_baselocal:
Programación · Nivel intermedio

Desarrollo de aplicaciones con WebAssembly

No es un lenguaje ni un reemplazo de JavaScript: es un destino de compilación. Qué resuelve de verdad, en qué estado está como estándar, y la pregunta que decide si te sirve o no.

13 min de lectura▣ Actualizada el ◇ Por Underc0de
Respuesta rápida

WebAssembly —abreviado Wasm— es, según su definición oficial, «un formato binario de instrucciones para una máquina virtual basada en pila», diseñado «como destino de compilación portable para lenguajes de programación». Es decir: no se escribe a mano, se compila hacia él. Sus cuatro objetivos declarados son ser eficiente y rápido, seguro —con un entorno «aislado y seguro con la memoria»—, abierto y depurable, y parte de la plataforma web abierta, lo que incluye interactuar con JavaScript. La versión 1 es Recomendación del W3C desde el 5 de diciembre de 2019; la 2 sigue en proceso. Conviene para cálculo intensivo, y no para manipular la interfaz.

Ver índice de contenidos
  1. 01Qué es, con precisión
  2. 02Los cuatro objetivos de diseño
  3. 03En qué estado está como estándar
  4. 04Cuándo conviene frente a JavaScript
  5. 05El costo del cruce
  6. 06Qué lenguajes compilan a Wasm
  7. 07Cómo se usa desde una página
  8. 08Fuera del navegador: WASI
  9. 09Seguridad: qué garantiza y qué no
  10. 10Errores frecuentes
  11. 11Preguntas frecuentes
  12. 12Fuentes

Qué es, con precisión

La definición oficial cabe en una línea, y conviene empezar por ella porque desarma la mayoría de los malentendidos: «WebAssembly (abreviado Wasm) es un formato binario de instrucciones para una máquina virtual basada en pila».

Y la segunda frase es la que aclara para qué existe: está diseñado «como destino de compilación portable para lenguajes de programación».

Lo que se sigue de esas dos frases

No es un lenguaje que se escriba a mano —aunque exista un formato textual para leerlo—, no compite con JavaScript y no es un marco de trabajo. Es un formato al que otros lenguajes apuntan al compilar, para poder ejecutarse en el navegador y en otros entornos. La pregunta «¿aprendo WebAssembly?» está mal planteada: lo que se aprende es a compilar hacia Wasm desde un lenguaje que ya sabés.

Los cuatro objetivos de diseño

Diagrama de WebAssembly. Arriba, los cuatro objetivos de diseño: eficiente y rápido, con formato binario compacto que busca velocidad nativa; seguro, con un entorno aislado y seguro con la memoria; abierto y depurable, con un formato textual legible; y parte de la plataforma web abierta, con interacción con JavaScript y las APIs web. Después, el estado como estándar: la versión 1 es Recomendación del W3C de diciembre de 2019 y la versión 2 es Borrador de Recomendación Candidata. Luego, cuándo conviene frente a JavaScript y cuándo no. Al final, WASI como interfaz de sistema para usar Wasm fuera del navegador.
La pregunta correcta no es si reemplaza a JavaScript, sino si tenés una parte del trabajo que sea cálculo puro.

El sitio oficial declara cuatro, y cada uno explica una decisión concreta del diseño:

  • Eficiente y rápido. «La máquina de pila de Wasm está diseñada para codificarse en un formato binario eficiente en tamaño y en tiempo de carga», y apunta a ejecutar a velocidad nativa aprovechando capacidades de hardware comunes. Las dos partes importan: no solo ejecuta rápido, también carga rápido, que en la web pesa igual.
  • Seguro. Provee «un entorno de ejecución aislado y seguro con la memoria», y cuando está embebido en la web respeta las políticas de seguridad del navegador. Un módulo no puede salirse de su caja de arena por su cuenta.
  • Abierto y depurable. Está diseñado para poder representarse «en un formato textual para depurar, probar, experimentar, optimizar, aprender, enseñar y escribir programas a mano». No es una caja negra binaria.
  • Parte de la plataforma web abierta. Mantiene «la naturaleza sin versiones y compatible hacia atrás de la web», y permite que los módulos interactúen con JavaScript y con las APIs web.

Ese último objetivo es la respuesta oficial a la pregunta del reemplazo: la interoperabilidad con JavaScript no es un parche, es un objetivo de diseño.

En qué estado está como estándar

Este punto conviene verificarlo antes de tomar decisiones técnicas, porque circulan afirmaciones imprecisas en las dos direcciones:

Estado de las especificaciones de WebAssembly en el W3C
EspecificaciónEstado en el W3CQué significa en la práctica
Núcleo, versión 1Recomendación, 5 de diciembre de 2019Estándar cerrado, el máximo grado del proceso. Soporte universal en navegadores actuales
Núcleo, versión 2Borrador de Recomendación CandidataEtapa anterior del proceso; conviene verificar el soporte de cada función antes de depender de ella
WASIEspecificaciones «en vía de estandarización»En desarrollo activo; se usa en producción pero con más movimiento

La conclusión operativa: lo básico se puede usar con total confianza —tiene seis años de estándar cerrado y soporte en todos los navegadores—, y para las funciones más nuevas conviene comprobar el soporte real en lugar de asumirlo. El propio proyecto publica un informe de implementación de funciones para eso.

Cuándo conviene frente a JavaScript

Acá está la decisión que importa, y tiene una regla clara: Wasm rinde cuando el trabajo es cálculo puro y suficientemente grande.

Casos donde WebAssembly conviene y casos donde no
Caso¿Conviene?Por qué
Procesamiento de imágenes, audio o videoCálculo intensivo sobre datos en memoria: el caso ideal
Criptografía y compresiónMismo perfil: mucho cómputo, poca interacción
Simulaciones y cálculo científicoEl trabajo es numérico y largo
Motores de juego y renderizadoRendimiento predecible y control de memoria
Reutilizar una biblioteca ya escrita en otro lenguajeSí, y es el caso más subestimadoEvita reescribir y volver a validar código que ya funcionaba
Manipular la interfaz y el DOMNoCada operación cruza a JavaScript, y el cruce cuesta
Lógica de aplicación comúnNoJavaScript es suficientemente rápido y mucho más simple de mantener
Reemplazar JavaScript enteroNoNo es para lo que está diseñado

La quinta fila merece atención porque es la que más se pasa por alto: cuando ya existe una biblioteca probada en C, C++ o Rust, compilarla a Wasm suele ser mucho más barato y más seguro que reescribirla en JavaScript, porque una reescritura implica volver a validar lógica que ya estaba correcta.

El costo del cruce

Este es el concepto que separa una integración que mejora el rendimiento de una que lo empeora, y casi nunca aparece en los tutoriales introductorios.

Llamar de JavaScript a Wasm y volver tiene un costo, y también lo tiene mover datos entre los dos mundos. Un módulo de Wasm trabaja sobre su propia memoria lineal, así que pasarle un objeto de JavaScript implica traducirlo.

!
La consecuencia práctica, en una regla

Pocas llamadas con mucho trabajo cada una, en lugar de muchas llamadas con poco trabajo. Enviar a Wasm una imagen completa para procesarla y recibir el resultado es el patrón correcto; llamar a una función de Wasm dentro de un bucle que se ejecuta miles de veces es el patrón que hace que la versión con Wasm salga más lenta que la de JavaScript. Si el trabajo es chico, la travesía se come la ganancia.

Y de ahí sale también la razón técnica por la que no conviene mover una interfaz a Wasm: manipular el DOM son muchísimas operaciones chicas, cada una de las cuales tendría que cruzar el límite. Un módulo de Wasm no accede al DOM directamente: pasa por JavaScript.

Qué lenguajes compilan a Wasm

Al ser un destino de compilación portable, la lista es amplia y se mueve, así que conviene verificarla en cada caso en lugar de confiar en una enumeración que envejece. Lo que sí se puede afirmar es un criterio estructural que no cambia:

  • Los lenguajes de sistemas sin recolector de basura —como Rust, C y C++— tienen el mejor soporte y las herramientas más maduras, porque su modelo de memoria encaja naturalmente con el de Wasm.
  • Los lenguajes con recolector de basura también pueden apuntar a Wasm, con una salvedad concreta: el módulo resultante suele ser más grande, porque tiene que incluir su propio entorno de ejecución. En la web, donde el tamaño de descarga importa, eso pesa en la decisión.

Ese criterio explica por qué Rust aparece tan asociado a WebAssembly: no es moda, es que un lenguaje que ya administra la memoria sin recolector produce módulos chicos y predecibles.

Cómo se usa desde una página

Del lado del navegador, el patrón es siempre el mismo: se carga el módulo, se instancia y se llaman sus funciones exportadas.

javascript
// Cargar e instanciar el módulo mientras se descarga
const { instance } = await WebAssembly.instantiateStreaming(
  fetch('procesador.wasm')
);

// Llamar a una función exportada por el módulo
const resultado = instance.exports.procesar(ancho, alto);

// Para datos grandes se comparte la memoria lineal del módulo,
// en lugar de pasar los valores uno por uno
const memoria = new Uint8Array(instance.exports.memory.buffer);
memoria.set(pixeles, offset);   // escribir la entrada
instance.exports.procesar(offset, pixeles.length);

En la práctica, casi nadie escribe este código a mano: las cadenas de herramientas de cada lenguaje generan una capa de unión que se encarga de la traducción de tipos y de la gestión de memoria. Pero vale entender el mecanismo, porque explica de dónde viene el costo del cruce y por qué los datos grandes se comparten por memoria en lugar de pasarse como argumentos.

Fuera del navegador: WASI

Wasm empezó en el navegador y hoy se usa bastante fuera de él, y para eso hizo falta resolver un problema concreto: dentro del navegador, un módulo tiene las APIs web disponibles; fuera, no tenía forma estándar de leer un archivo o abrir una conexión.

Ahí entra WASI, la Interfaz de Sistema de WebAssembly. Su documentación la define como «un grupo de especificaciones de API en vía de estandarización para software compilado al estándar WebAssembly del W3C», diseñada «para proveer una interfaz estándar segura a aplicaciones que puedan compilarse a Wasm desde cualquier lenguaje, y que puedan correr en cualquier parte, desde navegadores hasta nubes y dispositivos embebidos».

Y su documentación señala el beneficio que persigue: «al estandarizar APIs para WebAssembly, WASI provee una manera de componer software escrito en distintos lenguajes» sin recurrir a sistemas de interfaz costosos y engorrosos como los microservicios basados en HTTP.

Eso explica el interés en Wasm del lado del servidor y en el borde: un módulo chico, aislado por diseño, que arranca rápido y corre en cualquier plataforma es un formato atractivo para funciones y complementos. Conviene tener presente que WASI está en desarrollo activo, así que ahí el terreno se mueve más que en el navegador.

Seguridad: qué garantiza y qué no

El aislamiento es un objetivo de diseño declarado, y eso da garantías reales: un módulo corre en un entorno «aislado y seguro con la memoria», no puede acceder a lo que no se le entregó explícitamente, y en la web respeta las políticas de seguridad del navegador.

Lo que no garantiza, y conviene tener claro:

  • Que el código dentro del módulo sea correcto. Un error de lógica sigue siendo un error de lógica, y una vulnerabilidad de la biblioteca que compilaste viaja con ella.
  • Que sea seguro darle datos sensibles. Un módulo hace lo que su código dice; el aislamiento limita qué puede alcanzar, no qué hace con lo que le diste.
  • Que el binario sea auditable a simple vista. Es un formato binario. Existe la representación textual, pero revisar un módulo de terceros es tan trabajoso como revisar cualquier dependencia compilada, y valen las mismas precauciones de cadena de suministro que están en riesgos y uso responsable.

Errores frecuentes

  • Tratarlo como reemplazo de JavaScript. Está diseñado para convivir con él: la interoperabilidad es un objetivo declarado.
  • Llamar a Wasm dentro de un bucle apretado. El costo del cruce puede hacer que la versión con Wasm salga más lenta.
  • Mover la interfaz a Wasm. Cada operación sobre el DOM tiene que pasar por JavaScript.
  • Adoptarlo sin medir primero. Si no sabés dónde se va el tiempo, no sabés si Wasm va a mejorar algo.
  • Ignorar el tamaño del módulo. En la web, un binario grande puede costar más en descarga de lo que ahorra en ejecución.
  • Suponer que todas las funciones tienen soporte. La versión 1 sí; para lo posterior conviene verificar.
  • Confiar en un módulo de terceros porque «está aislado». El aislamiento limita el alcance, no la intención del código.

Preguntas frecuentes

¿Qué es WebAssembly exactamente?

Su sitio oficial lo define en una línea: WebAssembly, abreviado Wasm, es un formato binario de instrucciones para una máquina virtual basada en pila. Está diseñado como destino de compilación portable para lenguajes de programación, y esa es la parte que más aclara qué es: no se escribe Wasm a mano, se compila código de otro lenguaje hacia Wasm. Por eso no es un lenguaje que compita con JavaScript sino un formato al que otros lenguajes pueden apuntar para correr en el navegador y en otros entornos.

¿WebAssembly reemplaza a JavaScript?

No, y el propio diseño lo desmiente: uno de sus cuatro objetivos declarados es ser parte de la plataforma web abierta, y eso incluye explícitamente que los módulos puedan interactuar con JavaScript y con las APIs web. La forma habitual de usarlo es complementaria: JavaScript maneja la interfaz, la lógica de aplicación y la coordinación, y Wasm se encarga de la parte que es cálculo intensivo. Además, cruzar el límite entre los dos tiene un costo, así que enviar trabajo chico a Wasm puede salir más lento.

¿Es un estándar terminado?

La versión 1 sí: la Especificación Central de WebAssembly es Recomendación del W3C desde el 5 de diciembre de 2019, que es el máximo grado de madurez del proceso, y tiene soporte en todos los navegadores actuales. La versión 2 está publicada como Borrador de Recomendación Candidata, es decir en una etapa anterior del proceso. La consecuencia práctica es que lo básico se puede usar con total confianza, y para las funciones más nuevas conviene verificar el soporte antes de depender de ellas.

¿Puede acceder al DOM directamente?

No de forma directa: para tocar el DOM, un módulo de Wasm pasa por JavaScript. Esa es la razón técnica por la que no conviene reescribir una interfaz en Wasm, porque cada operación sobre la página cruzaría el límite entre los dos mundos y ese cruce tiene costo. La consecuencia de diseño es clara: Wasm rinde cuando recibe datos, hace un trabajo grande de cálculo y devuelve un resultado, no cuando tiene que interactuar constantemente con la página.

¿Qué lenguajes se pueden compilar a WebAssembly?

Al ser un destino de compilación portable, la lista es amplia y cambia con el tiempo, así que conviene verificarla en cada caso. Los que tienen mejor soporte y más herramientas son los lenguajes de sistemas sin recolector de basura, como Rust y C o C++, porque su modelo de memoria encaja naturalmente con el de Wasm. Los lenguajes con recolector de basura también pueden apuntar ahí, con la salvedad de que el módulo resultante suele ser más grande, porque tiene que incluir su propio entorno de ejecución.

¿Qué es WASI y para qué sirve?

Es la Interfaz de Sistema de WebAssembly, y su documentación la define como un grupo de especificaciones de API en vía de estandarización para software compilado al estándar WebAssembly del W3C. El problema que resuelve es concreto: dentro del navegador, Wasm tiene las APIs web; fuera de él no tenía forma estándar de leer un archivo o abrir una conexión. WASI provee una interfaz estándar y segura para aplicaciones que puedan correr en cualquier parte, desde navegadores hasta la nube y dispositivos embebidos.

Fuentes

Especificaciones, documentación oficial y material de la comunidad consultados para esta guía. Fecha de consulta: 27 de julio de 2026.

Aportes de la comunidad Underc0de

  1. Underc0de, foro. Sección Programación Web. Hilos de la comunidad sobre desarrollo web y rendimiento.
  2. Underc0de, foro. Sección Programación General. Material sobre lenguajes compilados, que son los que mejor apuntan a este destino.

Especificaciones y documentación oficial

  1. WebAssembly. Sitio oficial. Definición de WebAssembly y los cuatro objetivos de diseño, citados textualmente.
  2. W3C. WebAssembly Core Specification, versión 1. Recomendación del W3C del 5 de diciembre de 2019.
  3. W3C. WebAssembly Core Specification, versión 2. Publicada como Borrador de Recomendación Candidata.
  4. WebAssembly. Feature extensions. Informe de implementación por función, para verificar soporte antes de depender de una capacidad nueva.
  5. WASI. WebAssembly System Interface. Definición de WASI, su estado de estandarización y su objetivo de componer software escrito en distintos lenguajes, citados textualmente.