WebAssembly - Format de texte

WebAssembly a le code dans un format binaire appelé WASM. Vous pouvez également obtenir le format de texte dans WebAssembly et il est appelé WAT (format de texte WebAssembly). En tant que développeur, vous n'êtes pas censé écrire du code dans WebAssembly, à la place, vous devez compiler des langages de haut niveau comme C, C ++ et Rust en WebAssembly.

Code WAT

Écrivons le code WAT pas à pas.

Step 1 - Le point de départ d'un WAT est de déclarer le module.

(module)

Step 2 - Ajoutons-y maintenant quelques fonctionnalités sous forme de fonction.

La fonction est déclarée comme indiqué ci-dessous -

(func <parameters/result> <local variables> <function body>)

La fonction commence par le mot-clé func qui est suivi de paramètres ou de résultat.

Paramètres / Résultat

Les paramètres et la valeur de retour en conséquence.

Les paramètres peuvent avoir le type suivant pris en charge par wasm -

  • i32: entier 32 bits
  • i64: entier 64 bits
  • f32: flottant 32 bits
  • f64: flottant 64 bits

Les paramètres des fonctions sont écrits comme indiqué ci-dessous -

  • (paramètre i32)
  • (paramètre i64)
  • (paramètre f32)
  • (paramètre f64)

Le résultat sera écrit comme suit -

  • (résultat i32)
  • (résultat i64)
  • (résultat f32)
  • (résultat f64)

La fonction avec les paramètres et la valeur de retour sera définie comme suit -

(func (param i32) (param i32) (result i64) <function body>)

Variables locales

Les variables locales sont celles dont vous avez besoin dans votre fonction. Une valeur locale de la fonction sera définie comme suit -

(func (param i32) (param i32) (local i32) (result i64) <function body>)

Corps de fonction

Le corps de la fonction est la logique à exécuter. Le programme final ressemblera à ceci -

(module (func (param i32) (param i32) (local i32) (result i64) <function body>) )

Step 3 - Pour lire et définir les paramètres et les variables locales.

Pour lire les paramètres et les variables locales, utilisez get_local et set_local commander.

Example

(module 
   (func (param i32) (param i32) (local i32) (result i64) get_local 0 
      get_local 1 
      get_local 2 
   ) 
)

Selon la signature de la fonction,

  • get_local 0 donnera le param i32

  • get_local 1 donnera le paramètre suivant param i32

  • get_local 2 va donner local value i32

Au lieu de faire référence aux paramètres et aux locals en utilisant des valeurs numériques telles que 0,1,2, vous pouvez également utiliser le nom avant les paramètres, en préfixant le nom avec un signe dollar.

L'exemple suivant montre comment utiliser le nom avec des paramètres et des locals.

Example

(module 
   (func 
      (param $a i32) 
      (param $b i32) 
      (local $c i32) 
      (result i64) get_local $a get_local $b get_local $c 
   ) 
)

Step 4 - Instruction dans le corps de la fonction et l'exécution.

L'exécution dans wasm suit la stratégie de pile. Les instructions exécutées sont envoyées une à une sur la pile. Par exemple, l'instruction get_local $ a poussera la valeur, elle lit sur la pile.

L'instruction comme i32.add qui ajoutera le pop les éléments de la pile.

(func (param $a i32) (param $b i32) 
   get_local $a 
   get_local $b 
   i32.add
)

L'instruction pour i32.add est ($a+$b). La valeur finale de i32.add, sera poussée sur la pile et qui sera affectée au résultat.

Si la signature de la fonction a un résultat déclaré, il doit y avoir une valeur dans la pile à la fin de l'exécution. S'il n'y a pas de paramètre de résultat, la pile doit être vide à la fin.

Ainsi, le code final avec le corps de la fonction sera le suivant -

(module 
   (func (param $a i32) (param $b i32) (result i32) 
      get_local $a
      get_local $b 
      i32.add
   )
)

Step 5 - Appel à la fonction.

Le code final avec le corps de la fonction est comme indiqué à l'étape 4. Maintenant, pour appeler la fonction, nous devons l'exporter.

Pour exporter la fonction, cela peut être fait avec des valeurs d'index comme 0,1, mais nous pouvons aussi donner des noms. Le nom sera préfixé par $ et il sera ajouté après le mot-clé func.

Example

(module 
   (func $add (param $a i32) (param $b i32) (result i32) 
      get_local $a 
      get_local $b i32.add
   ) 
)

La fonction $ add doit être exportée, en utilisant le mot-clé d'exportation comme indiqué ci-dessous -

(module 
   (func $add 
      (param $a i32) 
      (param $b i32) 
      (result i32) 
      get_local $a get_local $b i32.add
   ) 
   (export "add" (func $add))
)

Pour tester le code ci-dessus dans le navigateur, vous devrez le convertir en forme binaire (.wasm). Reportez-vous au chapitre suivant qui montre comment convertir.WAT to .WASM.