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
