Notas sobre o uso da comunidade Wabt – Dev
O WABT é um kit de ferramentas binárias da WebAssembly que fornece ferramentas de compilação, análise, depuração e validação para código relacionado ao WASM. Este artigo apresenta brevemente o uso de comandos comuns. Compilar o código WAT Implementando a sequência de Fibonacci em WAT: ;; fib.wat (módulo (importação “enin” “log” (func $ log (param i32))) ;; aloce uma página de memória (memória (exportar “memória”) 1); (i32) (Func $ alocada (param $ tamanho i32) (resultado i32) (local de início i32) (Local.Set $ START (Global.get $ HEAP_PTR) (Global.Set $ HEAP_PTR (I32.Add (Global.get $ HEAP_PTR) (LOCALIB $ TIME) (Local.get; Length; (i32.mul (local.get $ n) (i32.Const 4)))); (i32.gt_s (local.get $ n) (i32.Const 1)) (então (i32.Store (i32.add (local.get $ arr_ptr) (i32.Const 4) (i32.Connst 1))); (i32.Const 2)) (loop $ loop ;; calcule o próximo número de fibonacci (local.Set $ Next (i32.add (local.get $ prev) (local.get $ curr)) (local.set $ prev (Local.get $ Curr) (Local.Set $ curr (local.get $ a seguir); (Local.get $ i) (I32.ConSt 4))) (Local.get $ a seguir); Modo de tela cheia compila o código usando o WABT: wat2wasm ./fib.wat -o ./fib.wasm Digite o modo de tela cheia do modo de tela cheia resultante de arquivos WASM: ├── FIB.WASM ├── FIB.WAT └─ Maior.Ts. WebAssembly.InstantiAtEstreaming (Fetch (fiburl), {Env: {Log: (valor: string | número) => console.log (value)}}). Então (res => {//) exportações para obter a função FIB e a memória const {fib,} =} = nammance.exports para obter a função e a memória {fib,} = namm.inStance.exports, assim como a função fib (fib, fib,} = namm.inStance.exk. WebAssembly.Memory}; como a ferramenta de construção, que suporta a importação de qualquer tipo de recurso como URL. Aqui, convertemos o WASM em um URL de recurso e carregamos -o usando webassembly.instantiAtEstreaming e buscar. Observe que o Vite também suporta a inicialização automática do WASM usando o? INITSUFFix (consulte a documentação do Vite para obter detalhes). Utilizamos a fibfunção para calcular uma sequência de Fibonacci do comprimento 10, com saída: os resultados correspondem às expectativas. Comparando o código WAT e os tamanhos dos arquivos WASM: Após a compilação, o arquivo WASM é uma ordem de magnitude menor que a fonte. Essa eficiência vem do formato compacto da WASM e da compressão LEB128. Analisando WASM O comando wasm-objdump é semelhante ao OS Objdump, usado para analisar as informações do arquivo WASM. Caso de uso prático: um desenvolvedor recebe um módulo WASM e deseja identificar rapidamente funções exportadas, suas contagens/tipos de parâmetros e retornar tipos/comprimentos de valor. Usando o FIB.WASM anterior como exemplo: WASM -OBJDUMP ./FIB.WASM -J EXPORT -X Digite o modo de tela cheia Saída da tela cheia Saída: FIB.WASM: Formato de arquivo WASM 0x1 Detalhes: Exportar[2]: – Memória[0] -> “Memória” – func[2] -> “fib” Digite o modo de saída de tela cheia de tela cheia, mostra o FIB.WASM possui duas exportações: uma memória e uma função FIB (tipo 2). Em seguida, examine as assinaturas da função: wasm -objdump ./fib.wasm -j function -x insira o modo de tela fullcreen Sair[2]: – func[1] sig = 1 – func[2] SIG = 1 Digite o modo de tela cheia Função do modo de tela cheia 2 Usa o índice Tipo 1 declarado na seção Tipo. Exportar a seção Tipo: WASM -OBJDUMP ./FIB.WASM -J TIPO -X ENTER MODO DE VELADA FELIA MODO DE VAI MODO DE ESCRANÇA FULHA INFORMAÇÕES: FIB.WASM: Formato de arquivo WASM 0x1 Detalhes da seção: Tipo[2]: – tipo[0] (i32) -> NIL – Tipo[1] (i32) -> i32 Digite o modo de saída de tela cheia de tela cheia, agora obtivemos informações completas sobre as exportações do FIB.WASM: Função exportada de memória exportada FIB com um parâmetro i32 e um valor de retorno i32 WASMMM -OBJDUMP -X pode ser usado sozinho para produzir todas as informações da seção. Para arquivos grandes, é melhor em produzir seções individualmente para uma análise mais fácil. Código de formatação O comando wat-desugar formato o código WAT existente para estar em conformidade com determinadas especificações. Por exemplo, a fonte original do FIB.WAT não seguiu estritamente o padrão “Push OperAnds -> Executar instruções”, geralmente escrevendo operando após as instruções. Embora válido, isso não segue convenções de máquinas de pilha. Wat-Desugar ajuda a padronizar esse código. Aqui está a função formatada $ alocada: (func $ aloce (param $ tamanho i32) (resultado i32) (local $ start i32) global.get $ heap_ptr local.Set $ Start Global.get $ heap_ptr Local.Get $ tamanho i32.add. As convenções de chamadas baseadas em pilha, embora menos legíveis. A diferença mais notável é a operação i32.Add: os operandos colocados originais após a instrução, enquanto a versão padronizada empurra operando para a pilha antes de chamar a instrução Adicionar. O nome “Desugar” contrasta com “açúcar sintático”. Sintaxe como (i32.add (local.get 0) (local.get 1)) é açúcar sintático – operandos não são empurrados para a pilha antes da chamada de instruções (mais como uma máquina de registro). Os compiladores aceitam essa sintaxe não-máquina porque é mais intuitiva. “Desugar” é como a frase cantonesa “走糖” (menos açúcar), removendo o açúcar sintático para revelar o código mais fundamental que segue estritamente o padrão de operando-operando-then-excedentes. Desmontagem O Wabt fornece três comandos de desmontagem: WASM2WAT: Desmonte o código WAT WAT WASM2C: Desmonte o WASM para C para C e arquivos de cabeçalho WASM-Decompil: Desmonte o WASM para o pseudocódigo de estilo C legível em prática. Use WASM-Decompile para analisar a implementação da funcionalidade. Se forem necessárias modificações menores do módulo, use o WASM2WAT para obter um arquivo WAT, fazer alterações e recompilar ao WASM.
Fonte