Wasmtime 47 Amplia a WebAssembly com Suporte a GC e Exceções
De acordo com bytecodealliance.org, a versão 47 do Wasmtime, runtime para WebAssembly, agora vem com suporte a Garbage Collection (GC) e exceções ativados por padrão. Essa atualização é um marco na evolução da WebAssembly, permitindo que mais linguagens se beneficiem dessa tecnologia.
O Que é Wasmtime?
Wasmtime é um runtime para WebAssembly conhecido por sua velocidade, segurança e portabilidade. Desenvolvido para ser autônomo, leve e fácil de integrar, o Wasmtime é mantido por uma equipe comprometida com os padrões abertos, participando ativamente na padronização do Wasm.
Wasm GCProposição: Apoio a Linguagens de Alto Nível
Inicialmente, as versões mais antigas da WebAssembly não ofereciam suporte eficiente a linguagens de alto nível com modelo de dados objetos e referências. Isso levou ao acúmulo de coletores de lixo dentro dos binários .wasm, resultando em arquivos maiores e menos eficientes. A proposta Wasm GC resolve esses problemas, permitindo que os programas Wasm definam seus próprios tipos de struct e array, bem como relações de subtipo. Com isso, os programas não precisam lidar com a gestão de vidas das instâncias desses tipos ou desalocá-las manualmente; a responsabilidade fica com o runtime.
Isso abre caminho para que mais linguagens possam usar a WebAssembly de forma mais eficiente e simples. Um exemplo disso é a definição de um tipo de nó para uma árvore binária no Wasm:
(rec
(type $node (struct
(field $key (mut f64))
(field $left (mut (ref null $node)))
(field $right (mut (ref null $node)))
(field $value (mut (ref null $payload)))
))
)
A criação de novas instâncias pode ser feita com struct.new $node e o acesso aos campos via struct.get $node $key e struct.set $node $left.
Proposição de Exceções na Wasm
A proposta de exceções na Wasm tem objetivos semelhantes aos da GC para linguagens que usam exceções, visando um suporte eficiente a exceções na WebAssembly. Sem essa proposta, as toolchains teriam que implementar convenções de chamada personalizadas que retornassem não apenas resultados da função, mas também se a função retornou normalmente ou lançou uma exceção. Com a proposta de exceções, isso se resolve com o uso de construções throw e try/catch, resultando em execução mais rápida e arquivos .wasm menores.
Implementação do GC no Wasmtime
O Wasmtime utiliza um coletor de lixo do estilo Cheney, que copia semi-espaço por meio do tempo. O heap do GC é dividido em duas metades: o ‘active’ semi-space, onde novos objetos são alocados, e o ‘idle’ semi-space. Durante a coleta, os objetos ativos são copiados do espaço ocioso para o novo espaço ativo, e todas as referências GC raíz (como referências ativas dentro dos quadros de pilha Wasm) são atualizadas para os novos locais.
A implementação reutiliza memórias lineares de WebAssembly para implementar e sandboxear o heap do GC. Uma referência a um objeto GC não é um ponteiro nativo, mas um índice de 32 bits no heap de memória linear subjacente do GC. Isso traz benefícios em termos de segurança, velocidade e portabilidade.
Para reforçar a confiança na correção do coletor, a equipe estendeu a infraestrutura de fuzzing para testar o GC do Wasm, incluindo ferramentas de geração de programas Wasm que usam GC, bem como ferramentas para detectar corrupção de heap devido a erros no coletor ou em otimizações do compilador.
Desempenho e Próximos Passos
O foco inicial foi a correção do coletor, com menos atenção ao desempenho, que ainda não se beneficiou de décadas de engenharia de desempenho como em outros coletores. OWasmtime foi projetado para criar muitos pequenos e descartáveis instâncias Wasm, processando tarefas pequenas antes de serem descartadas. A equipe está trabalhando na extensão das otimizações de análise de alias do compilador com informações de tipo GC.
O próximo marco é o protótipo de integração de GC com o modelo de componente, o que promoverá linguagens com coleta de lixo aos cidadãos de primeira classe no ecossistema de componentes.
Conclusão
A equipe do Wasmtime está animada em ter atingido essa etapa importante. Convidam os usuários a testar o suporte a GC e exceções no Wasmtime e compartilhar suas experiências.