WebAssembly - Programmstruktur
WebAssembly, auch WASM genannt, ist Low-Level-Code im Binärformat, der entwickelt wurde, um in Browsern auf die effizienteste Weise ausgeführt zu werden. Der WebAssembly-Code ist mit folgenden Konzepten strukturiert:
- Values
- Types
- Instructions
Lassen Sie uns sie jetzt im Detail lernen.
Werte
Werte in WebAssembly sollen komplexe Daten wie Text, Zeichenfolgen und Vektoren speichern. WebAssembly unterstützt Folgendes:
- Bytes
- Integers
- Gleitkomma
- Names
Bytes
Bytes ist die einfachste Form von Werten, die in WebAssembly unterstützt werden. Der Wert ist hexadezimal.
For exampleAls b dargestellte Bytes können auch natürliche Zahlen n annehmen, wobei n <256 ist.
byte ::= 0x00| .... |0xFF
Ganzzahlen
In WebAssembly werden folgende Ganzzahlen unterstützt:
- i32: 32-Bit-Ganzzahl
- i64: 64-Bit-Ganzzahl
Gleitkomma
In WebAssembly werden folgende Gleitkommazahlen unterstützt:
- f32: 32-Bit-Gleitkomma
- f64: 64-Bit-Gleitkomma
Namen
Namen sind Zeichenfolgen mit durch Unicode definierten Skalarwerten, die unter dem Link verfügbar sind http://www.unicode.org/versions/Unicode12.1.0/ hiermit gegeben.
Typen
Die Entitäten in WebAssembly werden als Typen klassifiziert. Die unterstützten Typen sind wie folgt:
- Werttypen
- Ergebnistypen
- Funktionstypen
- Limits
- Speichertypen
- Tabellentypen
- Globale Typen
- Externe Typen
Lassen Sie uns sie einzeln studieren.
Werttypen
Der von WebAssembly unterstützte Wertetyp lautet wie folgt:
- i32: 32-Bit-Ganzzahl
- i64: 64-Bit-Ganzzahl
- f32: 32-Bit-Gleitkomma
- f64: 64-Bit-Gleitkomma
valtype ::= i32|i64|f32|f64
Ergebnistypen
Die in Klammern geschriebenen Werte werden ausgeführt und in Ergebnistypen gespeichert. Der Ergebnistyp ist die Ausgabe der Ausführung eines aus Werten bestehenden Codeblocks.
resulttype::=[valtype?]
Funktionstypen
Ein Funktionstyp nimmt einen Vektor von Parametern auf und gibt einen Vektor von Ergebnissen zurück.
functype::=[vec(valtype)]--> [vec(valtype)]
Grenzen
Grenzwerte sind der Speicherbereich, der mit Speicher- und Tabellentypen verknüpft ist.
limits ::= {min u32, max u32}
Speichertypen
Speichertypen befassen sich mit linearen Speichern und dem Größenbereich.
memtype ::= limits
Tabellentypen
Tabellentypen werden nach dem ihr zugewiesenen Elementtyp klassifiziert.
tabletype ::= limits elemtype
elemtype ::= funcref
Der Tabellentyp hängt von der Grenze für die ihm zugewiesene minimale und maximale Größe ab.
Globale Typen
Globaler Typ enthält die globalen Variablen, die den Wert haben, der sich ändern oder gleich bleiben kann.
globaltype ::= mut valtype
mut ::= const|var
Externe Typen
Externe Typen befassen sich mit Importen und externen Werten.
externtype ::= func functype | table tabletype | mem memtype | global globaltype
Anleitung
WebAssembly-Code ist eine Folge von Anweisungen, die einem Stapelmaschinenmodell folgen. Da WebAssembly einem Stapelmaschinenmodell folgt, werden die Anweisungen auf den Stapel übertragen.
Die Argumentwerte für eine Funktion werden beispielsweise vom Stapel entfernt und das Ergebnis wird auf den Stapel zurückgeschoben. Am Ende gibt es nur einen Wert im Stapel und das ist das Ergebnis.
Einige der häufig verwendeten Anweisungen lauten wie folgt:
- Numerische Anweisungen
- Variable Anweisungen
Numerische Anweisungen
Numerische Anweisungen sind Operationen, die mit numerischen Werten ausgeführt werden.
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
Variable Anweisungen
Bei Variablenanweisungen geht es um den Zugriff auf lokale und globale Variablen.
For example
So greifen Sie auf lokale Variablen zu -
get_local $a
get_local $b
Zu set lokale Variablen -
set_local $a
set_local $b
Zu access globale Variablen -
get_global $a
get_global $b
Zu set globale Variablen -
set_global $a
set_global $b