WebAssembly, bytecode pour navigateur

Ce projet conjoint entre éditeurs de navigateur utilise asm.js comme point de départ pour une IR du Web.

Présenté par Brendan Eich, le créateur de JavaScript et en partie d'Asm.js, WebAssembly ou wasm, est un nouveau langage de représentation intermédiaire (IRL) compatible avec tous les navigateurs. Il permettra à différents langages de haut niveau, de fonctionner dans les navigateurs en étant compilé en wasm. Le but initial est de compiler des programmes et bibliothèques de C et C++ en WebAssembly. Puis d'autres langages devront suivre.

En juin 2015, le développement ne fait que commencer. Mais il est facilité par l'utilisation d'Asm.js comme point de départ. Ce sous-ensemble de JavaScriptl est compatible avec tous les navigateurs.

WebAssembly schéma de fonctionnement

Le but est de conserver la compatibilité entre Asm.js et wasm durant quelques années. Par seulement pour le support avec les navigateurs, mais aussi parce qu'Asm.js est lui aussi en développement, et que les nouvelles possibilités qu'on lui inclut seront indispensable également à wasm. Par exemple les threads avec mémoire partagée, le support des processeurs multi-coeurs.

Par la suite, lorsque tous les navigateurs supporteront le nouveau langage WebAssembly, les deux langages pourront diverger. Le second sera modifié sans que l'on modifie pour autant Asm.js, et donc JavaScript.

Wasm reçoit notamment le support de Google avec l'implication du team NaCl, aussi on peut donc anticiper l'abandon de ce dernier dont l'objectif était assez proche: faire fonctionner des applications native dans le navigateur. Par ailleurs le team V8 a annoncé l'intégration en cours de wasm dans le compilateur JavaScript. Ainsi le moteur wasm peut produire code IR (représentation intermédiaire) qui est directement interprété en JIT.

Le code wasm pour le moment est donc celui d'Asm.js. Quand il commencera à diverger, des exemples seront présentés ici. Les expérimentations ont montré sur un prototype de ce nouveau code que le temps de parsing (pas la vitesse d'exécution) peut être multiplié par 20. Il est donc certain que le code final sera assez différent. La taille du code binaire produit sera aussi trois fois moins importante qu'en Asm.js. Le code est binaire, mais une vue textuelle plus lisible est possible.
Selon Brendan Eich, wasm est en fait un "encodage AST compressé" et non un vrai bytecode. AST pour Abstract Syntax Tree, l'arborescence du code.

Quelques autres avantages de wasm:

Et quelques inconvénients:

Même si les langages compilés en WebAssembly deviennent une alternative possible à JavaScript, celui-ci restera supporté et privilégié par les navigateurs. Wasm fera partie du compilateur JS.

Citations de Brendan Eich sur WebAssembly

La continuation de l'évolution d'ASM.js est wasm.

Au début, WebAssembly commence comme ASM.js, mais avec une syntaxe compressée, c'est une syntaxe binaire. Mais une fois que tous les navigateurs supporteront à la fois wasm et ASM.js, et après un intervalle décent de mises à jour des navigateurs, alors wasm pourra commencer à grandir avec des sémantiques de plus qui n'ont pas besoin d'être mises dans JavaScript.

Il y a une quantité de langages que vous pourriez compiler en wasm.

Assumer que le web est en stase - ce n'est pas une bonne hypothèse, je pense que c'est l'erreur qui s'est produite il y a longtemps avec des projets comme Portable Native Client, et Dart aussi.

Comment créer et utiliser du code WebAssembly

Un tutoriel anglais est fourni sur le site: Developer's guide to WebAssembly.

Les outils pour générer le code et le faire fonctionner sont disponibles sur GitHub.

Références