Pourquoi les navigateurs se sont soudainement mis à parler une nouvelle langue ?
\n\nImaginez que vous êtes un chef cuisinier. JavaScript est votre couteau universel : vous pouvez couper du pain, nettoyer du poisson et même ouvrir des conserves (au risque de vous couper). WebAssembly est un couteau japonais professionnel pour découper du sashimi. Il fait une seule chose : couper parfaitement fin et rapidement, mais nécessite une approche particulière. Vous ne l'utiliserez pas pour éplucher des pommes de terre, mais lorsque vous devez couper 100 portions de thon en une minute, vous ne pouvez pas vous en passer.
\n\nDans le monde du développement web, un seul roi a longtemps régné : JavaScript. Mais en 2017, un nouveau joueur est entré en scène : WebAssembly (Wasm). Ce n'est pas un remplacement de JS, mais un puissant coéquipier. Aujourd'hui, nous allons comprendre ce que c'est, à quoi ça sert et comment l'apprivoiser avec JavaScript.
\n\nQu'est-ce que WebAssembly en termes simples ?
\n\nWebAssembly est un format d'instructions binaires de bas niveau qui s'exécute dans le navigateur à une vitesse quasi native. Si JavaScript est un texte que le navigateur lit et interprète à la volée, Wasm est un bytecode compilé prêt, similaire au code machine.
\n\nVous écrivez du code en C, C++ ou Rust, vous le compilez en fichier .wasm, puis vous le chargez dans le navigateur comme un script ordinaire. Le navigateur l'exécute directement, contournant la longue étape d'analyse et de compilation JIT que subit JavaScript.
\n\nCaractéristiques clés de WebAssembly :
\n- \n
- Vitesse — exécution proche du natif (2 à 10 fois plus rapide que JS dans les tâches de calcul). \n
- Sécurité — fonctionne dans un bac à sable isolé, comme JS. \n
- Compacité — les fichiers .wasm prennent peu de place et se chargent rapidement. \n
- Intégration — facilement appelable depuis JavaScript et vice versa. \n
Pourquoi en avoir besoin si JavaScript existe ?
\n\nJavaScript est excellent pour 95 % des tâches : manipulation du DOM, animations, gestion des événements, requêtes serveur. Mais il y a des tâches où JS échoue :
\n\n- \n
- Calculs lourds — traitement vidéo, rendu 3D, simulations physiques. \n
- Jeux — projets AAA sur Unity ou Unreal Engine. \n
- Calculs scientifiques — simulation de dynamique moléculaire, cryptographie. \n
- Traitement multimédia — compression/décompression d'images, codecs audio et vidéo. \n
Dans ces scénarios, WebAssembly offre un gain de performance de plusieurs dizaines de fois. Et vous ne perdez pas l'accès aux API du navigateur (via une enveloppe JS).
\n\nComment ça marche ? Architecture simple
\n\nImaginez un pont entre deux mondes. D'un côté, votre module .wasm (rapide mais "stupide" — il ne connaît pas le DOM ni les événements). De l'autre, JavaScript (plus lent mais "intelligent" — il sait tout faire). Ils communiquent via une "mémoire" spéciale — la mémoire linéaire Wasm.
\n\nJS alloue un tableau d'octets (ArrayBuffer), le transmet au module Wasm, qui le remplit de données, puis JS récupère le résultat. C'est comme passer une lourde boîte par une fenêtre — vous ne déplacez pas chaque objet individuellement, mais vous passez toute la boîte d'un coup.
\n\nÉcrivons un exemple concret : accélérer la factorielle
\n\nComparons les performances sur une tâche classique — le calcul de la factorielle. D'abord, implémentons-la en JavaScript pur, puis en C, compilé en Wasm.
\n\n1. Version JavaScript (normale)
\n\n// factorial.js\nfunction factorialJS(n) {\n let result = 1;\n for (let i = 2; i <= n; i++) {\n result *= i;\n }\n return result;\n}\n\n// Test\nconsole.time('JS');\nfor (let i = 0; i < 100000; i++) {\n factorialJS(20);\n}\nconsole.timeEnd('JS'); // ~15-25 ms dans Chrome\n\n\n2. Code C que nous compilerons en Wasm
\n\nD'abord, écrivons en C :
\n\n// factorial.c\nint factorial(int n) {\n int result = 1;\n for (int i = 2; i <= n; i++) {\n result *= i;\n }\n return result;\n}\n<