O que é?

WebAssembly (Wasm) é um formato binário e uma linguagem de baixo nível projetada para permitir a execução de código de alta performance na web e em outros ambientes. Ele oferece uma alternativa ao JavaScript, permitindo que os desenvolvedores escrevam código em linguagens como C++, Rust, etc., que é então compilado para WebAssembly. Ele é suportado por todos os principais navegadores e oferece vantagens como maior desempenho e acesso direto a recursos de hardware.

Características:

Eficiente e rápido:

O WebAssembly é codificado de forma eficiente em um formato binário, visando a execução nativa rápida, aproveitando as capacidades de hardware comuns.

Seguro:

O ambiente de execução do WebAssembly é protegido e isolado, garantindo segurança de memória e respeitando as políticas de segurança do navegador.

Aberto e passível de depuração:

O WebAssembly pode ser apresentado em formato textual para fins de depuração, teste, otimização e escrita manual de programas, facilitando a compreensão e a manutenção.

Parte da plataforma web aberta:

O WebAssembly foi projetado para ser integrado à web como uma extensão, permitindo chamadas entre JavaScript e WebAssembly. Além disso prevê o acesso às mesmas APIs de navegador, mantendo a compatibilidade com versões anteriores.

Especificação:

A especificação do Webassembly é composta pelos seguintes itens:

Especificação principal: define a semântica dos módulos WebAssembly independentemente de uma incorporação concreta. O núcleo do WebAssembly é especificado em um único documento. https://webassembly.github.io/spec/core/

Especificação das Interfaces:

  • API JavaScript: define classes e objetos JavaScript para acessar o WebAssembly de dentro do JavaScript, incluindo métodos para validação, compilação, instanciação, e classes para representar e manipular importações e exportações como objetos JavaScript. https://webassembly.github.io/spec/js-api/index.html
  • API Web: define extensões para a API JavaScript disponibilizadas especificamente em navegadores da web, em particular, uma interface para compilação e instanciação de streaming a partir de tipos de Resposta associados à origem. https://webassembly.github.io/spec/js-api/index.html
  • API WASI: define uma interface de sistema modular para executar o WebAssembly fora da web, fornecendo acesso a coisas como arquivos, conexões de rede, relógios e números aleatórios. https://github.com/WebAssembly/WASI/blob/main/Proposals.md

Convenções de ferramentas: repositório descrevendo convenções não padrão úteis para coordenar a interoperabilidade entre ferramentas que trabalham com o WebAssembly. Isso inclui convenções para esquemas de ligação, informações de depuração, ABIs de linguagem e mais. https://github.com/WebAssembly/tool-conventions

Documentos de design: documentos que descrevem o design, objetivos e visão geral de alto nível do WebAssembly. Alguns desses documentos estão desatualizados atualmente. https://github.com/WebAssembly/design

Suporte dos Navegadores:

Há um bom suporte, mas ainda existem itens pendentes em diversas implementações. Confira a lista atualizada aqui: https://webassembly.org/features/

Quais as vantagens em relação ao Javascript?

Embora ainda não esteja amplamente em uso, ele possui algumas várias vantagens que podem ser consideradas:

  1. Desempenho: O WebAssembly é projetado para oferecer desempenho próximo ao nativo, o que significa que os aplicativos podem ser executados mais rapidamente na web, especialmente aqueles que requerem computação intensiva.

  2. Portabilidade: O código em WebAssembly pode ser executado em uma variedade de ambientes, não apenas em navegadores web, mas também em servidores e dispositivos embarcados, aumentando a portabilidade das aplicações.

  3. Segurança: O modelo de execução do WebAssembly é projetado para ser seguro, oferecendo um ambiente de execução isolado que protege contra ataques maliciosos.

  4. Compatibilidade: O WebAssembly foi projetado para ser compatível com a web existente, permitindo que os aplicativos interajam facilmente com o JavaScript e a infraestrutura da web, além de suportar chamadas para e de APIs do navegador.

  5. Ampla adoção: O WebAssembly é suportado por todos os principais navegadores, o que significa que os desenvolvedores podem contar com sua disponibilidade em uma ampla gama de plataformas.

  6. Linguagem de programação: O WebAssembly permite que os desenvolvedores usem uma variedade de linguagens de programação, incluindo C, C++, Rust e outras, em vez de se limitarem ao JavaScript, proporcionando flexibilidade na escolha da linguagem mais adequada para cada aplicativo.

Essas vantagens fazem do WebAssembly uma opção interessante para o desenvolvimento de aplicativos web que exigem alto desempenho, portabilidade e segurança.

E desvatanges, temos?

Claro, sempre há dois lados e é importante avaliar cada uma delas quando projetar um sistema. Aqui listamos algumas das desvantagens do WebAssembly hoje:

  1. Complexidade de desenvolvimento: O processo pode ser mais complexo devido à necessidade de lidar com ferramentas de compilação e otimização para diferentes linguagens de programação.

  2. Debugging e Ferramentas de Desenvolvimento: Depurar e usar ferramentas de desenvolvimento pode ser mais desafiador e menos maduras do que aquelas disponíveis para JavaScript.

  3. Tamanho dos arquivos: Arquivos WebAssembly tendem a ser maiores que equivalentes em JavaScript, resultando em tempos de carregamento mais longos.

  4. Curva de Aprendizado: Pode haver uma curva de aprendizado para desenvolvedores que estão acostumados apenas com JavaScript.

  5. Compatibilidade com Navegadores Antigos: Pode haver problemas de compatibilidade com versões mais antigas dos navegadores, especialmente ao utilizar recursos mais recentes do WebAssembly.

Em resumo, o WebAssembly apresenta promessas significativas, oferecendo desempenho próximo ao nativo, portabilidade e segurança para aplicativos web. No entanto, sua complexidade de desenvolvimento, desafios de compatibilidade com navegadores mais antigos e potenciais questões de tamanho de arquivo podem representar obstáculos para os desenvolvedores.

Outro fato relevante é que esta tecnologia está ano após ano sendo adotada e suportada mas ainda não se tornou presença significativa no mercado, o que pode ser um ponto considerável ao compará-lo com o Javascript (ou mesmo Typescript) que dominam o mercado. Vamos esperar o desfecho nos próximos anos, se de fato se coloca como padrão ou se é substituído por uma nova promessa.