Utilisez Emscripten pour compiler du code C et C++ en modules WebAssembly (Wasm) hautes performances pour le navigateur.
1. Options de compilation Emscripten modernes
Lorsque vous compilez et associez avec emcc ou em++, utilisez toujours des options modulaires modernes :
-sEXPORT_ES6: émet une syntaxe de module ES6 standard (import/export) plutôt que des objets globaux anciens. Cette option définit automatiquement-sMODULARIZE.-sENVIRONMENT=web: supprime le code d'exécution Node.js/shell pour réduire la taille du bundle.-sSTRICT: applique les valeurs par défaut d'Emscripten modernes et échoue sur les options obsolètes.-sALLOW_MEMORY_GROWTH: permet au tas de mémoire linéaire WebAssembly de s'étendre de manière dynamique lors de l'allocation de mémoire.-Oz(ou-O3) +-flto: optimise la taille minimale de la charge utile dans les builds de release.
2. Éviter de bloquer le thread principal
Si un appel vers WebAssembly est susceptible de prendre un certain temps (c'est-à-dire plus de quelques millisecondes), il ne doit pas être appelé sur le thread principal du navigateur.
Pour éviter d'exécuter ce code sur le thread principal du navigateur, plusieurs approches sont possibles :
Exécutez l'intégralité du programme WebAssembly dans un Web Worker. Il s'agit souvent de la solution la plus simple, car elle n'implique pas de configurer l'accès à SharedArrayBuffer ni de modifier la source du programme.
Utilisez des pthreads ou des workers Wasm. Cela permet de partager le travail entre de nombreux nœuds de calcul, mais nécessite un accès SharedArrayBuffer, ce qui peut impliquer l'ajout d'en-têtes HTTP COOP/COEP.
Refactorisez le code C/C++ pour éviter les appels de longue durée. Par exemple, en divisant le travail en petits morceaux pouvant être appelés depuis
requestIdleCallback.
3. Faites attention aux avertissements et aux erreurs d'exécution.
Assurez-vous de tester le programme WebAssembly obtenu et qu'aucun avertissement ni aucune erreur ne sont générés dans la console.
Créez et exécutez les programmes avec -sASSERTIONS activé, puis corrigez les éventuelles erreurs d'exécution qui se produisent.
4. Éviter l'association dynamique si possible
Emscripten fonctionne mieux avec les bibliothèques statiques (.a). Les bibliothèques partagées (.so, .dylib, .dll) sont moins utiles dans le déploiement du navigateur et peuvent compliquer inutilement les choses.
5. Porter des bibliothèques C/C++ existantes
Lorsque vous intégrez des bibliothèques C/C++ existantes à des systèmes de compilation standards :
Projets CMake
Encapsulez les commandes CMake avec emcmake et emmake :
mkdir build && cd build
emcmake cmake .. -DCMAKE_BUILD_TYPE=Release
emmake make
Projets Autoconf/Make
Utilisez emconfigure pour définir les cibles de la chaîne d'outils de compilation croisée :
emconfigure ./configure --host=wasm32-unknown-emscripten --disable-shared
emmake make