11 pontos por GN⁺ 2025-05-10 | 2 comentários | Compartilhar no WhatsApp
  • A especificação do Wasm 2.0 foi anunciada oficialmente
  • A Wasm Community e os Working Groups concluíram a especificação desde 2022, e as principais implementações já davam suporte ao 2.0
  • A partir do 2.0, foi adotado o modelo evergreen, no qual o documento Candidate Recommendation é continuamente atualizado para se manter no estado mais recente
  • Em vez de mover para uma recomendação final a cada anúncio de nova versão, o rascunho atual da recomendação passa a ser considerado o padrão

Principais recursos e adições do Wasm 2.0

  • Instruções vetoriais (SIMD): adição de 236 novas instruções para aproveitar os recursos SIMD de 128 bits das CPUs modernas, sendo eficiente para codecs de áudio/vídeo de alto desempenho, aprendizado de máquina, criptografia e mais
  • Instruções de memória em bloco: foi adicionado um conjunto de instruções que permite cópia e inicialização rápidas de memória e tabelas
  • Retorno multivalor: funções e blocos podem retornar vários valores, melhorando a convenção de chamada e permitindo transformações adicionais no programa
  • Tipos de referência: suporte a referências para funções ou ponteiros para objetos externos (ex.: valores JavaScript) como valores opacos de primeira classe; tabelas podem ser usadas como armazenamento desses valores de referência, e passam a ser possíveis instruções para manipular tabelas e definições de múltiplas tabelas
  • Conversões sem trap: foram introduzidas instruções de conversão que evitam traps inesperados ao converter ponto flutuante para inteiro
  • Instruções de extensão de sinal: foram adicionadas instruções que expandem diretamente a largura de inteiros com sinal, tornando essa expansão possível sem acesso à memória como antes

Compatibilidade retroativa e perspectivas futuras

  • O Wasm 2.0 é totalmente compatível com o 1.0, então os programas existentes continuam funcionando como estão
  • O lançamento do Wasm 3.0 também está previsto para breve

2 comentários

 
caniel 2025-05-10

WA!(SM)

 
GN⁺ 2025-05-10
Comentários do Hacker News
  • Resumindo o anúncio do WASM 2.0 em março de 2025: foi uma grande atualização, com 236 novas instruções vetoriais, incluindo SIMD de 128 bits, elevando bastante o desempenho de codecs de vídeo/áudio, aplicações de machine learning e criptografia; instruções de bulk memory para cópia/inicialização rápida de memória; funções agora podem retornar múltiplos resultados, permitindo convenções de chamada mais rápidas e menos indireções; tipos de referência tratam ponteiros para objetos externos (como valores de JavaScript) como valores de primeira classe; agora é possível declarar tabelas de vários tipos; além de instruções de ampliação de largura de bits e conversões de ponto flutuante sem traps inesperados
    • Rust+LLVM ainda não consegue aproveitar na prática o suporte a retorno de múltiplos resultados por causa de questões de compatibilidade de ABI; não sei como está a situação do lado do Clang
    • A parte das instruções vetoriais (SIMD) parece ter ficado complexa demais por buscar otimização cedo demais; teria sido mais elegante simplesmente usar a proposta de vetores de tamanho flexível
    • O recurso de retorno de múltiplos resultados deve ser muito útil também para o desenvolvimento de runtimes de Common Lisp
    • No fim do post oficial está escrito “em breve apresentaremos o Wasm 3.0”, então parece que o Wasm 3.0 realmente deve chegar em pouco tempo
    • Uma ISA independente de arquitetura e de propósito geral não é compatível com uma ISA que tenta aproveitar ao máximo o SIMD de CPUs específicas; é preciso escolher um lado. Não consegui verificar no GitHub se as instruções SIMD do Wasm 2 são genéricas o suficiente por causa do rate limit
  • A especificação do WebAssembly é relativamente fácil de ler, mas para iniciantes que não queiram encarar o texto completo da especificação, recomendo o livro online WebAssembly from the Ground Up. Ele ensina passo a passo construindo um compilador em JavaScript, o que é ótimo para prática, e há uma amostra gratuita. Aliás, eu sou um dos autores
    • Um motivo de eu gostar de Ada é que, diferente do código verboso de funções de checagem de U32 em JavaScript, em Ada isso pode ser tratado de forma bem elegante com subtipos (subtype) ou módulos
    • Fico curioso se é possível instrumentar código WASM para fazer depuração in-process; isto é, converter uma linguagem customizada para WASM em tempo real e, na web, implementar de uma vez breakpoints e inspeção de memória
  • Trabalhando no desenvolvimento de runtime de WebAssembly no último ano, fiquei impressionado com o rigor da especificação e com a qualidade dos testes oferecidos. Leva um tempo para se acostumar, mas depois que você pega o jeito, percebe que é uma especificação de linguagem muito inteligente. Em situações ambíguas, o interpretador de referência gerado diretamente da especificação ajuda bastante, e os testes da spec para validar consistência também são extremamente úteis
  • Recentemente a proposta Wasm Constant Time foi movida para inactive. A maior parte do trabalho real foi feita em 2018, mas a integração com SIMD e a incorporação como extensão oficial ficaram adiadas. A menos que alguém assuma esse trabalho importantíssimo, toda a criptografia em Wasm continuará muito vulnerável a timing attacks
  • Achei curioso que Wasm é a forma abreviada de WebAssembly, mas não um acrônimo, então não se escreve tudo em maiúsculas como WASM
    • Seguindo essa lógica, não seria WAsm?
    • Na prática, mesmo quando é acrônimo, há muitos casos escritos todos em minúsculas (por exemplo: scuba, radar, laser)
    • Espero que dê certo haha
  • Queria saber quais são os apps em WASM que realmente funcionam. A ideia é boa, mas dá uma sensação de ser como DAPPs, algo que “só existe pela diversão”. Seria legal ver exemplos reais
    • Recomendo madewithwebassembly.com e o GitHub Awesome-WebAssembly-Applications. São boas listas de apps WASM reais
  • Este lançamento do WASM 2 é excelente, mas a adoção de SIMD de tamanho fixo (128 bits) ainda deixa um gosto amargo. Uma abordagem mais flexível, como o ARM SVE, em que o compilador ajusta a largura SIMD conforme o desempenho do dispositivo, teria sido melhor
    • Eu, porém, acho que SIMD de tamanho fixo abre mais possibilidades de uso. Instruções vetoriais podem ser substituídas com relativa facilidade mesmo por SIMD fixo. SIMD nem sempre é estritamente necessário, mas há muitos usos oportunistas em que a vetorização acontece por causa do tamanho dos registradores, e nesses casos isso pode ser bastante útil
    • Fazer otimização cedo demais é a raiz do problema. Essa questão de SIMD também teria ficado bem mais elegante se simplesmente tivessem seguido a proposta de vetores de tamanho variável
  • Fico curioso se uma função C que retorna um valor como struct pode ser compilada para WASM
    • Pode, mas pelo que sei atualmente isso ainda não pode ser “exportado” para JS
  • Queria saber se já existe runtime com os recursos do WASM 2 implementados
    • A maioria já vem implementando isso há bastante tempo. A comunidade e o working group do Wasm fecharam a spec no começo de 2022, e as principais implementações já ofereciam 2.0 desde antes disso. O 3.0 também deve ser oficializado em breve, e parte dos recursos já está disponível por meio de feature flags
  • Bytecode para a web me parece um sonho antigo. Como desenvolvedor C#, acho impressionante como o Blazor liderou o WASM com ousadia desde o começo. O .NET está bem adiantado em WASM, e estou ansioso por essas mudanças da versão 2.0