El mejor runtime de WebAssembly puede ser ningún runtime

Compilar módulos de WebAssembly de vuelta a C se presenta como una forma de ejecutar código nativo portátil y sandboxeado sin un runtime pesado, permitiendo cosas como sistemas de plugins más seguros y binarios multiplataforma. Los comentaristas comparan este enfoque con tecnologías anteriores como Google Native Client, discuten cómo el modelo restringido y bien especificado de WASM y su ecosistema de herramientas lo hacen atractivo como una capa intermedia universal, y señalan el uso que Firefox ya hace de esta técnica. También destacan limitaciones y compromisos: los errores internos de memoria en C siguen presentes, la comprobación de límites y el determinismo pueden añadir sobrecarga, la integración con lenguajes de nivel superior y con el DOM sigue siendo incómoda, y algunos consideran que el hype general de WASM supera su soporte real para lenguajes y plataformas.

Wasm→C como sandboxing “sin VM”

  • Idea: compilar C (u otros lenguajes) a WebAssembly, luego transpilar wasm a C y compilar nativamente, heredando las garantías de seguridad de wasm sin un runtime pesado.
  • Firefox ya hace una variante (RLBox): wasm como frontera de aislamiento y luego recompilado para velocidad.
  • w2c2 actualmente se centra en la portabilidad, no en el sandboxing; wasm2c apunta a una seguridad conforme a la especificación (comprobaciones de límites, llamadas indirectas con seguridad de tipos).

Seguridad, comprobación de límites y aislamiento del sistema operativo

  • Algunos sostienen que esto es redundante: los procesos ya obtienen aislamiento basado en MMU; los sandbox estilo seccomp y los contenedores clásicos pueden ser tan seguros o más, con superficies de syscall más estrechas.
  • Otros dicen que wasm incrustado resulta atractivo cuando no puedes levantar procesos/contendedores, y para casos de uso tipo plugins.
  • Wasm se basa en memoria lineal con límites aplicados; los motores de producción usan páginas de guardia + mprotect/manejadores de fallos para comprobaciones de coste casi cero.
  • Limitación importante: wasm no corrige errores lógicos ni corrupción de memoria dentro del módulo; los módulos no confiables quedan aislados del host, pero el C inseguro interno sigue siendo inseguro.

NaCl, PNaCl y cómo llegamos a wasm

  • Native Client resolvía problemas similares, pero era específico de CPU; el formato wire de bitcode LLVM de PNaCl y el enredo con glibc eran complicados.
  • asm.js surgió como una alternativa más simple; wasm fue una estandarización multivendor de esas lecciones.
  • Algunos ven el fracaso de NaCl sobre todo como técnico; otros enfatizan razones políticas / de ecosistema.

C vs LLVM IR vs otros IRs

  • A favor de C: C es estable, ampliamente soportado y funciona como IR portátil, incluso en sistemas operativos oscuros (p. ej., Mac OS 9, CPUs extrañas).
  • En contra de C: C no puede expresar un aliasing más rico, sum types, ni un manejo detallado de UB; LLVM IR sería más expresivo, pero es un objetivo móvil y depende de versiones.
  • Visión: wasm como una capa intermedia universal (→wasm→C/anything) en lugar de añadir comprobaciones de límites a cada compilador C.

Debates sobre diseño de bytecode y rendimiento

  • Algunos critican el diseño basado en pila de wasm por añadir complejidad frente a IRs basados en registros; otros lo defienden como suficiente y probado en batalla.
  • Hay desacuerdo sobre cuán “universal” seguirá siendo wasm a medida que crezca (GC, threads, funciones más ricas) frente a volverse más opinado como JVM/CLR.

Casos de uso, hype y escepticismo

  • Los entusiastas: wasm es una ISA portátil para plugins sandboxeados, serverless, embebido, bibliotecas entre lenguajes y preservación de software; los efectos de red superan los defectos técnicos.
  • Los escépticos: el hype exagera la novedad y la seguridad; bytecodes y VMs existentes abordaron objetivos similares durante décadas; wasm no resuelve de forma inherente los problemas de UI web (complejidad de HTML/CSS/JS).
  • Algunos ven wasm fuera del navegador (WASI, sistemas de plugins, empaquetado estilo Cosmopolitan) como más impactante que las apps web.

GC, lenguajes de alto nivel y DOM

  • Se espera que wasm GC ayude a los lenguajes gestionados, pero existen preocupaciones sobre el desajuste con runtimes como Go/Java y la falta de cosas como un cambio de pila eficiente.
  • Wasm no puede tocar directamente DOM/WebGPU; se requieren shims de JS. Algunos quieren apps web totalmente libres de JS; otros argumentan que el DOM y las Web APIs tienen inherentemente forma de JS y que la sobrecarga es insignificante en relación con los costes del DOM.