Écrire du Web Assembly "from scratch" avec WAT

Compiler vers du Web Assembly c'est bien, mais l'écrire à la main, c'est mieux ?

Article publié le 31/01/2022, dernière mise à jour le 19/09/2023

Dans un précédent article nous avons parlé du concept de Web Assembly, de sa nature et de son utilité (voir l'article).

Le WASM est généralement compilé à partir d'un autre langage, plutôt bas-niveau (C++, Rust, Go,...), mais le saviez-vous, il est également possible d'écrire du Web Assembly à la main (from scratch) ?

Web Assembly Text Format (WAT)

Le WAT est une représentation textuelle du format binaire de WASM, qui permet deux choses :

  • Ecrire du WASM directement, sans le compilier depuis un autre langage
  • Comprendre et analyser le fonctionnement d'un module WASM existant

Bien sûr, en théorie, rien ne vous empêche d'écrire un module en web assembly sous le format binaire, mais avouons, la tâche est plutôt imbuvable :

00 61 73 6d 01 00 00 00 
01 07 01 60 02 7f 7f 01 
7f 03 02 01 00 07 0c 01 
08 6d 75 6c 74 69 70 6c 
79 00 00 0a 09 01 07 00 
20 00 20 01 6c 0b

Ci-dessus, un module exposant une simple fonction pour multiplier deux entiers 32 bits.

Et si jamais vous viens l'envie de tenter l'expérience, voici la documentation complète de la spécification : https://webassembly.github.io/spec/core/index.html

Mais si, comme le commun des mortels, vous ne passez pas vos Samedi soirs à manger de l'hexadécimal, le format textuel WAT sera sûrement bien plus adapté :

(module
  (func $multiply (param $lhs i32) (param $rhs i32) (result i32)
    get_local $lhs
    get_local $rhs
    i32.mul)
  (export "multiply" (func $multiply))
)

Ci-dessus le même module, mais au format WAT

Chaque structure de la grammaire de Web Assembly a été ramené dans un langage lisible, court et relativement facile à écrire donc vous pouvez retrouver toute la documentation ici.

Une fois votre module écrit en WAT, il vous suffira de le compiler en WASM avec des outils comme celui-ci :


Rick Mason sur Unsplash

Vous avez terminé l'article ?

Commentaires (0)

pour laisser un commentaire

Aucun commentaire pour l'instant