Cheerp : un compilateur C++ pour le Web
La récente sortie de Cheerp 3.0 , un compilateur permettant de compiler tout code C/C++ en WebAssembly ou JavaScript , est remarquable . Cette nouvelle version se distingue par l'adoption des licences permissives Apache 2.0 et LLVM pour le compilateur et ses bibliothèques, en remplacement de la politique de licences restrictive précédente qui proposait une licence GPLv2 pour les projets non commerciaux et une licence propriétaire pour les projets commerciaux.
Cheerp peut être utilisé à la fois pour porter des applications et des bibliothèques C/C++ existantes à exécuter dans le navigateur, ou pour créer des applications Web hautes performances et des composants WebAssembly à partir de rien.
Cela fait plus d'un an depuis la version précédente de Cheerp ( Cheerp 2.7 ), et cette nouvelle version regorge de nouvelles fonctionnalités et d'optimisations qui, une fois de plus, font évoluer l'état de l'art de l'utilisation de C++ comme langage de programmation pour les applications Web. Jeux.
Plus important encore, avec cette version, nous apportons un changement significatif au modèle de licence de Cheerp. Depuis Cheerp 3.0, tous les composants et bibliothèques de base du compilateur sont désormais sous licence permissive sous la licence Apache 2.0/LLVM. Cela marque une rupture radicale avec notre précédent modèle de licence commerciale GPLv2/double, permettant à Cheerp 3.0 d'être utilisé à n'importe quelle fin, sans restriction.
À propos de Cheerp
Ce projet permet de combiner du code C/C++ et JavaScript dans une application web, autorisant ainsi l'accès, depuis le code JavaScript, aux fonctions initialement développées en C/C++, et depuis le code C/C++ aux objets JavaScript, aux bibliothèques JavaScript, aux API web et à toutes les fonctionnalités du DOM. Il permet également la création d'applications hybrides, avec du code compilé en JavaScript et en WebAssembly. Il prend en charge les projets utilisant les bibliothèques standard libc et libc++.
Comparé au compilateur Emscripten, Cheerp génère un code intermédiaire WebAssembly plus optimisé et plus compact (en moyenne, la taille des fichiers résultants est inférieure de 7 %).
Conceptuellement, la différence principale réside dans le fait qu'Emscripten est utilisé comme format d'objet WebAssembly et effectue la liaison et l'optimisation lors de la phase de post-traitement WebAssembly (wasm-opt). Cheerp, quant à lui, utilise le bytecode LLVM comme représentation intermédiaire pour les bibliothèques et les fichiers objets, permettant ainsi des optimisations plus larges à l'échelle du projet qui exploitent les métadonnées LLVM sans nécessiter de post-traitement.
De plus, Cheerp utilise l'optimiseur PreExecuter pour exécuter du code de manière préventive lors de la compilation, par exemple pour convertir en constantes les constructeurs servant à initialiser les objets globaux. Par ailleurs, lors de la compilation, il utilise PartialExecuter qui, en analysant les paramètres des fonctions, supprime le code qui ne sera certainement pas utilisé à l'exécution.
Cheerp peut également générer du code JavaScript pour interagir dynamiquement avec la mémoire libérée par le ramasse-miettes. Concrètement, au lieu d'émuler un espace d'adressage traditionnel avec des tableaux écrits manuellement, Cheerp établit une correspondance directe entre les objets C++ et les objets JavaScript, réduisant ainsi la consommation de mémoire grâce à la suppression automatique des objets inutilisés par le ramasse-miettes de JavaScript. Pour optimiser encore les performances, le code intermédiaire WebAssembly généré utilise des extensions SIMD afin de paralléliser les opérations sur les données.
Cheerp peut servir de plateforme pour développer des applications web client/serveur intégrées en C++. De nos jours, il est courant de développer une interface utilisateur distincte, côté navigateur, écrite en JavaScript, et un serveur distinct, écrit en PHP, Python, Ruby ou JavaScript/Node.js.
Cheerp fournit les moyens de créer des applications Web C++ complètes qui prennent en charge à la fois le backend et le frontend dans une seule base de code.
Pendant le processus de génération, le côté serveur est compilé en code natif et l'interface est convertie en une représentation JavaScript. Le débogage de tous les composants du projet, y compris ceux convertis en JavaScript, est effectué à l'aide de textes sources C++ à l'aide de la technologie Source Map.
Enfin, si vous souhaitez en savoir plus à ce sujet , vous trouverez les détails en suivant ce lien.
Le code du compilateur est basé sur les développements LLVM et Clang et inclut des optimisations supplémentaires pour améliorer les performances et réduire la taille de la sortie compilée.