Quel langage de programmation pour WebAssembly?

WebAssembly résoud beaucoup de problèmes de compatibilité entre appareils, c'est comme un Java plus universel. Mais aussi plus complexe à mettre en oeuvre du fait des mesures de sécurité qu'on lui a intégré. Un langage de génération de code wasm peut mieux convenir qu'un autre selon le type d'application envisagé: locale tout en wasm, locale avec Node.js ou sur le Web.

Le bout du tunnel avec WebAssembly
Le bout du tunnel avec WebAssembly

Le langage C

Les programmes C compilés en wasm sont utilisables comme exécutables ou comme bibliothèques de fonctions pour JavaScript. Dans le second cas, si l'on utilise le runtime C, comme par exemple les fonctions de <stdio.h> la commande d'instanciation dans le script JavaScript a besoin du paramètre ImportObject qui précise toutes les fonctions "importés" comme printf, putchar, etc...
Pour les fonctions qui doivent accéder au système de fichier, on devra encore inclure WASI, un runtime dédié à WebAssembly et qui remplace libc.
La commande de compilation d'une bibliothèque a cette forme:

emcc hello.c -Oz -s WASM=1 -s SIDE_MODULE=1 -o hello.wasm 

Les langages C et C++ ne sont pas ceux qui conviennent le mieux pour une utilisation avec node.js.

C++

Un programme C++ se convertit parfaitement en Wasm pour être exécuté avec wasmer ou wasmtime. Mais lorsque vous voulez créer une librairie utilisable par un script JavaScript, c'est plus compliqué. Em++ qui se base sur CLang modifie le nom des fonctions. Par exemple add() devient _Z3addii(). C'est ce qu'on appelle le "mangling". Il vous faudra modifier la déclaration de vos fonctions C++ pour qu'elles soient traitées comme des fonctions C.

Rust

C'est un nouveau langage de Mozilla, un des acteurs principaux dans le développement de WebAssembly, donc qui compile bien en wasm, mais ne permet évidemment pas de réutiliser d'anciens programmes.

Julia

Tout comme Rust, Julia utilise la plateforme LLVM pour créer du code exécutable, et donc génère du bitcode LLVM qui se convertit facilement en wasm.
Voir le site Julia-Wasm pour les instructions d'utilisation.

AssemblyScript

C'est une solution pour utiliser wasm dans le navigateur. AssemblyScript est une version de TypeScript créée pour générer du code wasm plutôt que JavaScript. Il est en toujours en évolution, mais comporte à ce jour des lacunes et ne supporte qu'une partie du langage TypeScript.
Son runtime intègre cependant la gestion de la mémoire et un garbage collector. Le language supporte le type String et les tableaux dynamiques.
On génère un fichier wasm avec une simple commande:

asc hello.ts 

C# (Avec Blazor)

Le framework de construction d'applications Web de Microsoft, qui utilise le langage C#, peut produire aussi du code WebAssemby. Son but premier est de remplacer JavaScript par C# - en partie - qui peut fonctionner dans le navigateur une fois converti en wasm. C'est une alternative à Angular (qui utilise TypeScript) et React (qui utilise JavaScript).

Swift (Linux/MacOS)

Un autre langage de la plateforme LLVM. Le site SwiftWasm explique comment créer un programme wasm avec une seule instruction:

swiftc -target wasm32-unknown-wasi hello.swift -o hello.wasm

Il vous faut inclure le runtime WASI. SwiftWasm ne fonctionne pas sur Windows mais on peut créer des programmes wasm sous Linux et les utiliser dans le navigateur sur tous systèmes.

Scriptol (C++)

Un moyen de générer du wasm par C++ sans programmer en C++. Le langage Scriptol à la syntaxe claire et simple compile en C++ qui est ensuite compilé en wasm et peut être exécuté directement aussi par wasmer.

solc hello