Desmistificando WebAssembly Alta performance, portabilidade e segurança
Raphael AmorimPrefácio
O WebAssembly, também conhecido como WASM, é um formato de código dedicado e otimizado para a Web, que pode melhorar muito o desempenho dos sites. Apesar de ter sido criado originalmente para servir à Web, ele não se limita apenas a ela e vem sendo usado em diferentes lugares e propósitos, como dispositivos móveis e ambientes de computação de borda (do inglês, Edge computing), tais como os Workers da Cloudflare e outros.
O arquivo binário do WASM pode ser produzido como destino de compilação de inúmeras linguagens de programação como Rust, C, C++, Golang, Lua, Zig, Python, Swift, Ruby, PHP, Java, C# e tantas outras. Esse produto contém instruções de baixo nível para ser executável com uma velocidade de alta performance, muitas vezes próxima da velocidade nativa.
Além de tornar a Web ainda mais rápida, WebAssembly adiciona pluralidade, pois viabiliza que pessoas programadoras de diversas linguagens criem aplicações ou portabilizem aplicações existentes de plataformas nativas para os navegadores. As aplicações construídas com o WASM possuem diferentes características de segurança em comparação com qualquer código escrito em JavaScript e executado no navegador.
A segurança na Web foi revisitada e empoderada na construção do WebAssembly. O modelo de segurança do WASM foi projetado para ser completamente isolado em "caixa de areia" (sandbox), e isso significa que o WASM não disponibiliza acesso nem se comunica com nenhum contexto externo por padrão. Essa comunicação precisa ser feita de forma declarativa pelo(a) programador(a).
No decorrer do livro, vamos ver mais sobre as caraterísticas da segurança, performance, portabilidade e pluralidade de linguagens. Este livro tem como objetivo fazer a apresentação do WebAssembly de maneira prática com foco no uso da tecnologia no dia a dia, até o completo entendimento de como funciona uma estrutura de arquivo binário e todas as suas instruções. Com esse conhecimento, você conseguirá até mesmo escrever seu próprio compilador WebAssembly.
O material foi pensado para pessoas desenvolvedoras que desejam entender como o WebAssembly funciona a fundo. Vamos examinar e dissecar desde o processo de compilação de módulo até a sua execução com a máquina virtual do WASM. Ao longo dos capítulos, colocaremos ênfase e exemplificaremos inúmeros conceitos da ciência da computação com o ecossistema do WebAssembly.
Existem diferentes perfis de pessoas programadoras que poderão tirar proveito do conteúdo deste livro:
- Programadores(as) front-end que desejam criar aplicações para a Web com uma performance próxima da nativa;
- Programadores(as) back-end que desejam portar aplicações escritas originalmente para plataformas nativas para a Web;
- Programadores(as) que desejam criar aplicações de característica multiplataforma, ou seja, executar o mesmo código para plataformas distintas;
- Programadores(as) que desejam aprender como depurar ou otimizar arquivos binários WebAssembly;
- Qualquer programador(a) que deseja entender a fundo como o WebAssembly funciona.
A maior parte dos códigos dos exemplos foi escrita com as linguagens de programação JavaScript e Rust. Eventualmente, ao decorrer do livro, ambas as linguagens serão menos utilizadas, pois aprenderemos e usaremos a escrita de módulos WebAssembly com sua representação textual.
O nível de conhecimento necessário sobre JavaScript como linguagem de programação é o intermediário, e isso significa ter experiência prática como programador(a) na escrita de aplicações para a Web ou em serviços escritos em NodeJS. É requerido ter a familiaridade básica com a linguagem, como sua sintaxe, variáveis, funções, laços de repetição, escopo léxico, closures e outros.
O conhecimento necessário sobre Rust como linguagem de programação é entre o básico e o intermediário. Todas as ferramentas do ecossistema da linguagem serão introduzidas e não é esperado que o leitor ou a leitora tenha experiência na escrita de aplicações em Rust. Entretanto, é necessário que possua o entendimento da sintaxe da linguagem, além de entender como funcionam funções, tipos, laços de repetição, referência e borrowing.
Versões
A versão do Rust utilizada oficialmente neste exemplar é a versão 1.70.0. Os exemplos de código também funcionam em versões anteriores, desde a versão 1.50.0 em diante. É bem provável que também funcione sem demais problemas para futuras versões que não contêm mudanças drásticas no compilador da linguagem, em razão da simplicidade dos exemplos.
Vamos focar majoritariamente no estudo da versão 1.0 do WebAssembly (com pequenas exceções nos últimos capítulos). O WebAssembly 1.0 é considerado o conjunto essencial de funcionalidades e recursos e possui o suporte habilitado na maioria dos navegadores atuais.
Este material não tem como objetivo ensinar ferramentas específicas do universo da linguagem Rust para trabalhar com WebAssembly; pelo contrário, o objetivo é aprender os fundamentos da tecnologia para que a pessoa desenvolvedora não se torne dependente de uma linguagem ou utilitários específicos para trabalhar com WebAssembly. Nos últimos capítulos, escreveremos a lógica dos módulos com o uso da representação textual do WebAssembly em vez de Rust.
Estrutura do livro
O livro é divido em três etapas:
Na primeira, vamos nos debruçar sobre a história, objetivos, fundamentos e uso prático do WebAssembly em aplicações para a Web. Ainda na primeira etapa, escreveremos uma aplicação Web que realiza processamento de imagens com o uso de funções escritas originalmente em Rust e compilada posteriormente para WebAssembly.
A segunda etapa é dedicada a conceitos computacionais necessários para a escrita de aplicações mais complexas no WebAssembly, como codificação de dados, vinculação dinâmica e estática, instruções atômicas, memória compartilhada e outros. Veremos as aplicações práticas de cada conceito com exemplos de módulos WebAssembly.
A última etapa é a união das duas primeiras partes para ver como o coração do WebAssembly funciona, como os tipos de erro, depuração de binários, máquina virtual, conjunto de instruções, estrutura do formato binário e outros. Em especial, o último capítulo do livro detalha sobre diferentes tipos de hospedeiros e como usar até mesmo WebAssembly no back-end com característica multiplataforma e uso de interface nativa de sistema operacional.
Este livro pesa e enfatiza o aprendizado dos fundamentos do WebAssembly do começo ao fim. Ao final do livro, você terá todo o conhecimento necessário para não depender de linguagem, ferramenta ou recurso específico além do próprio WebAssembly para desenvolver aplicações, seja para a Web ou para qualquer outro destino de uso.
Sobre o autor
Hugo Raphael Vianna Amorim nasceu no Rio de Janeiro, passou a maior parte de sua infância em uma cidade chamada Itaboraí e, hoje em dia, vive em Estocolmo, na Suécia. Começou a programar com 15 anos por diversão e não parou nunca mais. Formado em análise e desenvolvimento de sistemas pelo Instituto Infnet, foi palestrante em múltiplas conferências nacionais e internacionais.
Atualmente, trabalha como Sr. Software Engineer no Viaplay, tendo também trabalhado em empresas como Spotify, GoDaddy e Globo.com nos últimos 10 anos. Raphael foi responsável pela implementação e adoção da linguagem de programação Rust, e eventualmente WebAssembly, na maior empresa de streaming de vídeos dos países nórdicos.
Apaixonado por Open Source desde muito cedo, ele se envolveu com diversos projetos abertos, especialmente no cenário de desenvolvimento Web, sendo contribuidor do pacote binário oficial do WebAssembly, jQuery, React, entre outros. Além de atuar como contribuidor, mantém o emulador de terminal conhecido como "Rio" e o React-TV. Nas horas vagas, ele tem como lazer a corrida e a pintura a óleo.
Sumário
- 1 Introdução
- 1.1 Do NodeJS ao WebAssembly
- 1.2 O que é WebAssembly?
- 2 Fundamentos ao primeiro módulo
- 2.1 Máquina virtual do WebAssembly
- 2.2 Fundamentos básicos
- 2.3 Formatos de arquivo
- 2.4 Tipos de valores de dados
- 2.5 Compilação para o código binário
- 2.6 Escrevendo nosso primeiro módulo
- 3 Por trás da magia no navegador
- 3.1 Matrizes tipadas
- 3.2 DataView
- 3.3 WebAssembly no JavaScript
- 3.4 Módulo
- 3.5 Instanciamento de módulos
- 3.6 Criando e gerenciando memória
- 3.7 Valores globais
- 3.8 Tabelas
- 4 Criando um editor de imagem com WebAssembly
- 4.1 De volta ao navegador
- 4.2 Trabalhando com memória
- 4.3 Salvando os dados da imagem
- 4.4 Filtro preto e branco em JavaScript
- 4.5 Filtro preto e branco em WebAssembly
- 4.6 Filtros de tons de cores em WebAssembly
- 4.7 Filtro de opacidade em WebAssembly
- 4.8 Filtro de inversão em WebAssembly
- 5 Vinculação e interface binária de aplicativo
- 5.1 Uso da C ABI e Rust ABI no WebAssembly
- 5.2 Blocos externos
- 5.3 Compilando WebAssembly com vinculação dinâmica e estática
- 6 Encoding e Strings
- 6.1 Codificação e decodificação de dados
- 6.2 UTF-8
- 6.3 Strings do Rust para WASM
- 6.4 Envio de Strings do Rust para o WebAssembly
- 7 Threads e atômicos
- 7.1 Memória compartilhada
- 7.2 Instruções atômicas
- 7.3 Web Workers
- 8 Tipos de erro
- 8.1 Erro de compilação
- 8.2 Erro na configuração da instância
- 8.3 Erros em tempo de execução
- 9 Destrinchando o formato de texto
- 9.1 WAT: WebAssembly Text Format
- 9.2 Instruções numéricas
- 9.3 Instruções de controle
- 10 Estruturas binárias, WABT e Binaryen
- 10.1 WebAssembly Binary Toolkit
- 10.2 Estrutura binária do WebAssembly
- 10.3 Visualização de arquivos binários
- 10.4 Execução de binários usando o interpretador
- 10.5 Descompilação de binários
- 10.6 wasm2c: conversão de arquivos binários para C
- 10.7 Binaryen
- 10.8 Otimização de arquivos binários
- 10.9 wasm2js: conversão de arquivos binários para JavaScript
- 10.10 wasm-tools
- 11 WASI - WebAssembly System Interface
- 11.1 O que é o WASI?
- 11.2 Como a arquitetura do WASI funciona?
- 11.3 Como usar WebAssembly com WASI?
- 11.4 Wasmtime
- 11.5 WASI com Rust
- 11.6 Escrevendo em arquivo com WASI
- 11.7 WASI com WebAssembly Text Format
- 11.8 Usando pthreads com WASI
- 11.9 Conclusão
- 12 Referências bibliográficas
Dados do produto
- Número de páginas:
- 311
- ISBN:
- 978-85-5519-346-0
- Data publicação:
- 09/2023