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.