La version 4.0 des outils Emscripten a été publiée, permettant de compiler du code en C/C++ et d'autres langages pour lesquels des front-ends basés sur LLVM existent, en un code intermédiaire bas niveau WebAssembly universel. Le résultat obtenu peut être utilisé pour l'intégration avec des projets JavaScript, l'exécution dans un navigateur web, l'utilisation dans Node.js ou la création d'applications multiplateformes autonomes, exécutables via un runtime wasm. Le code du projet est distribué sous la licence MIT. Le compilateur utilise les travaux du projet LLVM, et pour la génération de WebAssembly et l'optimisation, la bibliothèque Binaryen est sollicitée.
L'objectif principal d'Emscripten est de créer un outil permettant d'exécuter du code Web indépendamment du langage de programmation dans lequel ce code a été initialement écrit. Les applications compilées peuvent faire appel aux bibliothèques standard C et C++ (libc, libcxx), aux extensions C++, au multithreading basé sur pthreads, à l'API POSIX et à de nombreuses bibliothèques multimédia. Des API sont également fournies pour l'intégration avec les API Web et le code JavaScript.
Emscripten prend en charge la traduction de la sortie de la bibliothèque SDL2 via Canvas et met également en œuvre le support d'OpenGL et EGL via l'API WebGL, ce qui permet de transformer des applications graphiques et des jeux en WebAssembly (par exemple, un port de l'ensemble d'outils Qt est disponible, les moteurs de jeu Unreal Engine et Unity sont pris en charge, ainsi que le moteur de simulation de processus physiques Bullet).
En plus de la compilation de code en C/C++, des projets distincts sont en cours de développement pour exécuter des interprètes dans les navigateurs et machines virtuelles pour les langages Lua, C#, Python, Ruby et Perl. De plus, il est possible d’appliquer des front-ends à LLVM, autres que Clang, par exemple, des front-ends pour des langages tels que Swift, Rust, D et Fortran.
L'attribution de la version 4.0 est liée à des modifications qui perturbent la compatibilité au niveau de l'ABI (lors de la reconstruction du projet dans Emscripten 4.0, il sera nécessaire de reconstruire les fichiers objets et les bibliothèques compilées avec les anciennes versions d'Emscripten). Les principaux changements dans Emscripten 4.0 :
- Une option « -sWASM_LEAGCY_EXCEPTIONS » a été ajoutée pour choisir entre les anciens et les nouveaux mécanismes de gestion des exceptions. Par défaut, l'ancien mécanisme est toujours utilisé, car tous les navigateurs n'ont pas mis en œuvre les fonctionnalités WebAssembly nécessaires pour le fonctionnement des nouveaux gestionnaires d'exceptions.
- Les composants compiler-rt, libcxx, libcxxabi et libunwind ont été mis à jour vers la branche LLVM 19.
- La version minimale prise en charge des builds du navigateur Safari (paramètre MIN_SAFARI_VERSION) a été augmentée de 14.1 à 15.0, ce qui a permis d'activer par défaut plusieurs fonctionnalités avancées de WebAssembly.
- L'utilisation de nouvelles instructions pour la conversion de float en int (nontrapping-fptoint) a été activée, qui au lieu de générer une exception en cas de dépassement de résultat renvoient la valeur minimale ou maximale possible (nécessaire pour SIMD).
- L'option WASM_BIGINT a été activée, permettant l'utilisation du type BigInt pour l'échange de valeurs entières 64 bits entre WebAssembly et le code JavaScript.
- L'option BULK_MEMORY a été activée, permettant l'utilisation des instructions WebAssembly memory.copy et memory.fill pour l'implémentation des fonctions C memcpy et memset.
- La normalisation des chemins (PATH.normalize()) a été désactivée dans la fonction PATH.basename(). Ainsi, l'appel 'PATH.basename("a/.")' renverra '.' au lieu de 'a', et 'PATH.basename("a/b/..")' renverra '..' au lieu de 'a'.
- Lors de l'utilisation de l'option '-sMODULARIZE', les fonctions factory créant et renvoyant des instances de modules et d'objets WebAssembly pour JavaScript sont désormais marquées comme 'async' lors de la compilation en mode WASM_ASYNC_COMPILATION, appliquée par défaut.
- Ajout de la possibilité d'indiquer des bibliothèques JavaScript en utilisant l'option '-lfoo.js'. Contrairement à l'option '--js-library', la recherche de la bibliothèque est effectuée dans tous les chemins spécifiés via l'option '-L'.
- Lors de la compilation en mode débogage (-O0 ou -sASSERTIONS), une version de débogage de la fonction malloc avec des vérifications assertif activées, détectant des erreurs telles que les doubles appels de la fonction free(), est utilisée par défaut.
Source : opennet.ru
