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 example

Bajty 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 example
nn, 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