Der Compiler Cheerp 3.0 wurde vorgestellt, der es ermöglicht, jeden C/C++-Code in WebAssembly oder JavaScript zu kompilieren. Der neue Branch zeichnet sich dadurch aus, dass der Compiler und die zugehörigen Bibliotheken nun permissive Lizenzen wie die Apache 2.0 und LLVM verwenden, anstelle der zuvor angewandten restriktiven Lizenzpolitik, die eine GPLv2-Lizenz für nicht-kommerzielle Projekte und eine proprietäre Lizenz für kommerzielle Anwendungen bot. Der Compiler-Code basiert auf den Entwicklungen von LLVM und Clang und umfasst zusätzliche Optimierungen zur Verbesserung der Leistung und zur Reduzierung der Größe des kompilierten Ergebnisses.
Cheerp kann sowohl für das Portieren vorhandener C/C++-Bibliotheken und -Anwendungen zur Ausführung im Browser als auch für die Erstellung leistungsstarker Webanwendungen und WebAssembly-Komponenten von Grund auf verwendet werden. Das Projekt ermöglicht es, in einer einzigen Webanwendung C/C++- und JavaScript-Code zu kombinieren, sodass JavaScript auf Funktionen zugreifen kann, die ursprünglich in C/C++ entwickelt wurden, und im C/C++-Code auf JavaScript-Objekte, JavaScript-Bibliotheken, Web-APIs und sämtliche DOM-Funktionen zuzugreifen. Es ist möglich, kombinierte Builds zu erstellen, bei denen Teile des Codes in JavaScript und andere Teile in WebAssembly kompiliert werden. Die Erstellung von Projekten, die die Standardbibliotheken libc und libc++ verwenden, wird unterstützt.
Im Vergleich zum Emscripten-Compiler erzeugt Cheerp optimierteren und kompakteren WebAssembly-Zwischencode (im Durchschnitt sind die Enddateien um 7 % kleiner). Konzeptuell bestehen die Unterschiede darin, dass Emscripten als Objektformat für WebAssembly dient und das Linking sowie die Optimierung in der Post-Processing-Phase (wasm-opt) durchführt. Cheerp hingegen verwendet zur Repräsentation von Bibliotheken und Objektdateien Bytecode im LLVM-Format, was eine breitere Palette von Optimierungen ermöglicht, die das gesamte Projekt abdecken und Metadaten auf LLVM-Ebene nutzen, ohne dass eine Nachbearbeitung erforderlich ist.
Zusätzlich wird in Cheerp der PreExecuter-Optimierer eingesetzt, der eine vorzeitige Ausführung des Codes während der Kompilierung ermöglicht, um beispielsweise Konstruktoren, die zur Initialisierung globaler Objekte dienen, in Konstanten umzuwandeln. Des Weiteren kommt bei der Kompilierung der PartialExecuter zum Einsatz, der auf Basis der Analyse der Funktionsparameter Code entfernt, der während der Ausführung garantiert nicht verwendet wird.
Cheer kann auch JavaScript-Code generieren, der dynamisch mit dem durch den Garbage Collector verwalteten Speicher arbeitet. Anstatt den traditionellen Adressraum mit typisierten Arrays zu emulieren, bietet Cheer eine direkte Zuordnung von C++-Objekten zu JavaScript-Objekten, was den Speicherverbrauch reduziert, da der JavaScript-Garbage-Collector ungenutzte Objekte entfernen kann. Um die Leistung des generierten Intermediate Codes in WebAssembly zu steigern, werden SIMD-Erweiterungen verwendet, die die Parallelisierung der Datenoperationen ermöglichen.
Cheerp kann als Plattform zur Erstellung integrierter Client-/Server-Webanwendungen in C++ genutzt werden. In der aktuellen Praxis werden normalerweise das im Browser ausführbare Frontend, das in JavaScript geschrieben ist, und der separate Backend-Teil, der in PHP, Python, Ruby oder JavaScript/Node.js programmiert ist, unabhängig entwickelt. Cheerp bietet die Möglichkeit, vollständige Webanwendungen in C++ zu erstellen, bei denen Backend und Frontend aus einer einzigen Codebasis stammen. Während des Kompilierungsprozesses wird der Backend-Teil in nativen Code übersetzt, während das Interface in eine JavaScript-Darstellung umgewandelt wird. Das Debugging aller Projektkomponenten, einschließlich der in JavaScript umgewandelten Teile, erfolgt anhand der C++-Quelltexte unter Verwendung der Source Map-Technologie (bei einem Fehler wird der betreffende Codeabschnitt in C++ angezeigt, und es wird die Möglichkeit unterstützt, Haltepunkte im C++-Code zu setzen sowie schrittweises Debugging des C++-Codes durchzuführen).
Quelle: opennet.ru
