2 pontos por GN⁺ 2024-11-11 | 1 comentários | Compartilhar no WhatsApp
  • Ferramenta que compila JavaScript para WebAssembly, semelhante ao porffor por gerar binários WASM autônomos. Escrita em Rust
  • Ferramenta experimental, ainda não pronta para uso em produção, com muitos recursos da linguagem e tipos embutidos ausentes ou incompletos
  • O objetivo é alcançar suporte de 100% da linguagem.

Por que Jawsm?

  • O projeto Jawsm começou durante o trabalho no Crowst, uma ferramenta de teste de estresse que executa cenários de WebAssembly.
  • Ele só oferece suporte a código compilado de Rust para WASM, mas Rust não é uma linguagem amplamente usada.
  • Executar uma linguagem de script sobre WASM não é ideal atualmente. É preciso incluir um interpretador ou usar uma variante da linguagem-alvo.
  • Acredita-se que, com as propostas modernas de WASM, é possível implementar 100% dos recursos de JavaScript sem um interpretador compilado.

O que funciona

  • O objetivo é implementar 100% da linguagem, com foco na implementação da semântica.
  • Há 4 itens difíceis de implementar: escopo/closures, try/catch, async/await e generators.
  • Atualmente, o Jawsm implementa compilação de código com closures, try/catch, API Promise limitada e async.
  • Recursos que funcionam: declaração e atribuição de variáveis, while, literais de string, números e operadores básicos, booleanos e operadores booleanos básicos, literais de array, literais de objeto, palavra-chave new.

Requisitos do host

  • O Jawsm é construído com propostas recentes de WASM, então os binários gerados têm pouca portabilidade entre runtimes.
  • Está sendo implementado com WASIp2 em mente e usa V8 com polyfills em JavaScript para recursos do WASIp2.
  • Há um script run.js que pode executar os binários gerados pelo Jawsm.

Como usar

  • É melhor não usar, a menos que você vá contribuir.
  • Após clonar o repositório, é possível usar o script execute.sh para gerar um arquivo WAT, compilá-lo em binário e então executá-lo com Node.js.
  • São necessários o cargo do Rust, a versão mais recente de wasm-tools e Node.js v23.0.0 ou superior.

Próximos passos

  • O plano é primeiro concluir os recursos difíceis de implementar; os próximos são generators e suporte à palavra-chave await.
  • Gostariam de usar a proposta de troca de pilha, mas por enquanto estão usando transformação CPS para simular continuations.
  • Depois disso, pretendem implementar sintaxe, tipos embutidos e APIs.

Como funciona

  • O projeto converte a sintaxe de JavaScript em instruções WASM e aproveita as propostas de WASM GC, tratamento de exceções e otimização de tail calls.
  • Escreve código WASM adicional para simular escopo e closures de JavaScript dentro de WASM.

1 comentários

 
GN⁺ 2024-11-11
Comentários no Hacker News
  • É um uso inteligente da nova proposta de WASM GC. Os compiladores JS -> WASM anteriores incluíam um mecanismo JS inteiro, mas este projeto tenta mapear diretamente as estruturas de JS para os elementos básicos do WASM.

    • No passado, criei um compilador para embarcados ARM que era quase TypeScript. Algumas técnicas podem ser úteis.
  • Gosto de escrever Rust, mas não é uma linguagem amplamente usada. O Rust tem recebido muita atenção ultimamente e parece estar sendo usado em vários lugares.

  • Estou confiante de que será possível cobrir 100% da especificação do JavaScript. Ideias, perguntas ou críticas são bem-vindas.

    • Fico curioso se há resultados do test262_runner.rb. Seria bom mostrar esse progresso no README. Excelente projeto.
  • Li o README.md do projeto, mas não tenho certeza de qual é o modo de uso esperado. Fico me perguntando como o código WASM gerado interage com o runtime. Também me pergunto se ele foi pensado como uma ferramenta compatível com navegadores e outros runtimes WASM, ou se só é compatível com o runtime acoplado ao projeto.

    • Também fico me perguntando como ele reage ao encontrar Web APIs ou identificadores globais definidos apenas em ambientes específicos dentro do código JavaScript. Se não for voltado para esse ambiente, como a entrada e saída devem ser tratadas ao usá-lo?
  • A execução de JS sem runtime de navegador está chegando. perforr, jaws ou algum outro projeto vai acabar tendo sucesso.

  • Fico me perguntando como são tratadas as incompatibilidades de codificação de strings e os utilitários relacionados. O WASM suporta UTF-8 e o JS usa UTF-16 (potencialmente inválido).

  • Gosto muito dessa abordagem. Em vez de tentar gerar binários diretamente, construir diretamente para WASM significa que ela pode depender do suporte assíncrono esperado como parte do WASM GC e do WASI 0.3.

  • Algumas pessoas chamam isso de compilador. Ótimo trabalho.

  • Fico me perguntando se esse código roda mais rápido do que executar o mesmo código em JS, ou se o objetivo é interoperabilidade com outras linguagens.