Facebook адкрыў код JavaScript-рухавічка Hermes

Кампанія Facebook адкрыла зыходныя тэксты легкаважнага JavaScript-рухавічка Гермес, аптымізаванага для выканання прыкладанняў на базе фрэймворка рэагаваць Native на платформе Android. Падтрымка Hermes убудавана у React Native пачынаючы з сённяшняга выпуску 0.60.2. Праект закліканы вырашыць праблемы з вялікім часам запуску натыўных JavaScript-прыкладанняў і значным спажываннем рэсурсаў. Код напісаны на мове C++ і распаўсюджваецца пад ліцэнзіяй MIT.

З добрых якасцяў ужывання Hermes адзначаецца скарачэнне часу запуску прыкладання, зніжэнне спажывання памяці і памяншэнне памеру прыкладання. Пры ўжыванні V8 найболей працяглымі з'яўляюцца стадыі парсінгу зыходнага кода і яго кампіляцыі на лета. Hermes выносіць гэтыя стадыі на этап зборкі і дазваляе пастаўляць прыкладанні ў форме кампактнага і эфектыўнага байткода.

Для непасрэднага выканання прыкладання ўжываецца распрацаваная ў рамках праекту віртуальная машына са зборшчыкам смецця SemiSpace, размяркоўвалым блокі толькі па неабходнасці (On-demand), якія падтрымліваюць перасоўванне і дэфрагментацыю блокаў з аддачай якая вызвалілася памяці аперацыйнай сістэме, які абыходзіцца без перыядычнага сканавання змесціва ўсёй кучы.

Апрацоўка JavaScript падзяляецца на некалькі стадый. Спачатку ажыццяўляецца парсінг зыходных тэкстаў і генерацыя прамежкавага прадстаўлення кода (Hermes IR), заснаванага на прадстаўленні SSA (Static Single Assignment). Далей, прамежкавае ўяўленне апрацоўваецца ў аптымізатары, які ўжывае тэхнікі папераджальнай статычнай аптымізацыі для пераўтварэння першаснага прамежкавага кода ў больш эфектыўнае прамежкавае ўяўленне, захоўваючы пры гэтым арыгінальную семантыку праграмы. На апошнім этапе генеруецца байткод для рэгістравай віртуальнай машыны.

У рухавічку падтрымліваецца частка JavaScript-стандарту ECMAScript 2015 (канчатковай мэтай з'яўляецца яго поўная падтрымка) і забяспечваецца сумяшчальнасць з большасцю наяўных прыкладанняў React Native. У Hermes вырашана не падтрымліваць лакальны запуск eval(), выразы "with", рэфлексію (Reflect і Proxy), API Intl API і некаторыя сцягі ў RegExp. Для ўключэння Hermes у дадатку React Native дастаткова дадаць у праект опцыю "enableHermes: true". Таксама магчымая зборка Hermes у рэжыме CLI-інтэрфейсу, якая дазваляе выканаць адвольныя JavaScript-файлы з каманднага радка. Для адладкі даступны рэжым lazy-кампіляцыі, які дазваляе ў працэсе распрацоўкі не кампіляваць JavaScript кожны раз, а генераваць байткод на лета ўжо на прыладзе.

Пры гэтым Facebook не плануе адаптаваць Hermes для Node.js і іншых рашэнняў, засяроджваючы ўвагу толькі на мабільных прыкладаннях (AOT-кампіляцыя замест JIT найболей аптымальная ў кантэксце мабільных сістэм, у якіх абмежаваны памер аператыўнай памяці і павальнейшыя Flash). Праведзенае супрацоўнікамі Microsoft папярэдняе тэсціраванне прадукцыйнасці паказала, Што пры выкарыстанні Hermes прыкладанне Microsoft Office для Android становіцца даступна для працы праз 1.1/21.5 сек. пасля запуску і спажывае 8MB АЗП, у той час як пры выкарыстанні рухавічка V1.4 на запуск марнуецца 30/XNUMX сек., а спажыванне памяці складае XNUMXMB.

Дадатак: Facebook апублікаваў вынікі ўласных тэстаў. Пры выкарыстанні Hermes з дадаткам MatterMost час пачатку даступнасці для працы (TTI, Time To Interact) паменшылася 4.30 да 2.01 сек., памер APK-пакета скараціўся з 41 да 22 Мб, а спажыванне памяці з 185 да 136 Мб.

Крыніца: opennet.ru

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