Cheerp 3.0, C/C++ naar JavaScript-compiler, gemigreerd naar Apache 2.0 en LLVM-licenties

De Cheerp 3.0-compiler is geïntroduceerd, waarmee u elke C/C++-code in WebAssembly of JavaScript kunt compileren. De nieuwe tak valt op door het verplaatsen van de compiler en de bijbehorende bibliotheken naar het gebruik van de tolerante Apache 2.0- en LLVM-licenties, in plaats van het eerder toegepaste beperkte licentiebeleid, waarbij een GPLv2-licentieoptie wordt aangeboden voor niet-commerciële projecten en een eigen licentie voor commerciële projecten. De compilercode is gebaseerd op ontwikkelingen van LLVM en Clang en bevat aanvullende optimalisaties om de prestaties te verbeteren en de omvang van het gecompileerde resultaat te verkleinen.

Cheerp kan zowel worden gebruikt voor het porten van bestaande C/C++-bibliotheken en -applicaties zodat deze in de browser kunnen worden uitgevoerd, als voor het helemaal opnieuw creëren van hoogwaardige webapplicaties en WebAssembly-componenten. Met het project kunt u code in C/C++ en JavaScript combineren in één webapplicatie, waarbij u vanuit JavaScript-code toegang krijgt tot functies die oorspronkelijk zijn ontwikkeld in C/C++, en van C/C++-code tot JavaScript-objecten, JavaScript-bibliotheken, Web API en alle functies DOM. Het is mogelijk om gecombineerde samenstellingen te maken, waarbij een deel van de code wordt gecompileerd in JavaScript, en een deel in WebAssembly. Het ondersteunt bouwprojecten die de standaardbibliotheken libc en libc++ gebruiken.

Vergeleken met de Emscripten-compiler genereert Cheerp meer geoptimaliseerde en compacte WebAssembly-tussencode (gemiddeld 7% kleinere resulterende bestanden). Conceptueel gezien zijn de verschillen dat Emscripten wordt gebruikt als een WebAssembly-objectformaat en de koppeling en optimalisatie uitvoert in de WebAssembly-nabewerkingsfase (wasm-opt). Cheerp gebruikt LLVM-bytecode als tussenrepresentatie voor bibliotheken en objectbestanden, waardoor bredere optimalisaties mogelijk zijn die het hele project bestrijken en metadata op LLVM-niveau gebruiken zonder de noodzaak van nabewerking.

Daarnaast maakt Cheerp gebruik van de PreExecuter-optimalisatie, die zorgt voor preventieve uitvoering van code in de compilatiefase, bijvoorbeeld om constructors die worden gebruikt om globale objecten te initialiseren, om te zetten in constanten. Ook wordt tijdens het compileren PartialExecuter gebruikt, dat op basis van de analyse van functieparameters code verwijdert die gegarandeerd niet zal worden gebruikt tijdens de uitvoering.

Cheer kan ook JavaScript-code genereren om het geheugen dat onder de garbage collector valt, dynamisch te manipuleren. In plaats van een traditionele adresruimte te emuleren met behulp van getypte arrays, biedt Cheerp met name directe mapping van C++-objecten aan JavaScript-objecten, wat het geheugenverbruik vermindert omdat de JavaScript-garbagecollector de mogelijkheid heeft om ongebruikte objecten te verwijderen. Om de prestaties te verbeteren, maakt de gegenereerde tussenliggende WebAssembly-code gebruik van SIMD-extensies die parallellisatie van gegevensbewerkingen mogelijk maken.

Cheerp kan worden gebruikt als platform voor het creëren van geïntegreerde client/server-webapplicaties in C++. In de huidige praktijk is het gebruikelijk om een ​​aparte in-browser front-end te ontwikkelen, geschreven in JavaScript, en een aparte back-end, geschreven in PHP, Python, Ruby of JavaScript/Node.js. Cheerp biedt tools voor het maken van complete webapplicaties in C++, waarbij de backend en frontend worden ondersteund in één codebasis. Tijdens het compilatieproces wordt de serverzijde gecompileerd in native code en wordt de interface omgezet in een JavaScript-representatie. Het debuggen van alle projectcomponenten, inclusief de componenten die naar JavaScript zijn geconverteerd, wordt uitgevoerd met behulp van bronteksten in C++ met behulp van Source Map-technologie (als er een fout optreedt, kunt u een gedeelte van de C++-code zien; het ondersteunt het instellen van breekpunten in C++-code en line-by -line stapsgewijze uitvoering van C++-code).

Bron: opennet.ru

Voeg een reactie