Utilia

Desensamblador de WebAssembly

Convierte un binario .wasm en texto WAT legible, valídalo y lista sus secciones, importaciones, exportaciones y funciones en tu navegador, sin ejecutarlo.

El módulo solo se lee y se convierte en texto: nunca se compila, instancia ni ejecuta.

Cómo convertir WASM a WAT

  1. Suelta un archivo .wasm en la zona de carga o haz clic en ella para elegirlo (hasta 20 MB). También puedes pulsar Cargar un módulo de ejemplo para ver una pequeña demostración.
  2. La herramienta comprueba el binario, lo valida y muestra el resultado: ✓ El módulo es válido., o el motivo por el que no lo es.
  3. Consulta los contadores: Funciones (importadas y definidas), Importaciones, Exportaciones, Tipos, Memorias, Tablas y Globales.
  4. Lee el desensamblado en Formato de texto de WebAssembly (WAT) y luego Copiar o Descargar .wat.
  5. Ajusta el resultado con las opciones Usar los nombres de la sección name, Expresiones plegadas (S-expressions) y Exportaciones en línea.
  6. Abre las tablas Secciones, Importaciones y Exportaciones para ver la estructura del archivo: cada sección con su desplazamiento en bytes, su tamaño y su número de entradas.

El módulo nunca se compila, instancia ni ejecuta. La herramienta solo lee sus bytes y los convierte en texto, así que es seguro inspeccionar un archivo del que no te fías.

Qué muestra el resultado WAT

WebAssembly tiene dos formatos equivalentes: el binario compacto .wasm que cargan navegadores y runtimes, y el formato de texto .wat, pensado para personas. El desensamblador escribe cada parte del módulo en forma de texto: tipos de funciones, importaciones, cuerpos de funciones, tablas, memorias, globales, exportaciones, la función de inicio, los segmentos de elementos y los segmentos de datos.

Por defecto, las instrucciones se listan una por línea en orden de pila, tal como están almacenadas:

(func $add (param $a i32) (param $b i32) (result i32)
  local.get $a
  local.get $b
  i32.add)

Con Expresiones plegadas (S-expressions), los operandos se anidan dentro de la instrucción que los usa, como en (i32.add (local.get $a) (local.get $b)), que suele ser más fácil de seguir. Exportaciones en línea escribe (export "add") dentro de la función en lugar de en una lista aparte.

Nombres, información de depuración y validación

Un archivo .wasm se refiere a todo por índice. Cuando el compilador conservó una sección personalizada name (habitual en las compilaciones de depuración), Usar los nombres de la sección name muestra los nombres originales, como $factorial. Si no, wabt genera nombres como $f2 o $t0 para que el texto siga siendo legible. Las compilaciones de producción suelen eliminar los nombres, así que un módulo minificado solo mostrará nombres generados.

La validación sigue la especificación de WebAssembly: los tipos deben coincidir en la pila de operandos, los índices deben existir, etc. Un módulo no válido se desensambla igualmente si su estructura se puede leer, con el error de validación al lado, lo que ayuda a depurar un compilador o un binario escrito a mano. Las funcionalidades posteriores al MVP, como SIMD, hilos, memoria masiva (bulk memory), tipos de referencia, multivalor, llamadas de cola, gestión de excepciones, memory64 y recolección de basura, están habilitadas para la lectura.

Esta herramienta usa wabt.js, la versión JavaScript del WebAssembly Binary Toolkit (wasm2wat). Solo se carga cuando abres un archivo.

Preguntas frecuentes

¿Puedo recuperar el código fuente original en C, C++ o Rust?

No. WAT es una forma legible del binario compilado, no un descompilador: el código fuente, los comentarios y la mayor parte de la información de tipos desaparecen al compilar. Los nombres de las funciones solo sobreviven si se conservó la sección name.

¿Se sube mi archivo?

No. El archivo se lee y se desensambla en tu navegador; no se envía nada a ningún servidor.

¿Por qué la herramienta dice que el archivo no es un binario WebAssembly?

Todo módulo empieza con los cuatro bytes \0asm seguidos de la versión 1. Se rechazará un archivo servido con otro contenido, comprimido con gzip o Brotli, o un componente WebAssembly (el modelo de componentes, más reciente).

¿Por qué el cuadro de texto aparece cortado?

Los módulos muy grandes pueden producir millones de líneas. El cuadro de texto muestra la primera parte para que la página siga respondiendo con fluidez; Descargar .wat guarda el texto completo.

¿Puedo ejecutar o probar el módulo aquí?

No. El módulo no se instancia nunca a propósito, así que su código no puede ejecutarse en la página. Para probarlo, cárgalo en tu propio proyecto o en un runtime como wasmtime o Node.js.