11 points par GN⁺ 2025-05-10 | 2 commentaires | Partager sur WhatsApp
  • La spécification Wasm 2.0 a été officiellement publiée
  • La communauté Wasm et les Working Groups ont finalisé la spécification depuis 2022, et les principales implémentations prenaient déjà en charge la version 2.0
  • À partir de la version 2.0, un modèle evergreen est introduit, permettant aux documents de Candidate Recommendation d’être continuellement mis à jour
  • Au lieu de passer à une recommandation finale à chaque nouvelle version, le brouillon actuel de la recommandation est considéré comme le standard

Principales fonctionnalités et ajouts de Wasm 2.0

  • Instructions vectorielles (SIMD) : ajout de 236 nouvelles instructions permettant d’exploiter les capacités SIMD 128 bits des CPU modernes, efficaces pour les codecs audio/vidéo haute performance, le machine learning, la cryptographie, etc.
  • Instructions de mémoire en bloc : ajout d’un ensemble d’instructions permettant la copie et l’initialisation rapides de la mémoire et des tables
  • Retour multi-valeurs : les fonctions et les blocs peuvent renvoyer plusieurs valeurs, ce qui améliore la convention d’appel et permet des transformations de programme supplémentaires
  • Types de référence : prise en charge de références vers des fonctions ou de pointeurs vers des objets externes (par ex. des valeurs JavaScript) comme valeurs opaques de première classe ; les tables peuvent servir de stockage pour ces valeurs de référence, avec des instructions de manipulation des tables et la définition de plusieurs tables
  • Conversions sans trap : introduction d’instructions de conversion évitant les traps inattendus lors de la conversion de nombres à virgule flottante en entiers
  • Instructions d’extension de signe : ajout d’instructions permettant d’étendre directement la largeur d’entiers signés, sans accès mémoire comme auparavant

Compatibilité ascendante et perspectives

  • Wasm 2.0 est entièrement compatible avec la version 1.0, et les programmes existants continuent de fonctionner tels quels
  • La sortie de Wasm 3.0 est également prévue prochainement

2 commentaires

 
caniel 2025-05-10

WA!(SM)

 
GN⁺ 2025-05-10
Avis Hacker News
  • Pour résumer l’annonce de WASM 2.0 en mars 2025 : c’est une mise à niveau majeure avec 236 nouvelles instructions vectorielles, dont le SIMD 128 bits, qui améliorent fortement les performances des codecs vidéo/audio, du machine learning et des applications de chiffrement ; les instructions de bulk memory prennent en charge la copie/l’initialisation rapide de la mémoire ; les fonctions peuvent désormais renvoyer plusieurs résultats, ce qui permet des conventions d’appel plus rapides et moins de références indirectes ; avec les reference types, les pointeurs vers des objets externes (comme des valeurs JavaScript) deviennent des valeurs de première classe ; il est possible de déclarer des tables de plusieurs types ; il y a aussi des instructions d’extension de largeur de bits et des conversions en virgule flottante sans pièges inattendus, entre autres évolutions importantes
    • Rust+LLVM ne peut toutefois pas encore exploiter en pratique le renvoi de résultats multiples à cause de problèmes de compatibilité ABI ; je ne connais pas bien la situation côté Clang
    • La partie instructions vectorielles (SIMD) semble s’être complexifiée en cherchant à optimiser trop tôt ; il aurait sans doute été plus élégant d’utiliser simplement la proposition de vecteurs à taille flexible
    • La fonctionnalité de renvoi de résultats multiples serait aussi très utile pour le développement de runtimes Common Lisp
    • Le billet officiel se termine par « présentation prochaine de Wasm 3.0 », donc il semble bien que Wasm 3.0 arrive bientôt
    • Une ISA indépendante de l’architecture et généraliste, et une ISA qui exploite au maximum le SIMD d’un CPU donné, ne sont pas compatibles ; il faut choisir l’une des deux. Je n’ai pas pu vérifier si les instructions SIMD de Wasm2 sont suffisamment généralistes à cause du rate limit de GitHub
  • La spécification WebAssembly est assez facile à lire, mais pour les débutants qui ne veulent pas se plonger dans le texte complet de la spec, je recommande le livre en ligne WebAssembly from the Ground Up ; il propose un apprentissage étape par étape en construisant soi-même un compilateur en JavaScript, ce qui se prête bien à la pratique. Il existe aussi un extrait gratuit. Pour être transparent, j’en suis l’un des auteurs
    • Personnellement, si j’aime Ada, c’est parce que là où JavaScript demande du code pénible de vérification U32, Ada permet de traiter cela très proprement avec des sous-types (subtype) ou des modules
    • Je me demande s’il est possible d’instrumenter du code WASM pour faire du débogage in-process : par exemple transformer en temps réel un langage personnalisé en WASM et, sur le web, avoir à la fois des breakpoints et l’inspection mémoire
  • Après avoir travaillé l’an dernier sur un runtime WebAssembly, j’ai été impressionné par la rigueur de la spec et la qualité des tests fournis. Il faut un peu de temps pour s’y habituer, mais une fois qu’on l’a comprise, c’est une spécification de langage vraiment intelligente. Dans les cas ambigus, l’interpréteur de référence généré directement depuis la spec est d’une grande aide, et les tests de conformité sont eux aussi extrêmement utiles
  • La proposition Wasm Constant Time est récemment passée au statut inactive. L’essentiel du travail réel avait été fait en 2018, mais l’intégration avec SIMD et son adoption comme extension officielle ont été repoussées. À moins que quelqu’un ne reprenne ce travail très important, toute la cryptographie Wasm reste très vulnérable aux attaques temporelles
  • Il est intéressant de noter que Wasm est une abréviation de WebAssembly mais pas un acronyme, donc on ne l’écrit pas en majuscules sous la forme WASM
    • Avec cette logique, est-ce que WAsm ne serait pas plus correct ?
    • En pratique, même parmi les acronymes, beaucoup s’écrivent aussi en minuscules (par ex. scuba, radar, laser)
    • J’espère que ça prendra bien lol
  • Je serais curieux de voir une liste d’applications WASM réellement utilisées. L’idée est bonne, mais ça donne un peu l’impression, comme les DAPPs, d’être surtout « là pour le fun ». J’aimerais voir des exemples concrets
    • Je recommande madewithwebassembly.com et le dépôt GitHub Awesome-WebAssembly-Applications. Ce sont de bonnes ressources bien organisées sur les applications WASM réelles
  • Cette sortie de WASM2 est excellente, mais l’adoption d’un SIMD à taille fixe (128 bits) laisse un goût mitigé. Une approche plus souple, où le compilateur ajuste la largeur SIMD selon les performances de l’appareil comme avec ARM SVE, aurait été préférable
    • Pourtant, je pense au contraire que le SIMD à taille fixe ouvre davantage de cas d’usage. Les instructions vectorielles peuvent être remplacées assez facilement par du SIMD fixe ; le SIMD n’est pas toujours indispensable, mais il existe beaucoup d’usages opportunistes où la vectorisation devient possible grâce à la taille des registres. Dans ces cas-là, cela peut être très utile
    • Le vrai problème, c’est l’optimisation prématurée ; pour cette question de SIMD aussi, il aurait été bien plus élégant de suivre simplement la proposition de vecteurs à taille variable
  • Je me demande si une fonction C qui renvoie une valeur sous forme de struct peut être compilée vers WASM
    • Oui, c’est possible, mais à ma connaissance ce n’est pas exportable vers JS pour l’instant
  • Je me demande s’il existe déjà des runtimes qui implémentent les fonctionnalités de WASM2
    • La plupart les implémentent depuis longtemps déjà. La communauté Wasm et le groupe de travail ont finalisé la spec au début de 2022, et les principales implémentations proposaient déjà la 2.0 avant cela. La 3.0 devrait aussi être officialisée bientôt, et certaines fonctionnalités existent déjà derrière des feature flags
  • L’idée d’un bytecode pour le web est un vieux rêve. En tant que développeur C#, je trouve impressionnant que Blazor ait ouvert la voie avec Wasm dès ses débuts ; .NET est assez en avance sur Wasm, et j’attends avec intérêt les changements de cette version 2.0