O WebAssembly, ou WASM, oferece aos desenvolvedores uma maneira de criar programas que sejam executados em velocidade quase nativa no navegador ou em qualquer outro lugar em que você possa implantar o tempo de execução do WebAssembly. Mas você geralmente não escreve programas no WASM diretamente. Em vez disso, você escreve programas em outros idiomas – alguns mais adequados para serem traduzidos para o WASM do que outros – e compilam -os com o WASM como alvo.

Esses seis idiomas (conto C e C ++ como dois) podem ser implantados no WASM RunTimes através de diferentes ferramentas e com diferentes graus de facilidade e compatibilidade. Se você deseja explorar o uso do WASM como um alvo de implantação para o seu código, você deve saber o quão adequado o seu idioma de escolha é executar como WASM. Também discutirei o nível de trabalho envolvido em cada implantação.

Ferrugem

De certa forma, a ferrugem é o idioma mais adequado para implantar para a WebAssembly. Seu código de ferrugem existente não precisa ser modificado muito para compilar com o WASM, e a maioria das alterações envolve a configuração das configurações corretas de destino do compilador e compilação. A ferramenta também gera automaticamente o JavaScript de caldeira para permitir que os módulos WASM compilados funcionem diretamente com as páginas da web.

O tamanho do módulo compilado variará, mas a ferrugem pode gerar código bastante magro e eficiente; portanto, um simples “Hello, World” geralmente não funciona mais do que alguns Kilobytes. Os mantenedores da RUR robavam um guia inteiro para usar o WASM da Rust, com detalhes sobre como manter o tamanho dos binários entregues pequenos e adicionar suporte de WASM a uma caixa de ferrugem existente e de uso geral.

C/C ++

C e C ++ estavam entre os primeiros idiomas a compilar com o WASM, em grande parte porque muitos dos comportamentos de nível inferior nesses idiomas mapeiam bem o conjunto de instruções da WASM. A onda inicial de demos de WASM foram portos de demonstrações e jogos gráficos escritos em C/C ++, e esses projetos de prova de conceito foram um longo caminho para a venda de WASM como tecnologia. (Olha! Podemos jogar Ruína no navegador!)

Uma das primeiras ferramentas desenvolvidas para compilar C/C ++ ao WASM foi a cadeia de ferramentas EMScripten. Desde então, o EMSCRIPTEN se tornou uma cadeia de ferramentas completa para compilar C ou C ++ ao WASM-abrigada no sentido de que oferece instruções detalhadas para portar código. Simd (que é Suportado no WASM), networking, C ++ Exceções, código assíncrono e muitos outros recursos avançados podem ser portados para o WASM, embora a quantidade de trabalho varie de acordo com o recurso. O suporte do PTHread, por exemplo, não está ativado por padrão e só funcionará nos navegadores quando o servidor da Web tiver determinados cabeçalhos de origem definidos corretamente.

A partir da versão 8 ou mais, o compilador Clang C/C ++ pode compilar nativamente para o WASM sem ferramentas adicionais. No entanto, o EMSCRIPTEN usa a mesma tecnologia subjacente que o CLANG – a estrutura do compilador LLVM – e pode fornecer um conjunto de ferramentas mais completo especificamente para compilação.

Golang

O idioma GO adicionou suporte para WebAssembly como um alvo de compilação na versão 1.11, em agosto de 2018. Originalmente um projeto experimental, o WASM agora é bastante bem suportado como alvo, com algumas advertências.

Assim como a ferrugem, a maioria das mudanças em um programa GO por causa do WASM envolve a alteração do processo de compilação em vez do próprio programa. O WASM Toolchain está incluído no compilador GO, para que você não precise instalar outras ferramentas ou pacotes; Você só precisa alterar as variáveis ​​do ambiente de canetas e do Goarch ao compilar. Você precisará configurar manualmente o JavaScript Boilerplate para usar módulos GO compilados com WASM, mas isso não é difícil; envolve principalmente a cópia de alguns arquivos e você pode automatizar o processo, se necessário.

As partes mais complexas do uso do VO para WASM envolvem interagir com o DOM. A ferramenta incluída para isso através do pacote Syscalls/JS funciona, mas é estranho para qualquer outra coisa que não seja a interação básica. Para qualquer coisa maior, escolha uma biblioteca de terceiros adequada.

Outra desvantagem do uso do GO com WASM é o tamanho dos artefatos binários gerados. O tempo de execução de Go significa que até um módulo “Hello, World” pode ser até dois megabytes. Você pode comprimir binários de Wasm para economizar espaço ou usar um tempo de execução diferente, como Tinygo – embora essa opção funcione apenas com um subconjunto do idioma Go.

JavaScript

Pode parecer redundante traduzir JavaScript para WASM. Um dos destinos mais comuns para o WASM é o navegador, afinal, e a maioria dos navegadores vem com um tempo de execução JavaScript incorporado. Mas é possível compilar JavaScript para WASM, se você quiser.

A ferramenta mais prontamente disponível para JavaScript-to-wasm é Javy, criada e suportada pela ByteCode Alliance (um chefe de iniciativas de WASM). Javy não compila o código JavaScript para WASM como executá-lo em um tempo de execução do JavaScript baseado em WASM. Ele também usa uma estratégia de vinculação dinâmica para manter os módulos WASM resultantes razoavelmente pequenos, embora o tamanho varie dependendo dos recursos usados ​​no seu programa.

Python

A situação de Python é como Go’s, mas ainda mais pronunciada. Você não pode executar um programa Python sem o tempo de execução do Python, e é difícil fazer algo útil sem a biblioteca padrão do Python-para não falar do ecossistema de pacotes de terceiros python. Você pode Execute o Python por meio do tempo de execução do WASM, mas é desajeitado e volumoso, e o estado atual das ferramentas para Python-on-wasm não é simplificado.

Uma maneira comum de executar aplicativos Python por meio de um tempo de execução do WASM é o Pyodide, uma porta do tempo de execução do Cpython para o WASM via EMSCRIPTEN. Uma implementação, Pyscript, permite executar programas Python em páginas da web, conforme JavaScript. Ele também inclui suporte bidirecional à comunicação entre Python e o lado Javascript/DOM.

Ainda assim, o Pyodide vem com várias desvantagens. Os pacotes que usam extensões C (como exemplo, Numpy) devem ser portados manualmente para o pyodide para funcionar. Somente pacotes Python puros podem ser instalados a partir da Pypi. Além disso, o Pyodide precisa baixar um pacote WASM separado para o Python RunTime, que vai para alguns megabytes, para que possa ser oneroso para aqueles que não esperam um grande download potencialmente sempre que usam o idioma.