9. O que é WebAssembly
Não, o Javascript não vai morrer
• Formato binário de código
• .wasm
• Existe um formato em texto .wat
• Código proximo ao Assembly
• Podemos comparar com Bytecodes
de outras VMs como a JVM
• Baixo nível
• Portável
• Rápido
• Menor uso de memória
10. Performance na Web
Muito tempo é usado no parse + compile
• WebAssembly
• Otimizado antes da execução
• Ao contrário de Javascript que otimiza a medida que é executado
Imagem do artigo - https://medium.com/trainingcenter/webassembly-a-jornada-o-que-%C3%A9-wasm-75e3f0f03124
11. Suporte ao WebAssembly
Os browsers abraçaram a especificação - 91.18% em Jul/2020
https://caniuse.com/#feat=wasm
13. WebAssembly por ai
Rode código feito em outras linguagens no Browser
• WASM por si não é uma linguagem
• É um target para outras linguagens
• Algumas linguagens que compilam para Wasm
• C/C++ ⭐ - Emscriptem
• Rust ⭐
• Assemblyscript ⭐ - Flavor de Typescript
• TinyGo - Flavor de Go
• Golang começou suporte também
• Pyodide - Python + Numpy stack
14. Coisas malucas feitas com WebAssembly
Tem uso em produção
• Figma
• Engine de manipulação de imagens
• www.figma.com/blog/webassembly-cut-figmas-load-time-by-3x/
• Autocad Web
• Engine de CAD portada de C++
• Demo no Google I/O 2018 - www.youtube.com/watch?v=D4fNcX0Q9gA
• Blazor - Framework Web .Net
• Vugu - Framework Frontend em Go
• Valerie - Framework Frontend em Rust
github.com/mbasso/awesome-wasm
16. WebAssembly everywhere
Outros casos de uso e também tem uso em produção
• Edge Impulse ⭐
• Roda modelos de ML em dispositivos IoT
• Fastly e Cloudflare
• Rodar código de forma segura em CDNs
• Blockchain/SmartContracts
• Projetos OSS
• Wasmer - Runtime WASM - Pode ser embutido em Go/Python/PHP/Ruby
• Wasmtime - Outro Runtime WASM Standalone
• Krustlet - WASM on Kubernetes
• Postgres-ext-wasm - github.com/wasmerio/postgres-ext-wasm
17. WebAssembly está crescendo
Muita coisa ainda em pesquisa
• WASI - WebAssembly System Interface
• Como trazer acesso a recursos como arquivos, rede, chamadas de
sistema em geral ?
• Como fazer isso mantendo a portabilidade e segurança ?
hacks.mozilla.org/2019/03/standardizing-wasi-a-webassembly-system-interface/
20. 20
Por que está na moda hoje ?
Sensores, internet e processamento mais baratos
21. Dispositivos IoT
Bastante limitados em memoria, cpu e uso de bateria
• Apesar de contar, na maioria das vezes não estamos falando disso
• Celulares
• Roteadores/Gateways
• Raspberry Pi’s e afins
22. Dispositivos IoT
Bastante limitados em memoria, cpu e uso de bateria
• Dispositivos bem menores e mais baratos
• Lampadas, Sensores de porta, Fechaduras Smart, Termostatos
• Rastreadores em geral - GPS, rede celular, LoRa, etc
• Assistentes pessoais - Alexa/Google Assistant
• Na maioria das vezes, não tem sistema operacional nenhum
23. Dispositivos IoT
Bastante limitados em memoria, cpu e uso de bateria
CPU Memory Flash
Connectivi
ty
GPIO Arch
Power
Consumption
Price
ATMega
328p
16 Mhz 2 Kb 32 Kb None 24 AVR RISC 8 bit 40mA $1.7
STM32
“Blue Pill”
72 Mhz 20 Kb 64 kb None 32 ARM 32 bit 8mA $2.3
ESP 32
160 Mhz
Dual Core
512 Kb
Up to
16MiB
Wifi/Ble 36 XTensa 32 bit 200mA $3
24. Dispositivos IoT
Bastante limitados em memoria, cpu e uso de bateria
• Tem que se levar muito a serio questões de performance
• Uso de memoria e CPU
• Também influência em uso de bateria
• Segurança - o “S” de IoT
• Ainda assim conseguir evoluir o projeto
• Over the Air updates - OTA
• Maior parte do desenvolvimento embarcado é em C/C++
25. 25
Mas peraí, não é só em C/C++ né ?
Existem varias outras formas por ai
• MicroPython
• TinyGo
• Lua
• Várias Engine Javascript
• Duktape
• Jerryscript
• MongooseOS
• Mais usados em prototipos
28. WebAssembly + IoT
Compartilham muitos principios
• Código otimizado
• Menor uso de memoria
• Rapidez e Performance
• Sandbox e segurança
29. E se pudemos usar qualquer linguagem
e ainda ter boa performance ?
30. Esforços para trazer WebAssembly a devices embarcados
Em 2017 isso começou, mas era bem ruim
• Em 2017 o WebAssembly estava já sendo bem suportado na web
• Hoje temos vários runtimes Wasm para embarcados
• Wasm3 - Blynk
• Wasm Micro Runtime - Intel/Redhat/Fastly/Mozilla - Bytecode
Alliance
• Zephyr RTOS - Linux Foundation
• Mas ainda não resolve 100% a questão da portabilidade
• Talvez alguma variante do WASI venha a resolver isso
31. WASI for IoT ?
WASI define coisas como acesso a arquivos, rede e syscalls
• WASI é o bastante para o mundo embarcado ?
• Requisitos mais específicos
• Acesso a pinos
• Interação com sensores
• “Network” - Bluetooth/WiFi/Zigbee/LoRa
• Isso é um grande desafio, mesmo usando a mesma stack, pode
ser completamente diferente dependendo do hardware
33. Rodando Wasm como linguagem principal
Programar em qualquer linguagem para ambiente embarcado
• Aplicação embarcado funciona quase que como um SO primitivo
• Inicia o código em Wasm
• Provê os “drivers” para acesso a rede e outros recursos
• Provê interface para OTA do código em Wasm
34. Rodando Wasm como linguagem principal
Programar em qualquer linguagem para ambiente embarcado
• O que foi feita na demo
• ESP32 como dispositivo embarcado
• TinyGo/Rust/AssemblyScript compilado para Wasm
• Código Wasm fazem acesso ao hardware e rede
• Conecta na rede Wifi
• Pisca Led
• https://github.com/alvarowolfx/wasm-arduino-wifi
40. Usando Wasm como um motor de regras
Reaproveitar código base do embarcado
• Embarcado ainda é programado nativamente
• Provê uma interface que permite customização do seu funcionamento
• Consegue criar regras mais complexas do que apenas mudar
parâmetros ou passar novas configurações
• Imagine um usuário mais avançado podem descrever algumas regras
em código para atualizar o device, sem quebrar o código principal
• O mesmo código pode rodar no servidor usando runtimes Wasm
para server side
41. Usando Wasm como um motor de regras
Reaproveitar código base do embarcado
• O que foi feita na demo
• ESP32 escaneia dispositivos bluetooth
• A regra para filtrar os devices é definida via Wasm
• Embarcado busca nova versão do Wasm a cada boot para se
atualizar e pegar regras atuais
• https://github.com/alvarowolfx/wasm-ble-edge-filter
42. Regra de negocio em AssemblyScript
Um exemplo de como poderia ser customizado