2 pontos por GN⁺ 2025-02-05 | 1 comentários | Compartilhar no WhatsApp

O que é WebAssembly?

  • WebAssembly é um conjunto de instruções padronizado e um formato de bytecode projetado para executar código cliente não confiável em navegadores web com velocidade próxima à nativa.
  • Evoluiu a partir do Emscripten, um compilador de C/C++ para JavaScript, que inicialmente convertia LLVM IR em JavaScript para permitir a execução de código C e C++ na web.
  • Com o tempo, desenvolvedores de navegadores colaboraram com o projeto Emscripten para criar um subconjunto simples de JavaScript voltado à otimização de desempenho, que foi padronizado como asm.js.
  • Depois, para evitar a sobrecarga do JavaScript, foi projetado um formato de bytecode independente, que é o Wasm.
  • Recentemente, o WebAssembly também vem ganhando popularidade fora dos navegadores, e Fastly e Shopify estão construindo produtos de Edge Compute e Functions com base em engines de WebAssembly.
  • O WebAssembly é uma plataforma atraente para construir ecossistemas de plugins por poder ser alvo de várias linguagens de origem.

Por que um interpretador WebAssembly?

  • Como muitos engenheiros de software, eu estava preso ao padrão de começar novos projetos paralelos e perder o interesse depois de algumas semanas.
  • Eu precisava de um projeto grande no qual pudesse investir esforço por um período contínuo, e que me expusesse a camadas mais baixas da pilha de computação.
  • Passei a me interessar pelo hype em torno do WebAssembly, e ele pareceu atraente como uma ferramenta de engenharia de plataforma na qual eu poderia projetar chamadas de sistema personalizadas.

Semblance

  • Decidi escrever um interpretador WebAssembly para me familiarizar com a WebAssembly Core Specification.
  • Como o objetivo do projeto era aprendizado, eu não planejava implementar todos os opcodes nem passar em toda a suíte principal de testes.
  • Eu já ficaria satisfeito se conseguisse executar um "Hello, World!".

Resultado

  • O projeto é considerado um grande sucesso. A cobertura de opcodes não é completa, mas ele consegue executar um programa simples de "Hello, World!".
  • O código é bagunçado, lento, tem vazamentos de memória e pode ser vulnerável a módulos maliciosos, mas funciona.
  • Aprendi muito sobre a especificação principal do WebAssembly e consegui sair da minha zona de conforto como engenheiro.
  • Agora sinto que adquiri conhecimento suficiente sobre WebAssembly para contribuir com runtimes de nível industrial, como o Wasmtime.

1 comentários

 
GN⁺ 2025-02-05
Comentários do Hacker News
  • Já tive a experiência de escrever um interpretador de Wasm em Scheme, então fico feliz em ver outras pessoas escrevendo um por conta própria. Wasm é menos difícil do que parece, e eu recomendaria tentar implementar só o suficiente para se divertir, sem precisar cobrir todas as instruções

    • Uma dica para o autor: o spec-test inclui formas complexas de wasm em texto, mas usando o conversor wast2json é possível obter uma descrição JSON mais simples e arquivos wasm binários comuns
  • Pergunta de iniciante:

    • Tenho curiosidade sobre como fazer depuração quando você não está codificando o interpretador diretamente
    • Tenho curiosidade sobre o quão eficaz é fazer fuzzing de opcodes em formato de string
    • Tenho curiosidade sobre quanta diferença prática existe entre motores WASM do lado do servidor e motores baseados em navegador, e quanto trabalho seria necessário para converter um no outro
  • Encontrei um artigo interessante sobre interpretar WASM manualmente

  • Abordagem interessante, e um excelente trabalho

  • Acho que teria sido uma boa ideia adotar a Wasm-C-API como interface padrão

    • É uma API adotada pela maioria dos runtimes de Wasm (Wasmmer, V8, wasmi etc.), escrita em C, então desenvolvedores familiarizados com essa API podem experimentar com facilidade
    • Se o autor estiver familiarizado com Wasm, contribuições com patches ou melhorias para o Wasmer também seriam bem-vindas
  • Ponto controverso:

    • Tenho curiosidade se há interesse em adicionar instruções iniciais de tail call
    • Os responsáveis pela especificação do WASM rejeitaram isso por considerá-lo "alto nível", mas o comitê de C também rejeitou a proposta de Dennis Ritchie. Rob Pike também parece apoiar a direção de Ritchie. Se não fosse assim, por que ele teria criado Go? Tail call só é alto nível quando a chamada é de alto nível
  • Recomendo dar uma olhada no Orca. Pode ser uma boa oportunidade para contribuir: https://orca-app.dev

  • É realmente incrível ver alguém mergulhando fundo em WebAssembly e construindo um interpretador do zero

  • Excelente texto, e me deu motivação para voltar à implementação de WASM

  • Trabalho realmente muito legal