Cheerp 3.0, kompilátor C/C++ na JavaScript, migrovaný na licence Apache 2.0 a LLVM

Je představen kompilátor Cheerp 3.0, který vám umožní zkompilovat jakýkoli kód C/C++ do WebAssembly nebo JavaScriptu. Nová větev je pozoruhodná přesunem kompilátoru a doprovodných knihoven k používání permisivních licencí Apache 2.0 a LLVM namísto dříve aplikované omezené licenční politiky, která nabízí možnost licence GPLv2 pro nekomerční projekty a proprietární licence pro komerční. Kód kompilátoru je založen na vývoji LLVM a Clang a zahrnuje další optimalizace pro zlepšení výkonu a zmenšení velikosti kompilovaného výsledku.

Cheerp lze použít jak k portování existujících knihoven a aplikací 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. Projekt umožňuje kombinovat kód C/C++ a JavaScript v jedné webové aplikaci s možností přístupu z kódu JavaScript k funkcím původně vyvinutým v C/C++ a z kódu C/C++ k objektům JavaScript, JavaScript knihovny, Web API a všechny funkce DOM. Je povoleno vytvářet kombinovaná sestavení, část kódu, ve které je kompilována do JavaScriptu, a část do WebAssembly. Podporuje stavební projekty, které používají standardní knihovny libc a libc++.

Ve srovnání s kompilátorem Emscripten Cheerp generuje optimalizovanější a kompaktnější mezikód WebAssembly (velikost výsledných souborů je v průměru o 7 % menší). Koncepčně se rozdíly zmenšují na skutečnost, že Emscripten se používá jako objektový formát WebAssembly a provádí vazbu a optimalizaci ve fázi následného zpracování WebAssembly (wasm-opt). Cheerp používá bajtový kód LLVM jako zprostředkující reprezentaci knihoven a objektových souborů, což umožňuje širší optimalizace v rámci celého projektu, které využívají metadata na úrovni LLVM bez nutnosti následného zpracování.

Cheerp navíc používá optimalizátor PreExecuter, který poskytuje preemptivní spouštění kódu v době kompilace, například pro převod konstruktorů používaných k inicializaci globálních objektů na konstanty. Při kompilaci se také používá PartialExecuter, který na základě rozboru parametrů funkcí odstraní kód, který se při provádění zaručeně nepoužije.

Cheer může také generovat kód JavaScript pro dynamickou práci s pamětí pokrytou garbage collectorem. Konkrétně, místo emulace tradičního adresního prostoru s typovanými poli, Cheerp poskytuje přímé mapování C++ objektů na JavaScript objekty, což snižuje spotřebu paměti, protože JavaScript garbage collector má schopnost odstranit nepoužívané objekty. Pro zlepšení výkonu používá vygenerovaný mezikód WebAssembly rozšíření SIMD k organizaci paralelizace datových operací.

Cheerp lze použít jako platformu pro vytváření integrovaných webových aplikací klient/server v C++. V současné praxi je běžné vyvinout samostatný front-end založený na prohlížeči napsaný v JavaScriptu a samostatný back-end napsaný v PHP, Pythonu, Ruby nebo JavaScript/Node.js. Cheerp poskytuje prostředky k vytváření kompletních webových aplikací v C++, které podporují backend a frontend v jediné kódové základně. Během procesu kompilace je strana serveru 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, které jsou převedeny na JavaScript, se provádí pomocí zdrojových textů C++ pomocí technologie Source Map (pokud dojde k chybě, můžete vidět část kódu C++, nastavení zarážek v kódu C++ a krok po řádku -podporováno provádění kódu C++ po krocích).

Zdroj: opennet.ru

Přidat komentář