WebAssembly ha pasado de ser “JavaScript pero más rápido en el navegador” a una plataforma seria para ejecutar código portátil fuera del browser. La pieza clave de esa transición es WASI (WebAssembly System Interface), el estándar que define cómo módulos WASM acceden a recursos del sistema (filesystem, red, hora). En 2023 se aproxima la finalización de WASI Preview 2, una reescritura sustancial respecto a Preview 1. Cubrimos qué cambia, por qué y qué impacto tendrá.
El problema con Preview 1
WASI Preview 1 (publicado en 2019) hizo posible WebAssembly fuera del navegador. Pero a medida que el ecosistema maduró, sus limitaciones se hicieron evidentes:
- Modelo POSIX-like. Diseñado pensando en filesystem y syscalls al estilo Unix. No encaja bien con casos modernos como cloud functions, edge computing o IoT.
- No componibilidad. Dos módulos WASM no podían fácilmente “componerse” entre sí — comunicarse en tipos ricos, no solo bytes.
- Sin tipos ricos a nivel de interfaz. Solo enteros, floats, punteros y memoria. Strings, structs, listas requerían serialización manual.
- Capabilities limitadas. Concedías acceso al filesystem entero, no a recursos granulares.
Preview 2 reescribe la base para resolver estos problemas, manteniendo retrocompatibilidad con Preview 1 durante la transición.
El Component Model y WIT
La novedad central es el Component Model: módulos WASM como componentes con interfaces tipadas explícitamente, capaces de componerse entre sí en runtime.
Las interfaces se describen en un lenguaje llamado WIT (WebAssembly Interface Type):
package jacar:examples;
interface logger {
log: func(message: string);
levels: enum { debug, info, warning, error }
}
world my-app {
import logger;
export run: func();
}
Esto declara un componente que importa una interfaz logger y exporta una función run. WIT soporta tipos como string, record (struct), variant (sum type), list, option, result. Mucho más expresivo que enteros y memoria cruda.
La consecuencia: dos componentes WASM compilados desde lenguajes distintos (Rust + Go + JavaScript) pueden hablar entre sí pasando structs ricos sin serialización manual. Es la base para un ecosistema de componentes reusables.
Capabilities granulares
Preview 2 introduce un modelo de capabilities mucho más fino. En vez de “el módulo puede acceder al filesystem”, concedes acceso a:
- Un directorio específico, para lectura solo.
- Un socket TCP a un host concreto, no toda la red.
- Una variable de entorno concreta, no
getenv()libre. - Un timer del sistema, sin acceso a clocks de wall time.
Esto encaja mucho mejor con casos como edge functions o plugins en aplicaciones host, donde quieres ejecutar código no-confiable con permisos mínimos.
Estado en 2023
A finales de 2023, WASI Preview 2 está en fase de release candidate. La especificación oficial 0.2 se espera estabilizada para principios de 2024.
Implementaciones de runtime que ya soportan o están añadiendo soporte:
- Wasmtime (Bytecode Alliance) — implementación de referencia, tracking del estándar.
- wasmer — soporte progresivo.
- WasmEdge — foco en edge y cloud-native.
- Spin (Fermyon) — framework para apps WASM con soporte temprano de Component Model.
Toolchains de lenguaje añadiendo soporte:
- Rust vía
cargo-component. - JavaScript vía
jco. - Python vía
componentize-py. - Go vía
tinygo(parcial) y projects experimentales.
Casos de uso que se desbloquean
Preview 2 + Component Model habilitan casos donde WASM tradicional rechinaba:
- Plugins seguros en aplicaciones host. Editores, servidores HTTP (módulos de Apache/Nginx en WASM), bases de datos extensibles. Capabilities granulares evitan el riesgo de plugins maliciosos.
- Serverless / edge functions de verdadera multilingüe. Una function en Python puede llamar a otra en Rust sin serializar a JSON.
- Microservicios en WASM. Componentes pequeños componibles que se ejecutan en runtimes ligeros (más rápidos de arranque que contenedores).
- Smart contracts portables. Algunos blockchains (Substrate, NEAR) ya usan WASM; el component model facilita la composición.
- Embedded ML. Modelos pequeños empaquetados como componente WASM, ejecutables en cualquier runtime que soporte el estándar.
Limitaciones que quedan
Aún en 2023:
- Threading y concurrencia son áreas con propuestas pero aún no estandarizadas.
- Garbage collection (importante para lenguajes como Java, C#, Python) en propuesta separada (WASM-GC), aún no integrada.
- Performance en algunos lenguajes JIT-compiled puede no igualar runtime nativo.
- Tooling de debug sigue maduración — debuggers, profilers no son tan ricos como para código nativo.
- Adopción de runtime en casos masivos (hyperscale serverless) aún incipiente.
Por qué te interesa aunque no escribas WASM
Como ingeniero que no toca WebAssembly directamente, el ecosistema WASM/WASI es relevante porque:
- Edge functions de Cloudflare, Fastly y otros corren WASM internamente.
- Plugins de varias herramientas (Envoy proxy, OPA, Istio) son WASM.
- Bases de datos como SQLite y futuras versiones de Postgres exploran extensiones en WASM.
- Smart contracts y blockchain con soporte WASM crecen.
Conocer la dirección del estándar (Preview 2, Component Model) ayuda a entender por qué ciertos productos toman decisiones de arquitectura y a anticipar capacidades que llegarán.
Conclusión
WASI Preview 2 es el paso de WebAssembly hacia “plataforma seria” fuera del navegador. El Component Model con interfaces tipadas y capabilities granulares resuelve limitaciones reales que han frenado adopción. La estandarización completa llegará en 2024, pero el momento de empezar a explorar es ahora — sobre todo si construyes herramientas que se beneficiarían de plugins, edge computing o ejecución segura de código no-confiable.
Síguenos en jacar.es para más sobre WebAssembly, edge computing y evolución de plataformas.