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 example

Als 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 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

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