WebAssembly - API JavaScript
In questo capitolo, capiremo come caricare il codice wasm ed eseguirlo nel browser utilizzando l'aiuto dell'API di webassembly javascript.
Ecco alcune API importanti, che utilizzeremo durante il tutorial per eseguire il codice wasm.
- fetch () API del browser
- WebAssembly.compile
- WebAssembly.instance
- WebAssembly.instantiate
- WebAssembly.instantiateStreaming
Prima di discutere le API javascript di WebAssembly, per testare l'API e l'output useremo il seguente programma C e il codice .wasm generato dal programma c utilizzando wasm explorer.
Un esempio per il programma C è il seguente:
#include<stdio.h>
int square(int n) {
return n*n;
}
Utilizzeremo WASM explorer, per ottenere il codice wasm -
Scarica il codice WASM e usalo per testare le API.
fetch () API del browser
L'API fetch () ha lo scopo di caricare la risorsa di rete .wasm.
<script>
var result = fetch("findsquare.wasm");
console.log(result);
</script>
Restituisce una promessa come mostrato di seguito -
È inoltre possibile utilizzare il metodo XMLHttpRequest per recuperare la risorsa di rete wasm.
WebAssembly.compile ()
La responsabilità dell'API è compilare i dettagli del modulo che vengono recuperati da .wasm.
Sintassi
La sintassi è la seguente:
WebAssembly.compile(buffer);
Parametri
Buffer - Questo codice da .wasm deve essere convertito in un array tipizzato o in un arraybuffer, prima di dare come input per la compilazione.
Valore di ritorno
Restituirà una promessa che avrà il modulo compilato.
Esempio
Vediamo un esempio, che fornisce l'output come modulo compilato utilizzando webAssembly.compile ().
<script>
fetch("findsquare.wasm") .then(bytes => bytes.arrayBuffer())
.then(mod => {
var compiledmod = WebAssembly.compile(mod);
compiledmod.then(test=> {
console.log(test);
})
})
</script>
Produzione
Il file console.log, se controllato nel browser, ti fornirà i dettagli del modulo compilato:
Il modulo ha un oggetto costruttore con importazioni, esportazioni e customSections. Vediamo la prossima API, per avere maggiori dettagli sul modulo compilato.
WebAssembly.instance
Utilizzando WebAssembly.instance, l'API ti fornirà l'istanza eseguibile del modulo compilato che può essere ulteriormente eseguita per ottenere l'output.
Sintassi
La sintassi è la seguente:
new WebAssembly.Instance(compiled module)
Valore di ritorno
Il valore restituito sarà un oggetto con la funzione array di export che può essere eseguita.
Esempio
<script>
fetch("findsquare.wasm")
.then(bytes => bytes.arrayBuffer())
.then(mod => WebAssembly.compile(mod)).then(module => {
let instance = new WebAssembly.Instance(module);
console.log(instance);
})
</script>
Produzione
L'output ci fornirà un array di funzioni di esportazione come mostrato di seguito:
Puoi vedere la funzione square, che abbiamo ottenuto dal codice C compilato.
Per eseguire la funzione quadrato, puoi fare quanto segue:
<script>
fetch("findsquare.wasm")
.then(bytes => bytes.arrayBuffer())
.then(mod => WebAssembly.compile(mod))
.then(module => {
let instance = new WebAssembly.Instance(module);
console.log(instance.exports.square(15));
})
</script>
L'output sarà:
225
WebAssembly.instantiate
Questa API si occupa di compilare e istanziare il modulo insieme.
Sintassi
La sintassi è la seguente:
WebAssembly.instantiate(arraybuffer, importObject)
Parametri
arraybuffer - Il codice da .wasm deve essere convertito in array tipizzato o arraybuffer prima di dare come input per istanziare.
importObject- L'oggetto di importazione deve avere i dettagli della memoria, le funzioni importate da utilizzare all'interno del modulo. Può essere un oggetto modulo vuoto, nel caso non ci sia nulla da condividere.
Valore di ritorno
Restituirà una promessa, che avrà i dettagli del modulo e dell'istanza.
Esempio
<script type="text/javascript">
const importObj = {
module: {}
};
fetch("findsquare.wasm")
.then(bytes => bytes.arrayBuffer())
.then(module => WebAssembly.instantiate(module, importObj))
.then(finalcode => {
console.log(finalcode); console.log(finalcode.instance.exports.square(25));
});
</script>
Produzione
Quando esegui il codice, otterrai l'output indicato di seguito.
WebAssembly.instantiateStreaming
Questa API si occupa di compilare e istanziare il modulo WebAssembly dal codice .wasm fornito.
Sintassi
La sintassi è la seguente:
WebAssembly.instantiateStreaming(wasmcode, importObject);
Parametri
wasmcode - Risposta da fetch o da qualsiasi altra API che fornisce il codice wasm e restituisce una promessa.
importObject- L'oggetto di importazione deve avere i dettagli della memoria, le funzioni importate da utilizzare all'interno del modulo. Può essere un oggetto modulo vuoto nel caso in cui non ci sia nulla da condividere.
Valore di ritorno
Restituirà una promessa, che avrà i dettagli del modulo e dell'istanza.
Esempio
Un esempio è discusso di seguito:
<script type="text/javascript">
const importObj = {
module: {}
};
WebAssembly.instantiateStreaming(fetch("findsquare.wasm"), importObj).then(obj => {
console.log(obj);
});
</script>
Quando lo provi nel browser, vedrai un errore:
Per farlo funzionare sul tuo server, dovrai aggiungere il tipo mime application / wasm oppure utilizzare WebAssembly.instantiate (arraybuffer, importObject).