Google Chrome 70 supportera les threads WebAssembly

Par:
fredericmazue

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.