Cheerp 3.0, C/C++ to JavaScript fordító, Apache 2.0 és LLVM licencekre migrálva

Bemutatjuk a Cheerp 3.0 fordítót, amely lehetővé teszi bármilyen C/C++ kód WebAssembly vagy JavaScript formátumba történő fordítását. Az új ág figyelemre méltó, hogy a fordítóprogramot és a kísérő könyvtárakat áthelyezi a megengedő Apache 2.0 és LLVM licencek használatára, a korábban alkalmazott korlátozott licencelési politika helyett, amely GPLv2 licencet kínál a nem kereskedelmi projektekhez és saját licencet a kereskedelmi projektekhez. A fordítókód az LLVM és a Clang fejlesztésein alapul, és további optimalizálásokat tartalmaz a teljesítmény javítása és a lefordított eredmény méretének csökkentése érdekében.

A Cheerp használható meglévő C/C++ könyvtárak és alkalmazások böngészőben történő futtatására, valamint nagy teljesítményű webalkalmazások és WebAssembly összetevők létrehozására a semmiből. A projekt lehetővé teszi a C / C ++ és a JavaScript kód kombinálását egy webalkalmazásban azzal a lehetőséggel, hogy JavaScript kódból hozzáférjen az eredetileg C / C ++ nyelven kifejlesztett funkciókhoz, és C / C ++ kódból JavaScript objektumokhoz, JavaScript könyvtárak, webes API és minden DOM szolgáltatás. Lehetőség van kombinált összeállítások létrehozására, amelyekben a kód egy része JavaScript-be, más része pedig WebAssembly-be van fordítva. Támogatja a libc és libc++ szabványos könyvtárakat használó projektek felépítését.

Az Emscripten fordítóhoz képest a Cheerp optimalizáltabb és kompaktabb WebAssembly közbenső kódot generál (átlagosan 7%-kal kisebb a kapott fájlok mérete). Koncepcionálisan a különbségek abból fakadnak, hogy az Emscripten WebAssembly objektumformátumként használatos, és a WebAssembly utófeldolgozási szakaszában (wasm-opt) végzi az összerendelést és az optimalizálást. A Cheerp az LLVM bájtkódot használja a könyvtárak és objektumfájlok közbenső reprezentációjaként, lehetővé téve a szélesebb körű projektszintű optimalizálást, amely LLVM-szintű metaadatokat használ utófeldolgozás nélkül.

Ezenkívül a Cheerp a PreExecuter optimalizálót használja, amely a fordítási időben megelőző kódfuttatást biztosít, például a globális objektumok inicializálására használt konstruktorok konstanssá alakításához. A fordítás során a PartialExecuter is használatos, amely a függvényparaméterek elemzése alapján eltávolítja azt a kódot, amely garantáltan nem kerül felhasználásra a végrehajtás során.

A Cheer JavaScript kódot is generálhat, hogy dinamikusan működjön a szemétgyűjtő által lefedett memóriával. Ahelyett, hogy hagyományos címteret emulálna gépelt tömbökkel, a Cheerp a C++ objektumok közvetlen leképezését biztosítja JavaScript objektumokhoz, ami csökkenti a memóriafelhasználást, mivel a JavaScript szemétgyűjtő képes eltávolítani a nem használt objektumokat. A teljesítmény javítása érdekében az előállított WebAssembly közbenső kód SIMD-kiterjesztéseket használ az adatműveletek párhuzamosításának megszervezéséhez.

A Cheerp platformként használható integrált kliens/szerver webalkalmazások készítéséhez C++ nyelven. A jelenlegi gyakorlatban elterjedt egy különálló böngésző alapú, JavaScript nyelven írt előtér és egy PHP, Python, Ruby vagy JavaScript/Node.js nyelven írt külön háttér kifejlesztése. A Cheerp lehetőséget biztosít olyan komplett C++ webalkalmazások készítésére, amelyek egyetlen kódbázisban támogatják a backendet és a frontendet. A fordítási folyamat során a szerveroldal natív kódba kerül, a felület pedig JavaScript-reprezentációvá alakul. A projekt összes összetevőjének hibakeresése, beleértve a JavaScript-re konvertáltakat is, C++ forrásszövegekkel történik a Source Map technológia segítségével (ha hiba történik, akkor láthat egy C++ kódrészletet, töréspontokat állíthat be a C++ kódban és soronkénti lépést). a C++ kód lépésenkénti végrehajtása támogatott).

Forrás: opennet.ru

Hozzászólás