A melhor runtime WebAssembly talvez seja nenhuma runtime

Compilar módulos WebAssembly de volta para C é apresentado como uma forma de executar código nativo portátil e isolado sem uma runtime pesada, habilitando coisas como sistemas de plugins mais seguros e binários multiplataforma. Comentadores comparam essa abordagem a tecnologias anteriores como o Google Native Client, discutem como o modelo restrito e bem especificado do WASM e seu ecossistema de ferramentas o tornam atraente como uma camada intermediária universal, e observam o uso já existente dessa técnica no Firefox. Eles também destacam limitações e trade-offs: bugs de memória internos em C continuam existindo, verificações de limites e determinismo podem adicionar overhead, a integração com linguagens de mais alto nível e com o DOM ainda é complicada, e alguns veem o hype mais amplo em torno do WASM como superando seu suporte real a linguagens e plataformas.

Wasm→C como sandboxing “sem VM”

  • Ideia: compilar C (ou outras linguagens) para WebAssembly, depois transpilá-lo para C e compilar nativamente, herdando as garantias de segurança do wasm sem uma runtime pesada.
  • O Firefox já faz uma variante disso (RLBox): wasm como fronteira de isolamento e, depois, recompilado para obter desempenho.
  • O w2c2 hoje foca em portabilidade, não em sandboxing; o wasm2c busca segurança conforme a especificação (verificações de limites, chamadas indiretas tipadas com segurança).

Segurança, verificação de limites e isolamento do SO

  • Alguns argumentam que isso é redundante: processos já recebem isolamento baseado em MMU; sandboxes clássicas no estilo seccomp e containers podem ser tão seguros ou mais, com superfícies de syscall mais restritas.
  • Outros dizem que o wasm embutido é atraente onde não dá para criar processos/containers, e para casos de uso como plugins.
  • O wasm depende de memória linear com limites impostos; motores de produção usam páginas de guarda + mprotect/tratadores de falha para verificações de custo quase zero.
  • Limitação importante: o wasm não corrige bugs de lógica nem corrupção de memória dentro do módulo; módulos não confiáveis ficam isolados do host, mas C inseguro interno continua inseguro.

NaCl, PNaCl e como chegamos ao wasm

  • O Native Client resolveu problemas semelhantes, mas era específico de CPU; o formato de bits de LLVM do PNaCl e o entrelaçamento com glibc eram complicados.
  • O asm.js surgiu como uma alternativa mais simples; o wasm foi uma padronização multi-fornecedor dessas lições.
  • Alguns veem o fracasso do NaCl principalmente como técnico; outros enfatizam razões políticas / de ecossistema.

C vs LLVM IR vs outros IRs

  • Pró-C: C é estável, amplamente suportado e funciona como uma IR portátil, inclusive em sistemas operacionais obscuros (por exemplo, Mac OS 9, CPUs estranhas).
  • Anti-C: C não consegue expressar aliasing mais rico, tipos soma ou um tratamento detalhado de UB; LLVM IR seria mais expressivo, mas é um alvo em movimento e preso a versões.
  • Visão: wasm como uma camada intermediária universal (<any language>→wasm→C/anything) em vez de acoplar verificações de limites em cada compilador C.

Debates sobre design de bytecode e desempenho

  • Alguns criticam o design baseado em pilha do wasm por adicionar complexidade em relação a IRs baseados em registradores; outros o defendem como suficiente e testado em batalha.
  • Há discordância sobre quão “universal” o wasm continuará sendo à medida que cresce (GC, threads, recursos mais ricos) versus tornar-se opinativo como JVM/CLR.

Casos de uso, hype e ceticismo

  • Entusiastas: wasm é uma ISA portátil para plugins isolados, serverless, embarcados, bibliotecas multi-linguagem e preservação de software; efeitos de rede superam falhas técnicas.
  • Céticos: o hype exagera novidade e segurança; bytecodes e VMs existentes já atendiam a objetivos semelhantes há décadas; o wasm não resolve inerentemente as dores da UI web (complexidade de HTML/CSS/JS).
  • Alguns veem o wasm fora do navegador (WASI, sistemas de plugins, empacotamento estilo Cosmopolitan) como mais impactante do que apps no navegador.

GC, linguagens de alto nível e DOM

  • Espera-se que o GC do wasm ajude linguagens gerenciadas, mas há preocupações sobre incompatibilidade com runtimes como Go/Java e a falta de coisas como troca eficiente de stack.
  • O wasm não consegue tocar diretamente no DOM/WebGPU; shims em JS são necessários. Alguns querem apps web totalmente sem JS; outros argumentam que DOM/Web APIs são inerentemente moldadas por JS e que a sobrecarga é negligenciável em relação aos custos do DOM.