Qu'est-ce que WebAssembly ?
WebAssembly (Wasm) est un format d'instructions binaire conçu pour l'exécution a haute performance dans les navigateurs web. Lance en 2017 et supporte par tous les navigateurs majeurs, Wasm permet d'exécuter du code compilé (C, C++, Rust, Go) dans le navigateur à une vitesse proche du natif. Il ne remplace pas JavaScript mais le complete pour les tâches intensives en calcul.
Fonctionnement technique
Le code source est compilé en un module Wasm binaire (.wasm) à l'aide d'un compilateur spécifique au langage source : Emscripten pour C/C++, wasm-pack pour Rust, TinyGo pour Go. Le navigateur charge le module, le valide (vérification de sécurité en temps constant), le compilé en code machine natif (JIT ou AOT), puis l'instancie avec les imports nécessaires. Wasm s'execute dans un sandbox securise avec le même modèle de sécurité que JavaScript (same-origin policy, pas d'accès direct au système de fichiers).
Cas d'utilisation
Les cas d'utilisation idéaux sont les applications nécessitant des performances elevees : jeux vidéo dans le navigateur (Unity, Unreal Engine compilent en Wasm), édition d'images et de vidéo (Photoshop Web, Figma utilise Wasm), compression et chiffrement, simulations scientifiques, machine learning (inférence de modèles), et emulation (DOSBox en Wasm). Des applications de bureau entières ont été portees dans le navigateur grâce à Wasm : AutoCAD, Google Earth, LibreOffice.
Interaction avec JavaScript
Wasm et JavaScript communiquent via une interface d'appel. JavaScript peut instancier des modules Wasm, appeler leurs fonctions exportees et partager de la mémoire linéaire. Les outils comme wasm-bindgen (Rust) et Emscripten (C++) génèrent automatiquement les bindings entre les deux mondes. La mémoire partagee (SharedArrayBuffer) et les Web Workers permettent le multithreading. Les performances optimales nécessitent de minimiser les allers-retours entre JS et Wasm.
WebAssembly hors du navigateur (WASI)
WASI (WebAssembly System Interface) étend Wasm au-delà du navigateur en fournissant un accès standardise au système d'exploitation (fichiers, réseau, horloge). Les runtimes comme Wasmtime, Wasmer et WasmEdge exécutent des modules Wasm cote serveur. Avantages : portabilité (un seul binaire pour toutes les plateformes), sécurité (sandbox par défaut, capabilities), et démarrage ultra-rapide (microsecondes). Docker et Kubernetes explorent l'intégration de conteneurs Wasm comme alternative légère aux conteneurs Linux.