WebAssembly - Structure du programme

WebAssembly, également appelé WASM, est un code de bas niveau au format binaire développé pour être exécuté dans les navigateurs de la manière la plus efficace. Le code WebAssembly est structuré avec les concepts suivants -

  • Values
  • Types
  • Instructions

Apprenons-les en détail maintenant.

Valeurs

Les valeurs de WebAssembly sont destinées à stocker des données complexes telles que du texte, des chaînes et des vecteurs. WebAssembly prend en charge les éléments suivants -

  • Bytes
  • Integers
  • Point flottant
  • Names

Octets

Bytes est la forme la plus simple de valeurs prise en charge dans WebAssembly. La valeur est au format hexadécimal.

For example

Les octets représentés par b peuvent également prendre des nombres naturels n, où n <256.

byte ::= 0x00| .... |0xFF

Entiers

Dans WebAssembly, les entiers pris en charge sont indiqués ci-dessous -

  • i32: entier 32 bits
  • i64: entier 64 bits

Point flottant

Dans WebAssembly, les nombres à virgule flottante pris en charge sont les suivants:

  • f32: virgule flottante 32 bits
  • f64: virgule flottante 64 bits

Noms

Les noms sont des séquences de caractères, avec des valeurs scalaires définies par Unicode, qui est disponible sur le lien http://www.unicode.org/versions/Unicode12.1.0/ donné ci-joint.

Les types

Les entités de WebAssembly sont classées en tant que types. Les types pris en charge sont comme indiqué ci-dessous -

  • Types de valeur
  • Types de résultats
  • Types de fonction
  • Limits
  • Types de mémoire
  • Types de table
  • Types globaux
  • Types externes

Étudions-les un par un.

Types de valeur

Le type de valeurs pris en charge par WebAssembly est indiqué ci-dessous -

  • i32: entier 32 bits
  • i64: entier 64 bits
  • f32: virgule flottante 32 bits
  • f64: virgule flottante 64 bits
valtype ::= i32|i64|f32|f64

Types de résultats

Les valeurs écrites entre crochets sont exécutées et stockées dans les types de résultats. Le type de résultat est la sortie de l'exécution d'un bloc de code composé de valeurs.

resulttype::=[valtype?]

Types de fonction

Un type de fonction prendra en vecteur de paramètres retourne un vecteur de résultats.

functype::=[vec(valtype)]--> [vec(valtype)]

Limites

Les limites sont la plage de stockage liée aux types de mémoire et de table.

limits ::= {min u32, max u32}

Types de mémoire

Les types de mémoire traitent des mémoires linéaires et de la plage de tailles.

memtype ::= limits

Types de table

Les types de table sont classés en fonction du type d'élément qui leur est attribué.

tabletype ::= limits elemtype
elemtype ::= funcref

Le type de table dépend de la limite de la taille minimale et maximale qui lui est attribuée.

Types globaux

Le type global contient les variables globales qui ont la valeur, qui peuvent changer ou rester les mêmes.

globaltype ::= mut valtype
mut ::= const|var

Types externes

Les types externes traitent des importations et des valeurs externes.

externtype ::= func functype | table tabletype | mem memtype | global globaltype

Instructions

Le code WebAssembly est une séquence d'instructions qui suit un modèle de machine à pile. Comme WebAssembly suit un modèle de machine à pile, les instructions sont poussées sur la pile.

Les valeurs d'argument d'une fonction, par exemple, sont extraites de la pile et le résultat est repoussé sur la pile. En fin de compte, il n'y aura qu'une seule valeur dans la pile et c'est le résultat.

Certaines des instructions couramment utilisées sont les suivantes:

  • Instructions numériques
  • Instructions variables

Instructions numériques

Les instructions numériques sont des opérations effectuées sur une valeur numérique.

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

Instructions variables

Les instructions relatives aux variables concernent l'accès aux variables locales et globales.

For example

Pour accéder aux variables locales -

get_local $a
get_local $b

À set variables locales -

set_local $a
set_local $b

À access variables globales -

get_global $a
get_global $b

À set variables globales -

set_global $a
set_global $b