Qu’est-ce que WebAssembly ?
- WebAssembly est un ensemble d’instructions standardisé et un format de bytecode conçus pour exécuter du code client non fiable dans le navigateur web à une vitesse proche du natif.
- Il est issu d’Emscripten, un compilateur de C/C++ vers JavaScript, qui convertissait à l’origine du LLVM IR en JavaScript pour permettre l’exécution de code C et C++ sur le web.
- Avec le temps, les développeurs de navigateurs ont collaboré avec le projet Emscripten pour créer un sous-ensemble simple de JavaScript optimisé pour les performances, qui a été standardisé sous le nom d’asm.js.
- Ensuite, afin d’éviter la surcharge de JavaScript, un format de bytecode indépendant a été conçu : c’est Wasm.
- Récemment, WebAssembly a aussi gagné en popularité en dehors du navigateur, et Fastly comme Shopify ont construit leurs produits Edge Compute et Functions sur des moteurs WebAssembly.
- WebAssembly est une plateforme attrayante pour bâtir un écosystème de plugins grâce à sa capacité à être ciblé depuis divers langages sources.
Pourquoi un interpréteur WebAssembly ?
- Comme beaucoup d’ingénieurs logiciel, l’auteur avait pris l’habitude de lancer de nouveaux side projects puis d’en perdre l’intérêt après quelques semaines.
- Il lui fallait un projet d’envergure dans lequel investir des efforts sur la durée, tout en l’exposant à des couches plus basses de la pile informatique.
- Il s’est intéressé au battage autour de WebAssembly, qui lui semblait être un outil d’ingénierie de plateforme séduisant, permettant de concevoir des appels système personnalisés.
Semblance
- Il a décidé d’écrire un interpréteur WebAssembly afin de se familiariser avec la spécification cœur de WebAssembly.
- Comme l’objectif du projet était l’apprentissage, il n’avait pas prévu d’implémenter tous les opcodes ni de faire passer toute la suite de tests du noyau.
- Pouvoir exécuter un simple "Hello, World!" lui suffirait.
Résultat
- Le projet est considéré comme un grand succès. La couverture des opcodes n’est pas complète, mais il peut exécuter un programme simple de type "Hello, World!".
- Le code est désordonné, lent, présente des fuites mémoire et peut être vulnérable à des modules malveillants, mais il fonctionne.
- Cela lui a permis d’apprendre énormément sur la spécification cœur de WebAssembly et de sortir de sa zone de confort en tant qu’ingénieur.
- Il estime désormais avoir acquis suffisamment de connaissances sur WebAssembly pour pouvoir contribuer à des runtimes industriels comme Wasmtime.
1 commentaires
Commentaires sur Hacker News
J’ai déjà eu l’expérience d’écrire un interpréteur Wasm en Scheme, donc cela me fait plaisir de voir d’autres personnes le faire elles-mêmes. Wasm est moins difficile qu’on ne le pense, et je recommande d’essayer juste assez pour y prendre goût, sans forcément implémenter toutes les instructions.
wast2json, on peut obtenir une description JSON plus simple ainsi que des fichiers wasm binaires classiques.Question de débutant :
J’ai trouvé cet article intéressant sur l’interprétation directe de WASM.
Approche intéressante, et excellent travail.
Je pense qu’adopter la Wasm-C-API comme interface standard aurait été une bonne idée.
Point sujet à controverse :
Je recommande de jeter un œil à Orca. Cela pourrait être une bonne occasion de contribuer : https://orca-app.dev
C’est vraiment chouette de voir quelqu’un explorer WebAssembly en profondeur et construire un interpréteur depuis zéro.
Excellent article, qui me redonne envie de me replonger dans une implémentation de WASM.
Travail vraiment impressionnant.