Rust et WebAssembly
Introduction
1. Première considération
La notion de WebAssembly ne vous est sans doute pas étrangère. Elle est régulièrement évoquée dans la presse informatique, notamment en lien avec des langages comme C++ mais également et surtout Rust. En effet, les articles expliquant ou vulgarisant la notion de WebAssembly mentionnent régulièrement le langage Rust. Il était donc souhaitable, voire indispensable de consacrer un chapitre dans cet ouvrage, pour préciser la notion, expliquer en quoi cela consiste exactement et comment travailler avec WebAssembly en Rust.
2. Explications de WebAssembly
En quelques mots d’abord, tentons de définir la notion de WebAssembly. Il s’agit d’un standard de développement d’applications web qui permet de coder différemment qu’en langage JavaScript l’animation Front du site web.
Un WebAssembly est compilé en bytecode depuis un langage comme Rust. Ce bytecode s’exécute sur une machine virtuelle dédiée. Ce dispositif apporte plusieurs avantages comparatifs. En particulier :
-
une gestion sécurisée de la mémoire ;
-
des performances en termes de vitesse supérieures à ce que l’on peut attendre de l’usage de JavaScript.
Sur ce dernier point, l’interprétation du langage JavaScript prend forcément plus...
Exemple détaillé de WebAssembly
1. Installation d’outils
Le package rustup est, à ce stade, probablement déjà installé sur votre machine. Au besoin, installez ou réinstallez-le :
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
On commence par installer l’ensemble des outils relatifs à wasm, qui nous sont nécessaires :
rustup target add wasm32-unknown-unknown
On obtient ceci en sortie :
> info: downloading component 'rust-std' for 'wasm32-unknown-unknown'
> info: installing component 'rust-std' for 'wasm32-unknown-unknown'
> 14.5 MiB / 14.5 MiB (100 %) 9.2 MiB/s in 1s ETA: 0s
Notez que l’équivalent de ces outils en 64 bits est également disponible. Un élément de documentation à ce propos est présent à cette adresse : https://doc.rust-lang.org/beta/rustc/platform-support/wasm64-unknown-unknown.html
Enfin, grâce à l’outil cargo, on installe un autre outil en charge de la compression du fichier de sortie d’extension .wasm. Cet exécutable se nomme wasm-gc :
cargo install wasm-gc
Si tout se passe bien, vous devriez obtenir cette ligne en sortie :
> Installed package `wasm-gc v0.1.6` (executable `wasm-gc`)
À ce stade, la machine sur laquelle vous travaillez doit avoir le nécessaire pour pouvoir concrètement travailler sur la thématique Rust et WebAssembly. Passons donc au code de notre premier exemple.
2. Exemple détaillé
a. Introduction
Dans cet exemple, nous aurons besoin nécessairement de faire un peu de HTML et de JavaScript, le langage d’animation des pages web. Imaginons que nous voulions faire une petite calculatrice en charge de l’addition de deux entiers, inclus dans la page web (la page HTML).
Dans une approche classique, on aurait notre page HTML qui, sur une action bouton, appellerait du JavaScript, qui inclurait une fonction d’addition codée en JavaScript. Puis le résultat serait affiché dynamiquement dans le HTML grâce à l’usage du DOM.
Le DOM ou Document Object Model correspond à la représentation arborescente du HTML courant, qui est accessible et manipulable depuis le JavaScript....
Pour aller plus loin
1. Quelques caisses utiles
L’exemple précédent se veut didactique, mais il ne doit pas aider à passer sous silence le très dynamique écosystème existant en matière de WebAssemblies développés en langage Rust.
En effet, il existe de nombreuses caisses particulièrement utiles pour le développement de WebAssemblies en Rust, pour la plupart listées à cette adresse : https://rustwasm.github.io/book/reference/crates.html
Notons au passage la page équivalente en matière d’outils, où vous retrouverez ceux que nous avons utilisés ici : https://rustwasm.github.io/book/reference/tools.html
Nous allons nous contenter de détailler ici l’usage des principales caisses susceptibles d’être utiles si vous allez plus loin dans ce type de développement.
a. Caisse wasm-bindgen
Cette caisse permet une meilleure interaction entre Rust et JavaScript, en particulier quand il s’agit de manipuler le DOM (comme nous l’avons fait dans l’exemple détaillé).
Voici la page sur crates.io : https://crates.io/crates/wasm-bindgen
Et une page sur la documentation officielle à propos de cette caisse : https://docs.rs/wasm-bindgen/latest/wasm_bindgen/
b. Caisse console_error_panic_hook
Une fois que le WebAssembly est déployé, il n’est pas forcément...