Le consortium W3C a annoncé la disponibilité de la spécification qui standardise le code intermédiaire WebAssembly 3.0 et l'API associée, permettant de créer des applications haute performance pouvant être transportées entre les navigateurs et les plateformes matérielles. WebAssembly fournit un code intermédiaire universel et de bas niveau, indépendant du navigateur, pour l'exécution d'applications compilées à partir de différents langages de programmation.
La technologie WebAssembly peut être utilisée pour exécuter dans le navigateur des tâches nécessitant une forte performance, comme le codage vidéo, le traitement audio, la manipulation graphique et 3D, le développement de jeux, les opérations cryptographiques et les calculs mathématiques en organisant l'exécution dans le navigateur de code écrit dans des langages compilables comme C/C++. Grâce à l'utilisation de JIT pour WebAssembly, il est possible d'atteindre un niveau de performance proche de celui du code natif.
Parmi les principales tâches de WebAssembly, on trouve l'assurance de portabilité, la prévisibilité du comportement et l'identité d'exécution du code sur différentes plateformes. WebAssembly ne se limite pas aux navigateurs et est également promu comme une plateforme universelle pour l'exécution sécurisée de code dans toutes les infrastructures, systèmes d'exploitation et appareils.
Les spécifications suivantes sont disponibles :
- WebAssembly Core — décrit une machine virtuelle de bas niveau pour l'exécution de code intermédiaire WebAssembly. Les ressources associées à WebAssembly sont fournies au format « .wasm », similaire aux fichiers « .class » en Java, contenant des données statiques et des segments de code pour travailler avec ces données.
- WebAssembly JavaScript API — fournit une API pour l'intégration avec JavaScript. Permet d'obtenir des valeurs et de passer des paramètres aux fonctions WebAssembly. L'exécution de WebAssembly respecte le modèle de sécurité de JavaScript et toute interaction avec le système de base se fait de manière similaire à l'exécution de code JavaScript.
- WebAssembly Web API — définit une interface de programmation basée sur le mécanisme Promise pour demander et exécuter des ressources « .wasm ». Le format des ressources WebAssembly est optimisé pour commencer l'exécution sans attendre le chargement complet du fichier, ce qui améliore la réactivité des applications web.
- WASI API — définit une interface système modulaire pour exécuter WebAssembly en dehors des navigateurs et fournir un accès à des ressources telles que des fichiers, des connexions réseau, un générateur de nombres aléatoires et des horloges système.
Il est à noter que la nouvelle version de la norme améliore considérablement le support de la compilation en WebAssembly pour les langages de haut niveau. Par exemple, la possibilité de compiler des projets en WebAssembly dans les langages Java, OCaml, Scala, Kotlin, Scheme et Dart a été mise en œuvre. Les principaux changements dans WebAssembly 3.0 par rapport à la deuxième version de la norme :
- La prise en charge de l'espace d'adressage à 64 bits a été mise en œuvre. Pour l'adressage mémoire, le type i64 peut désormais être utilisé, et pas seulement i32, ce qui élargit l'espace d'adressage disponible pour les applications de 4 Go à 16 Eo (avec une limitation de 16 Go lors de l'exécution dans un navigateur).
- Il est désormais possible d'utiliser plusieurs objets mémoire dans un seul module WebAssembly et de travailler avec différents espaces d'adresses. Parmi d'autres, il est possible de copier des données entre différentes instances d'objets mémoire situés dans différents espaces d'adresses.
- La prise en charge de la collecte des ordures a été ajoutée. En plus de la mémoire linéaire précédemment disponible, un type de stockage distinct, automatiquement géré par un collecteur de déchets, a été proposé. Le compilateur peut désormais utiliser des structures de données distinctes, des tableaux et des variables dont l'allocation de mémoire et la gestion du cycle de vie sont sous la responsabilité de WebAssembly.
- La prise en charge des références typées a été ajoutée, permettant de décrire la structure exacte de la valeur à laquelle la référence pointe, ce qui évite des vérifications supplémentaires à l'exécution. Les sous-types, la récursivité des types et la possibilité d'utiliser en toute sécurité des références de fonction sans vérifier les types et les limites à l'exécution sont également pris en charge.
- La prise en charge des appels en fin de chaîne (Tail call) a été ajoutée, où la fonction actuelle termine immédiatement son exécution après avoir appelé une autre fonction, sans consommer d'espace sur la pile.
- La prise en charge du traitement des exceptions a été ajoutée.
- La prise en charge des instructions SIMD « relâchées » (relaxed), permettant d'atteindre de meilleures performances en renonçant à l'application stricte de la sémantique sur toutes les plateformes matérielles, a été ajoutée.
- Ajout du support d'un profil d'exécution déterministe, qui définit un comportement indépendant de la plateforme actuelle pour les instructions dont les résultats peuvent varier sur différentes plateformes (opérations à virgule flottante, retour de la valeur NaN, instructions vectorielles affaiblies). Lorsqu'on sélectionne ce profil, Wasm assure un comportement déterministe, une reproductibilité et une portabilité.
- Ajout d'une syntaxe pour créer des annotations personnalisées permettant d'attacher des informations supplémentaires au code WebAssembly. Auparavant, la prise en charge des sections personnalisées, qui permettaient de stocker des informations arbitraires, était présente dans le format binaire de WebAssembly, mais manquait dans le format texte de WebAssembly. Il est désormais possible d'ajouter ces informations de manière lisible et modifiable.
- Des fonctions intégrées ont été ajoutées à l'API JavaScript pour travailler avec des chaînes de caractères. Auparavant, les chaînes JavaScript pouvaient être passées dans WebAssembly uniquement en tant que références externes, mais on peut désormais accéder directement aux chaînes et les manipuler à l'intérieur de WebAssembly.
Source : opennet.ru
