Aller au contenu principal

WASM

#WebAssembly

WebAssembly (WASM) est un format binaire portable conçu pour être exécuté dans les navigateurs web. Il permet d'exécuter du code à des vitesses proches du natif, tout en restant sécurisé et sandboxé.

#Format binaire portable

WASM est conçu pour être un format de compilation cible pour des langages comme C, C++, Rust, etc. Il est indépendant de la plateforme et peut être exécuté dans n'importe quel navigateur moderne.

#Exemple de module WASM : Fibonacci

Voici un exemple de module WASM qui calcule le n-ième nombre de la suite de Fibonacci.

#Code source (WAT - WebAssembly Text)

watwat
1(module2  (func $fib (param $n i32) (result i32)3    (if (i32.lt_s (local.get $n) (i32.const 2))4      (then5        (local.get $n)6      )7      (else8        (i32.add9          (call $fib (i32.sub (local.get $n) (i32.const 1)))10          (call $fib (i32.sub (local.get $n) (i32.const 2)))11        )12      )13    )14  )

#Explication

  • La fonction $fib prend un paramètre n de type i32 (entier 32 bits) et retourne un i32.
  • Si n est inférieur à 2, elle retourne n directement.
  • Sinon, elle fait un appel récursif à $fib(n-1) et $fib(n-2) et retourne leur somme.

#Exécution dans le navigateur

Le module WASM est compilé et instancié dans le navigateur. Une fois chargé, ses fonctions exportées peuvent être appelées depuis JavaScript.

#Exemple JavaScript

javascriptjavascript
1// Charger et instancier le module WASM2WebAssembly.instantiateStreaming(fetch('fib.wasm'))3  .then(result => {4    const fib = result.instance.exports.fib;5    console.log(fib(10)); // Affiche 556  });

#Playground interactif

Exécute un module WASM (base64) qui exporte f().

Ce playground exécute un module WASM qui renvoie 42. Vous pouvez modifier le code WAT et voir le résultat en temps réel.

#Avantages de WebAssembly

  • Performance : Exécution à des vitesses proches du natif.
  • Sécurité : Exécution sandboxée dans le navigateur.
  • Portabilité : Fonctionne dans tous les navigateurs modernes.
  • Interopérabilité : Peut interagir avec JavaScript et le DOM.

#Limitations

  • Complexité : Écrire directement en WAT est complexe. Les compilateurs sont généralement utilisés.
  • Débogage : Le débogage de WASM peut être plus difficile que le JavaScript.
  • Taille : Les modules WASM peuvent être volumineux.

#Exercice : Module WASM pour le carré d'un nombre

Créez un module WASM qui exporte une fonction square(x) qui retourne le carré de x.

#Instructions

  1. Écrivez le code WAT pour une fonction square qui prend un paramètre i32 et retourne son carré.
  2. Utilisez l'instruction i32.mul pour effectuer la multiplication.
  3. Exportez la fonction pour qu'elle puisse être appelée depuis JavaScript.

#Exemple de code WAT

watwat
1(module2  (func $square (param $x i32) (result i32)3    local.get $x4    local.get $x5    i32.mul)6  (export "square" (func $square))7)

#Compilation et exécution

Compilez ce code WAT en WASM et testez-le dans le navigateur avec le playground interactif ci-dessous.

#Playground interactif

Exécute un module WASM (base64) qui exporte f().
Cas d'usage
  • Jeux vidéos dans le navigateur.
  • Éditeurs de photo/vidéo en ligne.
  • Applications scientifiques et de calcul.
  • Remplacement de plugins (Flash, Silverlight).