Cheerp: C++ kompilátor pro web
Za zmínku stojí nedávné vydání kompilátoru Cheerp 3.0 , který umožňuje kompilovat libovolný kód C/C++ do WebAssembly nebo JavaScriptu . Tato nová větev je pozoruhodná tím, že kompilátor a jeho doprovodné knihovny přesunuly na použití permisivních licencí Apache 2.0 a LLVM namísto dříve používané omezené licenční politiky, která nabízela možnost licence GPLv2 pro nekomerční projekty a proprietární licenci pro komerční projekty.
Cheerp lze použít jak k portování stávajících aplikací a knihoven C/C++ pro provoz v prohlížeči, tak k vytváření vysoce výkonných webových aplikací a komponent WebAssembly od začátku.
Od předchozího vydání Cheerp ( Cheerp 2.7 ) uběhl více než rok a tato nová verze je nabitá novými funkcemi a optimalizacemi, které opět posouvají stav techniky používání C++ jako programovacího jazyka pro webové aplikace. hry.
A co je nejdůležitější, s touto verzí provádíme významnou změnu v licenčním modelu Cheerp. Od Cheerp 3.0 jsou nyní všechny základní komponenty a knihovny kompilátoru povoleny pod licencí Apache 2.0/LLVM. To znamená radikální odklon od našeho předchozího modelu GPLv2/duální komerční licence, který umožňuje použití Cheerp 3.0 pro jakýkoli účel bez omezení.
O Cheerpovi
Projekt umožňuje kombinovat kód C/C++ a JavaScript ve webové aplikaci, což umožňuje přístup z kódu JavaScript k funkcím původně vyvinutým v C/C++ a z kódu C/C++ k objektům JavaScript, knihovnám JavaScript, webovým API a všem funkcím DOM. Umožňuje také vytváření hybridních sestavení, kde část kódu je kompilována v JavaScriptu a část ve WebAssembly. Podporuje projekty sestavení, které používají standardní knihovny libc a libc++.
Ve srovnání s kompilátorem Emscripten generuje Cheerp optimalizovanější a kompaktnější mezikód WebAssembly (v průměru je velikost výsledných souborů o 7 % menší).
Koncepčně se rozdíly redukují na fakt, že Emscripten se používá jako objektový formát WebAssembly a provádí linkování a optimalizaci v postprocessingové fázi WebAssembly (wasm-opt). Cheerp používá bytecode LLVM jako mezilehlou reprezentaci pro knihovny a objektové soubory, což umožňuje širší optimalizace v celém projektu, které využívají metadata na úrovni LLVM bez nutnosti postprocessingu.
Cheerp navíc používá optimalizátor PreExecuter k preventivnímu spuštění kódu v době kompilace, například k převodu konstruktorů používaných k inicializaci globálních objektů na konstanty. Během kompilace dále používá PartialExecuter, který na základě analýzy parametrů funkcí odstraňuje kód, u kterého je zaručeno, že nebude během provádění použit.
Cheerp dokáže také generovat kód JavaScript pro dynamickou práci s pamětí pokrytou garbage collectorem. Konkrétně namísto emulace tradičního adresního prostoru s ručně psanými poli poskytuje Cheerp přímé mapování objektů C++ na objekty JavaScriptu, čímž snižuje spotřebu paměti, protože garbage collector JavaScriptu může odstranit nepoužívané objekty. Pro další zlepšení výkonu používá generovaný mezikód WebAssembly rozšíření SIMD k paralelizaci datových operací.
Cheerp lze použít jako platformu pro vytváření integrovaných webových aplikací typu klient/server v jazyce C++. V současné praxi je běžné vyvíjet samostatný frontend pro prohlížeč napsaný v JavaScriptu a samostatný backend napsaný v PHP, Pythonu, Ruby nebo JavaScriptu/Node.js.
Cheerp poskytuje prostředky k vytváření kompletních webových aplikací v jazyce C++, které podporují backend i frontend v jediné kódové základně.
Během procesu sestavování je serverová strana zkompilována do nativního kódu a rozhraní je převedeno na reprezentaci JavaScriptu. Ladění všech komponent projektu, včetně těch převedených do JavaScriptu, se provádí pomocí zdrojových textů C++ pomocí technologie Source Map.
A konečně, pokud se chcete o tomto tématu dozvědět více , podrobnosti naleznete na následujícím odkazu.
Kód kompilátoru je založen na vývoji LLVM a Clang a zahrnuje další optimalizace pro zlepšení výkonu a snížení velikosti kompilovaného výstupu.