WebAssembly · compilação · máquinas virtuais
O que é o WebAssembly, exatamente?
O mal-entendido mais comum acerca do WebAssembly é julgar que se trata de uma linguagem que se escreve. Não é. A definição oficial é precisa, e lê-la à letra responde à maior parte das perguntas que as pessoas têm.
A definição, palavra a palavra
O WebAssembly, abreviado Wasm, é um formato de instruções binário para uma máquina virtual baseada em pilha. Está desenhado como um alvo de compilação portátil para linguagens de programação, permitindo a implementação na web para aplicações cliente e servidor.
Daqui decorrem de imediato duas coisas. É um alvo, o que significa que outra coisa compila para ele, tal como o C compila para código máquina. E é baseado em pilha, que é uma decisão de desenho sobre a forma como a máquina virtual guarda os operandos, não um pormenor com o qual se interaja diretamente.
Não se espera que alguém escreva Wasm à mão para produção, tal como ninguém escreve x86 à mão. Escreve-se Rust, C, Go ou outra linguagem, e o compilador emite Wasm.
Os quatro objetivos de desenho, e o que custa cada um
O projeto enuncia quatro objetivos, e vale a pena lê-los como compromissos e não como uma lista de funcionalidades.
Eficiência. A máquina de pilha está desenhada para ser executada à velocidade nativa tirando partido das capacidades de hardware comuns disponíveis numa vasta gama de plataformas. Repare-se na ressalva: capacidades comuns, numa vasta gama. Aqui a velocidade vem de apontar àquilo que todas as plataformas têm, e não de explorar aquilo que uma única faz melhor.
Segurança. O Wasm descreve um ambiente de execução seguro em memória e isolado numa sandbox, que ainda por cima pode ser implementado dentro das máquinas virtuais de JavaScript existentes. O módulo não consegue alcançar nada para lá daquilo que o anfitrião lhe entrega.
Abertura. Está desenhado para ser impresso de forma legível num formato textual para depuração, testes, experimentação, otimização, aprendizagem, ensino e escrita de programas à mão. Um formato binário que distribui uma contraparte legível está a fazer uma escolha deliberada contra a opacidade.
Portabilidade. O propósito declarado é preservar a natureza sem versões, testada por funcionalidade e retrocompatível da web. Essa única fórmula explica porque é que o Wasm não tem números de versão a negociar: testa-se a presença de uma funcionalidade, não se pergunta com que versão se está a falar.
A relação com o JavaScript
O Wasm não substitui o JavaScript, e a redação oficial sobre a interação entre ambos é cuidadosa de uma forma que vale a pena notar. Os módulos poderão chamar para dentro e para fora do contexto de JavaScript e aceder à funcionalidade do navegador através das mesmas Web APIs acessíveis a partir do JavaScript.
Esse tempo futuro, poderão, está na descrição oficial. É um lembrete de que a fronteira entre os dois tem sido um alvo em movimento, e de que tudo o que se leia sobre o Wasm e o DOM deve ser confirmado face à versão que se está realmente a colocar em produção e não face a um artigo de blogue.
A forma prática hoje: o Wasm calcula, o JavaScript orquestra. O trabalho numérico pesado, os codecs, a compressão, a simulação e a criptografia encaixam todos no primeiro papel. Chegar à página, tratar eventos e chamar as APIs do navegador encaixam no segundo.
Nunca foi só para navegadores
O nome induz as pessoas em erro, e o site di-lo com clareza: o WebAssembly também suporta incorporações fora da web. A própria definição menciona aplicações cliente e servidor.
É por isso que o Wasm aparece em sítios onde não há navegador nenhum: sistemas de plugins que precisam de executar código não fidedigno em segurança, runtimes na periferia, scripting incorporado dentro de aplicações maiores. Em todos eles o atrativo é o mesmo par de propriedades, uma sandbox com um formato binário portátil, e o navegador é simplesmente o anfitrião mais visível e não o único.
Quando é a ferramenta errada
Se o seu estrangulamento é a rede, o Wasm não ajuda. Um módulo continua a ter de ser descarregado, e um cálculo rápido atrás de uma transferência lenta continua a ser lento.
Se o seu trabalho é sobretudo manipulação do DOM, atravessar a fronteira para o fazer custa mais do que aquilo que poupa. É precisamente naquilo em que o JavaScript já é bom.
Se tivesse de reescrever código que funciona, pondere isso com honestidade. O Wasm brilha quando uma linguagem compilada já é o encaixe natural, ou quando tem uma base de código C ou Rust já existente para trazer consigo.
A versão curta
O WebAssembly é um formato de instruções binário para uma máquina virtual baseada em pilha, e um alvo de compilação portátil mais do que uma linguagem que se escreve. Os seus quatro objetivos são a eficiência à velocidade nativa sobre hardware comum, uma sandbox segura em memória, um formato de texto legível ao lado do binário, e a portabilidade sem versões e testada por funcionalidade da web.
Complementa o JavaScript em vez de o substituir, e suporta incorporações fora da web, razão pela qual surge em sistemas de plugins e em runtimes de servidor com a mesma facilidade com que surge nos navegadores. Leia a definição à letra e a maior parte da confusão à sua volta desaparece.
Se está a começar a perceber como é que as linguagens compiladas chegam sequer a um alvo, a nossa nota sobre o que é um algoritmo começa um nível abaixo deste.
A definição, os quatro objetivos de desenho e a sua redação, a afirmação sobre chamar para dentro e para fora do contexto de JavaScript, e a nota sobre as incorporações fora da web são retiradas do site oficial do WebAssembly, verificado à data em que este texto foi escrito. A especificação evolui; confirme na documentação atual antes de se apoiar numa capacidade específica.