Aller au contenu principal

Prise en charge expérimentale de WebAssembly dans V8

· 3 minutes de lecture
Seth Thompson, Responsable WebAssembly

Pour une vue d'ensemble complète de WebAssembly et une feuille de route pour une collaboration communautaire future, consultez Une étape importante pour WebAssembly sur le blog Mozilla Hacks.

Depuis juin 2015, des collaborateurs de Google, Mozilla, Microsoft, Apple et du groupe communautaire W3C WebAssembly travaillent d'arrache-pied à la conception, à la spécification et à l'implémentation (1, 2, 3, 4) de WebAssembly, un nouveau runtime et cible de compilation pour le web. WebAssembly est un bytecode bas niveau et portable, conçu pour être encodé dans un format binaire compact et exécuté à une vitesse proche de celle du natif dans un bac à sable sécurisé. En tant qu'évolution des technologies existantes, WebAssembly est étroitement intégré à la plate-forme web, plus rapide à télécharger sur le réseau et plus rapide à instancier que asm.js, un sous-ensemble bas niveau de JavaScript.

À partir d'aujourd'hui, la prise en charge expérimentale de WebAssembly est disponible dans V8 et Chromium derrière un drapeau. Pour l'essayer dans V8, exécutez d8 version 5.1.117 ou supérieure à partir de la ligne de commande avec le drapeau --expose_wasm ou activez la fonctionnalité expérimentale WebAssembly sous chrome://flags#enable-webassembly dans Chrome Canary 51.0.2677.0 ou supérieur. Après avoir redémarré le navigateur, un nouvel objet Wasm sera disponible à partir du contexte JavaScript, exposant une API permettant d'instancier et d'exécuter des modules WebAssembly. Grâce aux efforts des collaborateurs de Mozilla et Microsoft, deux implémentations compatibles de WebAssembly sont également disponibles derrière un drapeau dans Firefox Nightly et dans une version interne de Microsoft Edge (démontré dans une capture vidéo).

Le site Web du projet WebAssembly possède une démonstration illustrant l'utilisation du runtime dans un jeu 3D. Dans les navigateurs prenant en charge WebAssembly, la page de démonstration chargera et instanciera un module wasm utilisant WebGL et d'autres API de la plate-forme web pour rendre un jeu interactif. Dans d'autres navigateurs, la page de démonstration revient à une version asm.js du même jeu.

Démonstration WebAssembly

Sous le capot, l'implémentation WebAssembly dans V8 est conçue pour réutiliser une grande partie de l'infrastructure existante de la machine virtuelle JavaScript, en particulier le compilateur TurboFan. Un décodeur spécialisé WebAssembly valide les modules en vérifiant les types, les indices de variables locales, les références de fonctions, les valeurs de retour et la structure du flux de contrôle en un seul passage. Le décodeur produit un graphe TurboFan, qui est traité par divers passages d'optimisation et finalement transformé en code machine par le même backend, qui génère le code machine pour JavaScript et asm.js optimisés. Au cours des prochains mois, l'équipe se concentrera sur l'amélioration du temps de démarrage de l'implémentation V8 grâce à des ajustements du compilateur, du parallélisme et des améliorations des politiques de compilation.

Deux changements à venir amélioreront également de manière significative l'expérience des développeurs. Une représentation textuelle standard de WebAssembly permettra aux développeurs de visualiser la source d'un binaire WebAssembly comme n'importe quel autre script ou ressource web. De plus, l'objet Wasm actuel sera repensé pour fournir un ensemble plus puissant et idiomatique de méthodes et de propriétés permettant d'instancier et d'inspecter les modules WebAssembly à partir de JavaScript.