Google Chrome 70 supportera les threads WebAssembly
mer, 31/10/2018 - 15:25
WebAssembly ou wasm est un format de fichier binaire, destiné à être exécuté dans les navigateurs, avec des performances proches du code natif. Un fichier wasm contient un code-byte 20 fois plus rapide à parser que du code asm.js. Il contient également des informations de débogage ce qui rend possible le débogage une application wasm après compilation.
La compilation, quant à elle, convertit le code source d'un langage en ce byte-code wasm. Pour l'instant il s'agit de code C/C++ ou Rust essentiellement.
Le navigateur Google Chrome 70 supportera les threads WebAssembly annonce Google. https://developers.google.com/web/updates/2018/10/wasm-threads Dans son billet, Moutain View souligne que les threads WebAssembly sont différents des Web Workers, qui existent depuis 2012. Les web workers sont un mécanisme permettant d'écuter du code JavaScript thread en arrière-plan, mais les web workers ne peuvent pas partage les données mutables entre eux. En remplacement, il utilisent un mécanisme de transmission de messages.
Les threads de WebAssembly sont quant à eux similaires aux pthread, ou thread POSIX des systèmes d'exploitations, et un code C mettant en oeuvre des pthread peut être directement compilée en code wasm. Par exemple, ce code C qui calcule ne suite de Fibonacci dans un pthread:
#include <pthread.h>
#include <stdio.h>
// Calculate fibonacci numbers shared function
int fibonacci(int iterations)
{
int val = 1;
int last = 0;
if (iterations == 0) {
return 0;
}
for (int i = 1; i < iterations; i++) {
int seq;
seq = val + last;
last = val;
val = seq;
}
return val;
}
// Start function for the background thread
void *bg_func(void *arg) {
int *iter = (void *)arg;
*iter = fibonacci(*iter);
return arg;
}
// Foreground thread and main entry point
int main(int argc, char *argv[]) {
int fg_val = 54;
int bg_val = 42;
pthread_t bg_thread;
// Create the background thread
if (pthread_create(&bg_thread, NULL, bg_func, &bg_val)) {
perror("Thread create failed");
return 1;
}
// Calculate on the foreground thread
fg_val = fibonacci(fg_val);
// Wait for background thread to finish
if (pthread_join(bg_thread, NULL)) {
perror("Thread join failed");
return 2;
}
// Show the result from background and foreground threads
printf("Fib(42) is %d, Fib(6 * 9) is %d\n", bg_val, fg_val);
return 0;
}
pourra être directement compilé ainsi :
emcc -O2 -s USE_PTHREADS=1 -s PTHREAD_POOL_SIZE=2 -o test.js test.c
pour peu que l'on dispose du emscripten SDK.