WebAssembly - Struktura programu
WebAssembly, zwany również WASM, to niskopoziomowy kod binarny opracowany do wykonywania w przeglądarkach w najbardziej efektywny sposób. Kod WebAssembly jest zbudowany z następujących pojęć -
- Values
- Types
- Instructions
Poznajmy je teraz szczegółowo.
Wartości
Wartości w WebAssembly służą do przechowywania złożonych danych, takich jak tekst, ciągi znaków i wektory. WebAssembly obsługuje następujące -
- Bytes
- Integers
- Punkt zmiennoprzecinkowy
- Names
Bajty
Bajty to najprostsza forma wartości obsługiwana w WebAssembly. Wartość jest w formacie szesnastkowym.
For exampleBajty reprezentowane jako b mogą również przyjmować liczby naturalne n, gdzie n <256.
byte ::= 0x00| .... |0xFF
Liczby całkowite
W WebAssembly obsługiwane liczby całkowite są takie, jak podano poniżej -
- i32: 32-bitowa liczba całkowita
- i64: 64-bitowa liczba całkowita
Punkt zmiennoprzecinkowy
W programie WebAssembly obsługiwane liczby zmiennoprzecinkowe są następujące -
- f32: 32-bitowy zmiennoprzecinkowy
- f64: 64-bitowy zmiennoprzecinkowy
Nazwy
Nazwy to sekwencje znaków z wartościami skalarnymi zdefiniowanymi przez Unicode, który jest dostępny pod linkiem http://www.unicode.org/versions/Unicode12.1.0/ podane w niniejszym dokumencie.
Rodzaje
Jednostki w WebAssembly są klasyfikowane jako typy. Obsługiwane typy są takie, jak podano poniżej -
- Typy wartości
- Typy wyników
- Typy funkcji
- Limits
- Rodzaje pamięci
- Typy tabel
- Typy globalne
- Typy zewnętrzne
Przeanalizujmy je jeden po drugim.
Typy wartości
Typ wartości obsługiwany przez WebAssembly jest taki, jak wspomniano poniżej -
- i32: 32-bitowa liczba całkowita
- i64: 64-bitowa liczba całkowita
- f32: 32-bitowy zmiennoprzecinkowy
- f64: 64-bitowy zmiennoprzecinkowy
valtype ::= i32|i64|f32|f64
Typy wyników
Wartości zapisane w nawiasach są wykonywane i przechowywane w typach wyników. Typ wyniku to wynik wykonania bloku kodu składającego się z wartości.
resulttype::=[valtype?]
Typy funkcji
Typ funkcji przyjmuje wektor parametrów i zwraca wektor wyników.
functype::=[vec(valtype)]--> [vec(valtype)]
Limity
Limity to zakres pamięci związany z pamięcią i typami tabel.
limits ::= {min u32, max u32}
Rodzaje pamięci
Typy pamięci dotyczą pamięci liniowych i zakresu rozmiarów.
memtype ::= limits
Typy tabel
Typy tabel są klasyfikowane według przypisanego typu elementu.
tabletype ::= limits elemtype
elemtype ::= funcref
Typ tabeli zależy od limitu minimalnego i maksymalnego rozmiaru przypisanego do niej.
Typy globalne
Typ globalny zawiera zmienne globalne, które mają wartość, która może się zmienić lub pozostać taka sama.
globaltype ::= mut valtype
mut ::= const|var
Typy zewnętrzne
Typy zewnętrzne dotyczą importu i wartości zewnętrznych.
externtype ::= func functype | table tabletype | mem memtype | global globaltype
Instrukcje
Kod WebAssembly to sekwencja instrukcji zgodnych z modelem maszyny stosowej. Ponieważ WebAssembly jest zgodna z modelem maszyny stosu, instrukcje są umieszczane na stosie.
Na przykład wartości argumentów funkcji są zdejmowane ze stosu, a wynik jest odkładany z powrotem na stos. Ostatecznie na stosie będzie tylko jedna wartość i to jest wynik.
Niektóre z powszechnie używanych instrukcji są następujące -
- Instrukcje numeryczne
- Zmienne instrukcje
Instrukcje numeryczne
Instrukcje numeryczne to operacje wykonywane na wartości liczbowej.
For examplenn, mm ::= 32|64
ibinop ::= add|sub|mul|div_sx|rem_sx|and|or|xor
irelop ::= eq | ne | lt_sx | gt_sx | le_sx | ge_sx
frelop ::= eq | ne | lt | gt | le | ge
Zmienne instrukcje
Instrukcje dotyczące zmiennych dotyczą dostępu do zmiennych lokalnych i globalnych.
For example
Aby uzyskać dostęp do zmiennych lokalnych -
get_local $a
get_local $b
Do set zmienne lokalne -
set_local $a
set_local $b
Do access zmienne globalne -
get_global $a
get_global $b
Do set zmienne globalne -
set_global $a
set_global $b