Facebook відкрив код JavaScript-движка Hermes

Компанія Facebook відкрила вихідні тексти легковажного JavaScript-движка Hermes, оптимізованого для виконання додатків на базі фреймворку React 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.5MB ОЗУ, у той час як при використанні двигуна V8 на запуск витрачається 1.4 сек., а споживання пам'яті становить 30MB.

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

Джерело: opennet.ru

Додати коментар або відгук