WebAssembly - WASM

WebAssembly è anche chiamato wasm, che è un miglioramento di Javascript. È progettato per funzionare all'interno di browser proprio come javascript e anche con nodejs. Ti capita di ottenere l'output di wasm, quando viene compilato un linguaggio di alto livello come C, C ++, Rust.

Considera il seguente programma C:

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

Utilizza WasmExplorer, disponibile all'indirizzohttps://mbebenita.github.io/WasmExplorer/ per ottenere il codice compilato come mostrato di seguito -

Il formato di testo WebAssembly per il programma fattoriale è come indicato di seguito:

(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) 
   )
)

Utilizzando lo strumento Wat2Wasm, è possibile visualizzare il codice WASM, proprio come viene menzionato di seguito -

Gli sviluppatori non dovrebbero scrivere codice in wasm o imparare a codificarlo, poiché viene generato principalmente quando si compilano linguaggi di alto livello.

Stack Machine Model

In WASM, tutte le istruzioni vengono inserite nello stack. Gli argomenti vengono estratti e il risultato viene reinserito nello stack.

Considera il seguente formato di testo WebAssembly che aggiunge 2 numeri:

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

Il nome della funzione è $add, richiede 2 parametri $ a e $ b. Il risultato è un numero intero di tipo a 32 bit. Si accede alle variabili locali utilizzando get_local e l'operazione di aggiunta viene eseguita utilizzando i32.add.

La rappresentazione dello stack per aggiungere 2 numeri durante l'esecuzione sarà la seguente:

In step 1 - L'esecuzione dell'istruzione get_local $ a, i primi parametri, cioè $ a, vengono inseriti nello stack.

In step 2 - Durante l'esecuzione dell'istruzione get_local $ b, il secondo parametro, cioè $ b, viene inserito nello stack.

In step 3- L'esecuzione di i32.add farà apparire gli elementi dallo stack e riporterà il risultato nello stack. Il valore che rimane alla fine all'interno dello stack è il risultato della funzione $ add.