WebAssembly - WASM

WebAssembly jest również nazywana wasm, co jest ulepszeniem Javascript. Został zaprojektowany do działania w przeglądarkach, tak jak javascript, a także z nodejs. Zdarza się, że otrzymujesz wynik WASM, gdy kompilowany jest dowolny język wysokiego poziomu, taki jak C, C ++, Rust.

Rozważmy następujący program w C -

int factorial(int n) {
   if (n == 0) 
      return 1; 
   else 
      return n * factorial(n-1); 
}

Skorzystaj z programu WasmExplorer, który jest dostępny pod adresemhttps://mbebenita.github.io/WasmExplorer/ aby uzyskać skompilowany kod, jak pokazano poniżej -

Format tekstowy WebAssembly dla programu silnia jest taki, jak podano poniżej -

(module 
   (table 0 anyfunc) 
   (memory $0 1) 
   (export "memory" (memory $0)) (export "factorial" (func $factorial)) 
   (func $factorial (; 0 ;) (param $0 i32) (result i32)
      (local $1 i32) 
      (local $2 i32) 
      (block $label$0 
         (br_if $label$0 
            (i32.eqz 
               (get_local $0) 
            )
         )
         (set_local $2 
            (i32.const 1) 
         ) 
         (loop $label$1 
            (set_local $2 
               (i32.mul 
                  (get_local $0) (get_local $2) 
               ) 
            ) 
            (set_local $0 
               (tee_local $1        (i32.add 
                  (get_local $0) (i32.const -1) 
               ) 
               ) 
            ) 
            (br_if $label$1      (get_local $1) 
            ) 
         ) 
         (return 
            (get_local $2)
         ) 
      ) 
      (i32.const 1) 
   )
)

Korzystając z narzędzia Wat2Wasm, możesz wyświetlić kod WASM, tak jak wspomniano poniżej -

Programiści nie powinni pisać kodu w wasm ani uczyć się go kodować, ponieważ jest on generowany głównie podczas kompilacji języków wysokiego poziomu.

Model maszyny stosowej

W WASM wszystkie instrukcje są umieszczane na stosie. Argumenty są usuwane, a wynik jest odkładany z powrotem na stos.

Rozważmy następujący format tekstowy WebAssembly, który dodaje 2 liczby -

(module
   (func $add (param $a i32) (param $b i32) (result i32) 
      get_local $a 
      get_local $b 
      i32.add
   )
   (export "add" (func $add))
)

Nazwa funkcji to $addprzyjmuje 2 parametry $ a i $ b. Wynikiem jest 32-bitowa liczba całkowita typu. Dostęp do zmiennych lokalnych uzyskuje się za pomocą funkcji get_local, a operacja dodawania jest wykonywana za pomocą i32.add.

Reprezentacja stosu do dodania 2 liczb podczas wykonywania będzie następująca -

W step 1 - Wykonanie instrukcji get_local $ a, pierwsze parametry, tj. $ A, są umieszczane na stosie.

W step 2 - Podczas wykonywania instrukcji get_local $ b, drugi parametr, tj. $ B, jest umieszczany na stosie.

W step 3- Wykonanie i32.add zdejmie elementy ze stosu i przeniesie wynik z powrotem na stos. Wartość, która pozostaje na końcu wewnątrz stosu, jest wynikiem działania funkcji $ add.