WebAssembly
===========

L'objet JavaScript **`WebAssembly`** est un objet global qui agit comme un espace de noms (*namespace*) pour les différentes fonctionnalités JavaScript relatives à WebAssembly.

À la différence des autres objets globaux, `WebAssembly` n'est pas un constructeur (au même titre que `Math` qui agit comme un espace de noms pour les constantes et fonctions mathématiques ou comme `Intl` qui centralise les constructeurs et les opérations relatives à l'internationalisation).

Description
-----------

L'objet `WebAssembly` est notamment utilisé pour :

* Charger du code WebAssembly grâce à la fonction `WebAssembly.instantiate()`
* Créer des zones mémoires et des instances de tableaux grâce aux constructeurs `WebAssembly.Memory()`/`WebAssembly.Table()`.
* Fournir des outils de gestion d'erreur WebAssembly grâce aux constructeurs `WebAssembly.CompileError()`/`WebAssembly.LinkError()`/`WebAssembly.RuntimeError()`.
Méthodes
--------

`WebAssembly.instantiate()`

La méthode qu'on utilisera la plupart du temps pour compiler et instancier du code WebAssembly, elle renvoie une promesse qui est résolue en une `Instance` ou en une `Instance` et un `Module`.

`WebAssembly.instantiateStreaming()`

Cette méthode permet de compiler et d'instancier un module WebAssembly à partir d'un flux source (*streamed source*). Elle renvoie à la fois un objet `Module` et sa première `Instance`.

`WebAssembly.compile()`

Cette méthode permet de compiler un `WebAssembly.Module` à partir de *bytecode* WebAssembly, l'instanciation doit alors être effectuée dans une autre étape.

`WebAssembly.compileStreaming()`

Cette méthode permet de compiler un module `WebAssembly.Module` à partir d'un flux source (*streamed source*). L'instanciation devra alors être réalisée avec une autre étape.

`WebAssembly.validate()`

Cette méthode permet de valider un tableau typé censé contenir du *bytecode* WebAssembly : elle renvoie `true` si les octets forment un code WebAssembly valide ou `false` sinon.

Constructeurs
-------------

`WebAssembly.Global()`

Ce constructeur permet de créer un nouvel objet WebAssembly `Global`.

`WebAssembly.Module()`

Ce constructeur permet de créer un objet WebAssembly `Module`.

`WebAssembly.Instance()`

Ce constructeur permet de créer un objet WebAssembly `Instance`.

`WebAssembly.Memory()`

Ce constructeur permet de créer un objet WebAssembly `Memory`.

`WebAssembly.Table()`

Ce constructeur permet de créer un objet WebAssembly `Table`.

`WebAssembly.CompileError()`

Ce constructeur permet de créer un objet WebAssembly `CompileError`.

`WebAssembly.LinkError()`

Ce constructeur permet de créer un objet WebAssembly `LinkError`.

`WebAssembly.RuntimeError()`

Ce constructeur permet de créer un objet WebAssembly `RuntimeError`.

Exemples
--------

L'exemple suivant (cf. le fichier `instantiate-streaming.html` sur GitHub et le résultat obtenu) permet de récupérer le module WebAssembly via un flux depuis une source, de le compiler, puis de l'instancier. La promesse est résolue avec un objet `ResultObject`. La méthode `instantiateStreaming()` accepte une promesse pour l'argument `Response`, on peut lui passer directement un appel à `fetch()` qui passera ensuite la réponse à la fonction lors de la complétion de la promesse.


```js
var importObject = { imports: { imported\_func: (arg) => console.log(arg) } };

WebAssembly.instantiateStreaming(fetch("simple.wasm"), importObject).then(
  (obj) => obj.instance.exports.exported\_func(),
);
```


On accède alors à la propriété de l'instance `ResultObject` puis on appelle la fonction exportée.

Spécifications
--------------

| Specification |
| --- |
| WebAssembly JavaScript Interface # webassembly-namespace |

Compatibilité des navigateurs
-----------------------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

Voir aussi
----------

* Le portail WebAssembly
* Les concepts relatifs à WebAssembly
* Utiliser l'API JavaScript WebAssembly