Introdução e histórico

Com o lançamento recente do Wasmer 1.0, vamos dar uma olhada geral no WebAssembly e em seus tempos de execução populares, incluindo a emocionante interface WASI.

Para pular a seção de comparação, clique aqui .

ISAs e WebAssembly

Implementável em aplicativos da web de servidor/cliente, WebAssembly enfatiza a portabilidade e a previsibilidade. Juntamente com RISC-V , é uma arquitetura de conjunto de instruções (ISA) relativamente nova desenvolvida na última década e capaz de ser executada junto com linguagens hospedeiras.

Os próprios ISAs são modelos abstratos de ciência da computação que representam computadores. As promulgações de ISAs no mundo real são chamadas de implementações-por exemplo, uma unidade de processamento central (CPU). Os ISAs também determinam como o código de máquina se comporta em implementações que contêm esse ISA.

Enquanto o RISC-V abrirá o caminho para inovações de processo em arquiteturas de hardware/software extensível (por exemplo, processadores de código aberto), WebAssembly, muitas vezes abreviado para Wasm, se destaca por oferecer compilações, especialmente para navegadores.

Resumindo, WebAssembly pode ser executado junto com o mecanismo JavaScript que aciona os navegadores da web. Você pode compilar outras linguagens avançadas para ele- Rust , C/C ++, etc.-para melhor desempenho usando seu formato binário de baixo nível que combina tamanhos de arquivo pequenos com velocidade superior. Você não está escrevendo WebAssembly; você simplesmente o está usando para compilar.

Visão geral das bibliotecas de tempo de execução do Wasm: um breve histórico

Começa com Java

Vamos começar com Java. O sonho quintessencial da computação era a compatibilidade: os anos 90 criaram um mundo Java onde você pudesse”escrever uma vez, executar em qualquer lugar”(WORA)-embora este não fosse o uso pretendido originalmente. Isso funcionava com aplicativos simples, mas se tornou um problema com diferentes sistemas operacionais, versões e dispositivos que tentavam executar esse código.

WORA transformado em WODE (“escreva uma vez, depure em qualquer lugar”), com outros problemas como a necessidade do destino para usar JVM e então ter que fazer programação extra apenas em Java ou outra linguagem JVM. JavaScript deu um passo mais perto do sonho, tornando-se a linguagem universal do web.

WebAssembly entra em cena

Esse é o contexto básico para WebAssembly. Esta forma compacta é projetada para execuções rápidas e binários pequenos. Ele opera em sandbox, assim como o JavaScript, oferecendo proteção ao executar código online sem riscos extras para o seu sistema e é compatível com linguagens de programação avançadas.

Em uma seção posterior, falaremos sobre a interface WASI , que se esforça para padronizar as operações essenciais para deixar o WebAssembly mais perto do sonho de executando código feito uma vez em qualquer lugar. WASI/Wasm é uma solução melhor do que JavaScript para executar o seguinte fora do navegador:

Por enquanto, a questão de onde você executa ainda é um fator importante com o qual os desenvolvedores precisam lidar, sem mencionar o gerenciamento de fluxos de dados híbridos não estruturados por meio da nuvem e no local usando Bancos de dados NoSQL .

Visão geral técnica: bibliotecas de tempo de execução

Ao executar o código nativo no navegador, cada vez que o código-fonte é transcrito para a linguagem de destino relevante por um compilador, isso pode levar a um grande aumento do código do programa. A solução alternativa é usar um compilador com funções auxiliares específicas do compilador.

Função auxiliar do compilador WebAssembly Wasm

O WebAssembly também reduz enormemente o tempo de processamento nos navegadores. Como esta postagem cobre os tempos de execução de forma ampla, não entraremos nos detalhes específicos da estrutura e das representações do tempo de execução, como armazenamento e pilha, nem outros elementos da estrutura abrangendo a maquinaria conceitual do WebAssembly, como valores e instâncias de módulo e sua sintaxe auxiliar.

Comparação: 4 tempos de execução Wasm independentes interessantes

Wasmer

A versão 1.0 do Wasmer acabou de lançado em janeiro de 2021 com uma API estabilizada e uso mais fácil. Ele oferece contêineres extremamente leves executáveis ​​de qualquer lugar, seja nuvem, desktop ou dispositivo IOT. O Wasmer pode ser incorporado em qualquer linguagem de programação, agindo como uma biblioteca que você incorpora em qualquer linguagem; use realmente o WebAssembly em qualquer lugar.

Principais recursos do Wasmer:

  • Plugabilidade : compatível com as várias estruturas de compilação, o que você precisar (por exemplo, Cranelift)
  • Velocidade/segurança : Capaz de executar o Wasm quase na velocidade nativa em uma configuração totalmente isolada.
  • Universalidade : funciona em qualquer plataforma (Windows, Linux e assim por diante) e chipset
  • Suporte : compatível com os padrões do conjunto de testes WebAssembly com uma grande base de suporte da comunidade de desenvolvedores e colaboradores

Instale o Wasmer com um único comando.

Wasmtime

O Wasmtime é uma solução compacta e eficiente para trabalhar com as inovações mais recentes do WASI/WebAssembly. Se você estiver usando as seguintes linguagens, incorpore Wastime (também pode ser hospedado pela Bytecode Alliance): Rust, Python, C,.NET e Go. Fora da aliança, você pode encontrar APIs de incorporação para Java, Perl, Targeting, Zig e Ruby.

Principais recursos do Wasmtime:

  • Compacto : tempo de execução autônomo não exigente que você pode escalar conforme suas necessidades aumentam. Pode trabalhar com pequenos chips ou ser utilizado com servidores enormes. Incorporável em quase qualquer aplicativo
  • Facilmente modificado : ajuste o Wasmtime com antecedência para pré-compilações, gere código em velocidade da luz usando Lightbeam ou use para interpretações de tempo de execução. Configure para tudo o que você precisa que o Wasm realize
  • Speedy : Compatível com Cranelift; executar codificação de máquina em tempo de execução de alta resolução
  • Compatível com WASI : suporta um fluxo de APIs, permitindo que você implemente junto com o host por meio da interface WASI
  • Suporte : compatível com os padrões do conjunto de testes WebAssembly com uma grande base de suporte da comunidade de desenvolvedores e colaboradores

Guia de instalação/incorporação do Wasmtime .

Lucet

Lucet foi anunciado em 28 de março de 2019. É um menor-conhecido compilador/runtime nativo para WebAssembly e uma opção para desenvolvedores que desejam executar programas Wasm potencialmente perigosos contidos em seu aplicativo.

Um projeto da comunidade de código aberto da Bytecode Alliance, você pode usá-lo para executar código não confiável, seja a infraestrutura, dispositivo ou sistema operacional-um recurso extraído de exemplos estabelecidos usados ​​em navegadores da web.

Principais recursos do Lucet:

  • Especialização rápida : um projeto de código aberto, executa programas não confiáveis ​​em velocidade quase nativa
  • Compatível com WASI : use WebAssembly fora do seu navegador. Lucet suporta a interface do sistema WebAssembly na nuvem Fastly edge
  • Suporta muitas linguagens : Isso inclui Typescript, Rust, C/C ++ e muitos mais em desenvolvimento
  • Espaço de execução extremamente reduzido : qualquer solicitação mediada rapidamente pode ser executada por uma instância WebAssembly que representa todos os muitos milhares de solicitações por segundo por processo, sem riscos de segurança de aplicativos da web
  • Suporte à compilação Ahead-of-time (AOT) : configure compilações AOT para otimizar a sobrecarga e o design do tempo de execução

Seu guia de compilação precisa ser atualizado.

WebAssembly Micro Runtime (WAMR)

O tempo de execução autônomo final que abordaremos é o WebAssembly Micro Runtime (WAMR). Ele tem uma pegada pequena e é composto de três componentes:

  1. Um chamado núcleo iwasm VM, que oferece compilação just-in-time (JIT) e AOT, e interpretação WebAssembly
  2. Uma estrutura de aplicativo que permite a construção de vários aplicativos Wasm que podem ser executados em dispositivos e para fins de IoT
  3. Gerenciamento de aplicativo dinâmico/remoto da nuvem ou ambiente de host

Principais recursos do WAMR (iwasm):

  • Rápido : roda quase na velocidade nativa (AOT)
  • Conformidade : padrões de conformidade para o W3C WASM MVP
  • pegada pequena : tamanho binário de apenas 85 K (intérprete) e 50 K (AOT) e requer poucos recursos de memória

Não há muita coisa acontecendo com o suporte/notícias da comunidade aqui além da resolução de problemas de bug.

WASI: Uma vantagem de tempos de execução com olhos de águia

Para o navegador, ou não para o navegador

Como o nome sugere, WebAssembly foi projetado para ser executado pela web em navegadores. Mas tem potencial para um futuro massivo não-web graças ao WASI. Essa interface do sistema permite a execução do WebAssembly fora da web e também dentro dela.

Ao usar o ecossistema da web, WebAssembly é capaz de trabalhar com APIs de navegadores modernos , permanecer compatível com seu modelo de segurança padrão e manter a portabilidade da web, ao mesmo tempo em que mantém o desenvolvimento e design adaptáveis ​​para evolução futura. Este é um sistema de alto nível sem compensações em segurança, especialmente em comparação com o JavaScript.

Para executar Wasm fora da web usando WASI, os tempos de execução Wasm independentes podem funcionar como intérpretes/“hosts”. A promessa de usá-lo em ambientes não web (com ou sem uma VM JavaScript como Node.js) se estende desde o propósito de teste usando shells básicos até aplicativos comerciais para dispositivos IoT, aplicativos móveis/desktop, servidores de data center ou como um executável interno programas maiores.

O que é WASI e por que é tão emocionante?

WASI significa WebAssembly System Interface, ou seja, é a interface de sistema modular de Wasm. Vamos explorar isso de um alto nível para que você possa ter uma ideia de porque o WASI é tão emocionante. Aqui estão algumas das maneiras possíveis de manifestar o WASI (assumindo que os objetivos de alto nível do WASI sejam realizados):

1.) Aplicativos/jogos multiplataforma

O sonho aqui são jogos multiplataforma e aplicativos de um único arquivo, também aproveitando o poder do PlayOS . O mecanismo por trás disso: um executável binário capaz de ser realizado em qualquer plataforma que contenha o tempo de execução do WebAssembly-comunidades construindo bibliotecas que os mapeiam, com o próprio WebAssembly fazendo o trabalho fundamental.

2.) Reutilização do código-fonte

O benefício aqui é óbvio. Você pode reutilizar o código-fonte em várias plataformas para a arquitetura de seu aplicativo-por exemplo, móvel/desktop, servidor e cliente e até mesmo IoT.

3.) Tempo de execução único capaz de executar aplicativos compatíveis com WASI (Wasm)

Isso reduz enormemente as demandas de compilação. Não há necessidade de juntar linguagens diferentes e seus tempos de execução separados-um tempo de execução capaz de realizar cada um!

4.) Agrupando muitos alvos como um alvo

Na verdade, trata-se de conteinerização-uma compilação de muitos aplicativos e suas dependências em um ou poucos arquivos Wasm. Tudo é conduzido por Wasm, aumentando a usabilidade e reduzindo a necessidade de contêineres exigentes.

Com tudo isso dito, WASI ainda está em desenvolvimento e todos esses exemplos são conceituações de alto nível.

Concluindo

Para resumir as opções de tempo de execução:

  • Wasmer tem a melhor compatibilidade de suporte geral com todas as linguagens de programação em supervelocidade
  • Wasmtime é ultrarrápido e compacto, com boa configurabilidade, mas menos idiomas suportados
  • Lucet é uma solução especializada para executar programas WebAssembly não confiáveis ​​dentro de um aplicativo maior
  • WAMR é executado com uma pegada pequena

N.B. , esta lista não é exaustiva; existem muitos tempos de execução WebAssembly impressionantes .

É isso-cobrimos uma década neste guia. Eu desenvolvi alguns dos principais recursos dos tempos de execução mais populares (e promissores) do WebAssembly: semelhanças e diferenças, de melhorando a renderização do navegador para possibilidades fora da web. Eu coloquei isso sob a perspectiva geral do WASI, já que o WASI é baseado na portabilidade máxima.

Os programas que contêm WebAssembly terão essa interface de sistema adicional atuando como uma base sobre a qual outros programas podem ser construídos. Isso assume o desafio de uma interface verdadeiramente universal, que o Java começou a realizar, e vai de mãos dadas com a mudança em direção à ciência de dados para otimizar os negócios.

A segurança será um grande problema à medida que a universalidade extrema se torna mais possível-um mundo onde um programa WASI pode ser executado de qualquer fonte. Novos sistemas de segurança desenvolvidos por esforços unidos de vários setores precisarão ser desenvolvidos para atender a essa demanda, um exemplo é o tempo de execução Lucet.

A postagem Comparação de tempos de execução do WebAssembly apareceu primeiro em LogRocket Blog .

Source link