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.