Publié le 24/04/25
La révolution du WebAssembly
Dans cet article, partons ensemble à la découverte du WebAssembly, une technologie qui pourrait vous permettre de découvrir une nouvelle façon de développer vos applications web avec des langages de programmation modernes, fiables et robustes tels que le Rust, le Go, le Zig ou le V.
Il était une fois le JavaScript
Créé en dix jours en mai 1995 par Brendan Eich pour le compte de Netscape Communications, le JavaScript est un langage de programmation interprété, dynamique et à typage faible. Il a été conçu à l'origine pour rendre les pages web plus interactives mais n'avait pas réellement pour vocation à devenir aussi central dans l'écosystème Web. Il est donc progressivement monté en puissance, finissant par occuper une place prépondérante pour concevoir des interfaces web, avec par exemple des frameworks tels que React ou VueJS, mais aussi des backends applicatifs grâce à l'environnement d'exécution Node.js ou son challenger Bun.
Du fait de sa genèse un peu rapide, certains diraient même que c'est un langage mal né, il vient avec son lot de petits défauts ou inconvénients, certains d'entre-eux ayant été corrigés ou gommés au fur et à mesure du temps. Les défauts ou inconvénients sont plus ou moins nombreux, selon les cas et les usages, mais si l'on ne pouvait en retenir que deux, ce serait selon moi les suivants :
- Un typage faible avec des règles syntaxiques et des comportements parfois très étranges, pouvant facilement induire en erreur et donc entraîner des dysfonctionnements parfois difficiles à identifier ; je ne peux que vous conseiller de regarder ce lighning talk hilarant à ce sujet : https://www.destroyallsoftware.com/talks/wat
- Un niveau de performance pouvant être problématique pour certaines applications exigeantes et/ou critiques. Cela est dû au fait que cela reste un langage interprété pouvant avoir selon les cas un coût plus ou moins important à l'exécution, bien que les machines virtuelles aient fait des progrès considérables ces dernières années en intégrant par exemple une JIT (recompilation dynamique à la volée).
Mais est-il possible de se passer réellement du JavaScript pour le développement web ? Oui, grâce au WebAssembly...
Puis naquit le WebAssembly
Il y a maintenant dix ans, en 2015, le W3C a planché sur cette question : comment remplacer ou épauler le JavaScript tout en offrant des performances élevées et en permettant de choisir son langage de prédilection ? La réponse a été la création du WebAssembly, abrégé sous le petit nom de WASM (prononcez « wazeum »).
Ce standard consiste en :
- Un bytecode binaire, une sorte de langage machine mais abstrait de tout standard matériel physique.
- Sa représentation textuelle, un langage de bas niveau ressemblant à de l'assembleur.
- Un environnement d'exécution dans une sandbox, un « bac à sable » permettant d'isoler l'exécution du programme pour plus de sécurité.
Contrairement au JavaScript, le WebAssembly ne spécifie que des éléments de très bas niveau. Le bytecode représentant votre programme est produit en compilant le langage de haut niveau de votre choix, et c'est ce qui fait sa grande force.
Les langages permettant de générer du WebAssembly peuvent être très variés :
- Le langage C.
- Le langage C++.
- Le langage Rust.
- Le langage Go.
- Le langage Zig.
- Le langage V.
Cette liste cite les langages les plus répandus, mais n'est évidemment pas exhaustive.
Le WebAssembly va donc vous permettre de concevoir des applications performantes, moins gourmandes en ressources, tout en vous laissant le choix de votre langage de prédilection et des technologies adaptées à votre projet. Vous serez ainsi en mesure de développer aussi bien des applications de gestion, de sécurité, des frontends, des backends et même des jeux vidéos ...
Par exemple adapter Doom, le classique du jeu vidéo, pour le faire fonctionner dans votre navigateur devient donc possible ; la preuve ici.
Pour résumer simplement, le WebAssembly est une technologie prometteuse. Elle est capable d'offrir une sécurité et des performances bien supérieures au JavaScript traditionnel grâce à sa capacité à exécuter du code compilé à une vitesse proche du natif, tout en restant utilisable directement dans le navigateur ou du côté serveur.
Quel langage choisir ?
Avec le WebAssembly, vous n'avez donc plus qu'un seul choix à faire : le langage de programmation. Mais lequel choisir ? Comme toujours dans le domaine du développement logiciel, ll n'y a pas de réponse universelle à cette question. Mais permettez-moi de vous présenter quelques langages sur lesquels, selon moi, vous devriez accorder une attention particulière.
Rust : sécurité et performances
Développé dès 2006 par Graydon Hoare, ingénieur chez Mozilla, ce language a d'abord été développé comme projet personnel, puis à partir de 2009 comme projet de la fondation qui l'a utilisé pour certains composants de son navigateur Firefox, notamment le moteur de rendu Servo. Rust s'est imposé au fil du temps comme l'un des langages les plus appréciés pour le développement système et bas niveau, notamment grâce à ses performances proches du C et du C++ mais aussi grâce aux réponses très concrètes apportées aux problématiques de gestion de la mémoire et de sécurité.
Les points forts du Rust
- Il offre des performances élevées et se veut idéal pour des applications nécessitant rapidité et faible consommation de ressources.
- Il garantit la sécurité mémoire grâce à une sémantique particulière d'allocation/libération de la mémoire associée à un système de contrôle nommé « borrow checker ».
- Il est particulièrement soutenu par une communauté grandissante, ainsi que par des géants technologiques tels que Microsoft, Amazon et Google, et a fait récemment son entrée dans le noyau Linux pour compléter le développement en langage C.
- Il est très adapté à la compilation vers le WebAssembly, offrant ainsi d’excellentes performances sur navigateur ainsi que côté serveur via WASI, le WebAssembly System Interface, permettant de faire le lien avec les couches systèmes tout en garantissant un haut niveau de sécurité.
Les points faibles du Rust
- La courbe d'apprentissage assez raide, voire très raide.
- La syntaxe n'est pas toujours des plus limpides.
- Certains concepts peuvent en dérouter plus d'un·e, notamment pour comprendre et maîtriser la gestion de la mémoire et son modèle d'ownership.
- La chaine de compilation officielle est assez lente comparée à d'autre langages, mais elle s'améliore avec le temps.
Go : simplicité et concurrence
Imaginé dès 2007 par Robert Griesemer, Rob Pike, et Ken Thompson au sein de Google, ce langage est apparu officiellement en 2009 et s'est voulu dès le départ comme le successeur naturel du langage C dans le domaine du développement backend et des outils en ligne de commande. Il a été conçu pour faciliter l'écriture d'applications distribuées robustes et faciles à maintenir.
Les points forts du Go
- Il propose une syntaxe simple et lisible permettant un apprentissage rapide.
- Il propose un modèle élégant pour la programmation concurrente grâce aux goroutines, facilitant ainsi le développement d'applications distribuées performantes.
- Il propose une compilation rapide, voire très rapide, et permet de générer des applications assez légères.
- Il est capable de compiler vers le WebAssembly, facilitant l'écriture d'applications web et permettant aussi de simplifier le portage de services existants vers le web tout en gardant de bonnes performances.
Les points faibles du Go
- Les performances en WebAssembly sont le plus souvent inférieures à celles de Rust principalement à cause de son runtime lié à son modèle de programmation concurrente.
- La gestion de la mémoire est basée sur un garbage collector (ramasse-miettes), pouvant induire dans certains cas quelques latences.
Zig : rapidité et interopérabilité
Zig est un langage imaginé par Andrew Kelley et apparu en 2015. Il est axé sur la simplicité, la sécurité et les performances. Il se veut proche de la philosophie du langage C mais avec une approche plus moderne et sécurisée. Il apporte une intéropérabilité très poussée, pouvant lui-même compiler du C et du C++ nativement, il permet ainsi de pouvoir bénéficier et s'interfacer à une logithèque très étendue à coût zéro.
Les points forts du Zig
- Il propose d'excellentes performances, proches ou équivalentes au langage C.
- Il propose une gestion explicite et sécurisée de la mémoire.
- Il est capable de générer du WebAssembly, permettant de créer relativement aisément des applications dans un écosystème web.
Les points faibles du Zig
- L'écosystème encore rugueux, l'expérience développeur est encore perfectible.
- La communauté n'est pas très encore très développée.
V : ultra-rapide, ultra-léger et ultra-prometteur
Le dernier de cette liste et l'outsider : V est un langage jeune, très jeune même. Créé par Alex Medvenikov, il est apparu en 2019 avec une ambition très audacieuse : combiner la simplicité d'un langage comme le Go à la vitesse d'exécution d'un langage comme le C ou le Rust. Sa syntaxe est très largement inspirée du Go et se veut minimaliste et plutôt intuitive. C'est un langage et un écosystème très intéressants et qu'il faut surveiller de près.
Les points forts du V
- Il propose une syntaxe simple avec une courbe d'apprentissage très rapide.
- Il propose un temps de compilation extrêmement rapide, les projets écrits en V compilent littéralement à la vitesse de l'éclair.
- Il propose une très faible empreinte mémoire.
- Il propose une vitesse d'exécution extrêmement élevée.
- Il est capable de générer du WebAssembly, positionnant V comme un choix intéressant pour le développement d'applications performantes dans le navigateur ou côté backend.
Les points faibles du V
- Le langage et l'écosystème sont encore très jeunes. A l'écriture de ces lignes, le langage est à la version 0.4.0 beta mais propose tout de même une très grande stabilité de la syntaxe, des interfaces de programmation et des programmes générés.
- Pas encore assez mature pour de la production.
Conclusion
Le JavaScript conserve une forte présence dans le monde du développement web, et il n'est pas encore prêt à rendre les armes car il répond toujours parfaitement à certains besoins.
En revanche, lorsqu'il devient nécessaire d'aller plus loin et que l'on arrive à ses limites, le WebAssembly peut apporter des solutions à vos enjeux de performance, de stabilité, de sécurité, de gestions de ressources, etc.
Dans ce cas il devient donc essentiel de vous intéresser aux alternatives que représentent les autres langages de programmation. Chacun de ces langages peut apporter une réponse élégante aux limites que vous pouvez rencontrer, que ce soit côté frontend ou backend ... la seule limite restante étant finalement celle de votre imagination.
Pour aller plus loin
Si vous souhaitez en savoir plus, je vous conseille quelques ressources :
La révolution (wasm) est incroyable parce que vraie
Présentation à Devoxx France 2023 : https://youtu.be/ePnnbRHdNsI
Par :
- Philippe Charrière, Principal Solutions Architect chez Docker Inc
- Laurent Doguin, Director, Developer Relation & Strategy chez Couchbase.
Libérez, délivrez WebAssembly du navigateur ... Avec WASI
Présentation à DevFest Nantes 2022 : https://youtu.be/a21VuaKWLIg
Par :
- Philippe Charrière, Principal Solutions Architect chez Docker Inc
Server side WASM, le prochain game changer ?
Présentation à DevFest Nantes 2024 : https://youtu.be/ziBaoZTOj0Q
Par :
- Etienne Anne, développeur Fullstack chez MAIF
- Mathieu Ancelin, CTO et cofondateur de cloud APIM et créateur de Otoroshi intégrant du WASM.
Comment j'ai trouvé le sens de la vie grâce à WebAssembly
Présentation à Devoxx France 2024 : https://youtu.be/I87Lw4ohAmU
Par :
- Théo Gianella, consultant chez Zenika
Je porte DOOM dans le navigateur avec SDL2 et Emscripten
Présentation sur Twitch, mars 2024 : https://youtu.be/To6uxSdK2T0?t=380
Par :
- Olivier Poncet, CTO chez Arneo
Vous pouvez tester « DOOM » dans votre navigateur ici. De la même façon, vous pouvez redécouvrir le classique « Another World » dans votre navigateur ici.
Ces articles pourraient vous intéresser
Vous souhaitez en parler ?
D’après mes analyses
Nos projets et notre expertise vous intéressent ? Et si nous en discutions ?
Votre navigation inspire notre IA pour vous proposer des contenus sur mesure.
Pour l’éco-conception, modérons son utilisation.