Facebook открыл код JavaScript-движка Hermes
12 июля 2019 года
Компания 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 Мб.
Источники править
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.