WebAssembly - WASM

WebAssembly est également appelé wasm, ce qui est une amélioration de Javascript. Il est conçu pour fonctionner à l'intérieur des navigateurs, tout comme javascript et aussi avec nodejs. Il se trouve que vous obtenez une sortie wasm, quand un langage de haut niveau comme C, C ++, Rust est compilé.

Considérez le programme C suivant -

int factorial(int n) {
   if (n == 0) 
      return 1; 
   else 
      return n * factorial(n-1); 
}

Utilisez WasmExplorer, disponible surhttps://mbebenita.github.io/WasmExplorer/ pour obtenir le code compilé comme indiqué ci-dessous -

Le format de texte WebAssembly pour le programme factoriel est comme indiqué ci-dessous -

(module 
   (table 0 anyfunc) 
   (memory $0 1) 
   (export "memory" (memory $0)) (export "factorial" (func $factorial)) 
   (func $factorial (; 0 ;) (param $0 i32) (result i32)
      (local $1 i32) 
      (local $2 i32) 
      (block $label$0 
         (br_if $label$0 
            (i32.eqz 
               (get_local $0) 
            )
         )
         (set_local $2 
            (i32.const 1) 
         ) 
         (loop $label$1 
            (set_local $2 
               (i32.mul 
                  (get_local $0) (get_local $2) 
               ) 
            ) 
            (set_local $0 
               (tee_local $1        (i32.add 
                  (get_local $0) (i32.const -1) 
               ) 
               ) 
            ) 
            (br_if $label$1      (get_local $1) 
            ) 
         ) 
         (return 
            (get_local $2)
         ) 
      ) 
      (i32.const 1) 
   )
)

En utilisant l'outil Wat2Wasm, vous pouvez afficher le code WASM, tout comme il est mentionné ci-dessous -

Les développeurs ne sont pas censés écrire du code dans wasm ou apprendre à y coder, car il est principalement généré lorsque vous compilez des langages de haut niveau.

Modèle de machine d'empilage

Dans WASM, toutes les instructions sont transmises à la pile. Les arguments sont sautés et le résultat est repoussé dans la pile.

Considérez le format de texte WebAssembly suivant qui ajoute 2 nombres -

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

Le nom de la fonction est $add, il prend 2 paramètres $ a et $ b. Le résultat est un entier de type 32 bits. Les variables locales sont accessibles à l'aide de get_local et l'opération d'ajout est effectuée à l'aide de i32.add.

La représentation de la pile pour ajouter 2 nombres pendant l'exécution sera la suivante -

Dans step 1 - L'exécution de l'instruction get_local $ a, les premiers paramètres ie, $ a est poussé sur la pile.

Dans step 2 - Lors de l'exécution de l'instruction get_local $ b, le second paramètre c'est-à-dire $ b est poussé sur la pile.

Dans step 3- L'exécution de i32.add fera sortir les éléments de la pile et repoussera le résultat dans la pile. La valeur qui reste à la fin à l'intérieur de la pile est le résultat de la fonction $ add.