coldwa.st
Todos os guiasProgramaçãoWebDadosFerramentasBases de dadosHaskellConceitosCabal e buildsToolchainCompiladorDesempenhoEditor e HLS

WebAssembly · compilação · máquinas virtuais

O que é o WebAssembly, exatamente?

Por ColdwastAtualizado a 2 de agosto de 20267 min de leitura#wasm#compilers#web
Contentores de transporte empilhados em várias filas de altura contra um céu azul
Contentores de transporte empilhados em várias filas de altura contra um céu azul, idênticos na forma seja qual for a carga que levam.

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.

Uma pá de plástico cor de laranja pousada sobre areia húmida
Uma pá de plástico cor de laranja deixada numa caixa de areia, o sítio onde é permitido escavar sem consequências.

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.