Cheerp 3.0, кампілятар C/C++ у JavaScript, перакладзены на ліцэнзіі Apache 2.0 і LLVM

Прадстаўлены кампілятар Cheerp 3.0, які дазваляе скампіляваць любы код C/C++ у WebAssembly ці JavaScript. Новая галінка характэрна перакладам кампілятара і спадарожных бібліятэк на выкарыстанне пермісіўных ліцэнзій Apache 2.0 і LLVM, замест раней ужывальнай абмежаванай ліцэнзійнай палітыкі, якая прапануе варыянт з ліцэнзіяй GPLv2 для некамерцыйных праектаў і прапрыетарную ліцэнзію для камерцыйных. Код кампілятара заснаваны на напрацоўках LLVM і Clang, і ўключае дадатковыя аптымізацыі для павышэння прадукцыйнасці і памяншэнні памеру скампіляванага выніку.

Cheerp можа ўжывацца як для партавання існых C/C++ бібліятэк і прыкладанняў для выканання ў браўзэры, так і для стварэння высокапрадукцыйных web-прыкладанняў і WebAssembly-кампанентаў з нуля. Праект дазваляе камбінаваць у адным web-прыкладанні код на C/C++ і JavaScript з магчымасцю доступу з кода JavaScript да функцый, першапачаткова распрацаваным на C/C++, а з кода C/C++ да аб'ектаў JavaScript, JavaScript-бібліятэкам, Web API і ўсім магчымасцям DOM. Дапушчаецца стварэнне камбінаваных зборак, частка кода ў якіх кампілюецца ў JavaScript, а частка ў WebAssembly. Падтрымліваецца зборка праектаў, якія выкарыстоўваюць стандартныя бібліятэкі libc і libc++.

У параўнанні з кампілятарам Emscripten, Cheerp генеруе больш аптымізаваны і кампактны прамежкавы код WebAssembly (у сярэднім памер выніковых файлаў на 7% менш). Канцэптуальна адрозненні зводзяцца да таго, што Emscripten выкарыстоўваецца ў якасці аб'ектнага фармату WebAssembly і выконвае звязванне і аптымізацыю на стадыі постапрацоўкі WebAssembly (wasm-opt). У Cheerp у якасці прамежкавага прадстаўлення для бібліятэк і аб'ектных файлаў выкарыстоўваецца байткод у фармаце LLVM, што дазваляе ўжываць шырэйшыя аптымізацыі, якія ахопліваюць праект у цэлым і выкарыстоўвалыя метададзеныя на ўзроўні LLVM, без неабходнасці выканання постапрацоўкі.

Дадатковае ў Cheerp ужываюцца аптымізатар PreExecuter, які забяспечвае папераджальнае выкананне кода на этапе кампіляцыі, напрыклад, для пераўтварэння ў канстанты канструктараў, выкарыстоўваных для ініцыялізацыі глабальных аб'ектаў. Таксама пры кампіляцыі выкарыстоўваецца PartialExecuter, які на аснове аналізу параметраў функцый выдаляе код, які гарантавана не выкарыстоўваецца пры выкананні.

Cheer таксама можа генераваць код JavaScript для дынамічнай працы з памяццю, якая ахопліваецца зборшчыкам смецця. У прыватнасці, замест эмулявання традыцыйнай адраснай прасторы пры дапамозе тыпізаваных масіваў, Cheerp забяспечвае прамы мапінг аб'ектаў C++ у аб'екты JavaScript, што дазваляе зменшыць спажыванне памяці, бо зборшчык смецця JavaScript мае магчымасць выдаляць невыкарыстоўваныя аб'екты. Для падвышэння прадукцыйнасці ў генераваным прамежкавым кодзе WebAssembly ужываюцца SIMD-пашырэнні, якія дазваляюць арганізаваць распаралельванне выканання аперацый над дадзенымі.

Cheerp можа выкарыстоўвацца як платформа для стварэння інтэграваных кліент/серверных web-прыкладанняў на мове C++. У існуючай практыцы, звычайна асобна распрацоўваюцца выкананы ў браўзэры фронтэнд, напісаны на мове JavaScript, і паасобная серверная частка, напісаная на мовах PHP, Python, Ruby ці JavaScript/Node.js. Cheerp дае сродкі для стварэння цэласных web-прыкладанняў на мове C++, у якіх бэкэнд і фронтэнд падтрымліваюцца ў адзінай кодавай базе. У працэсе кампіляцыі серверная частка кампілюецца ў натыўны код, а інтэрфейс пераўтворыцца ў JavaScript-прадстаўленне. Адладка ўсіх кампанентаў праекта, у тым ліку пераўтвораных у JavaScript, ажыццяўляецца па зыходных тэкстах на мове C++ з выкарыстаннем тэхналогіі Source Map (пры ўзнікненні памылкі можна ўбачыць участак кода на C++, падтрымліваецца ўсталёўка кропак супыну ў кодзе C++ і парадковага пакрокавага выканання З++ кода ).

Крыніца: opennet.ru

Дадаць каментар