|
Французский математик Фабрис Беллар (Fabrice Bellard), основавший в своё время проекты QEMU, FFmpeg, BPG, QuickJS, TinyGL и TinyCC, опубликовал новый JavaScript-движок для встраиваемых систем - Micro QuickJS, способный компилировать и выполнять JavaScript-программы, потребляя всего 10 КБ ОЗУ. Вместе с Си-библиотекой движок занимает примерно 100 КБ постоянной памяти. Возможна компиляция JavaScript в байткод и отдельный запуск байткода. Код проекта написан на языке Си и распространяется под лицензией MIT.
Движок поддерживает подмножество языка JavaScript, близкое к спецификации ECMAScript 5 (ES2019), но предъявляющее более строгие требования к коду и не допускающее использования некоторых неэффективных или приводящих к ошибкам JavaScript-конструкций. Например, глобальные переменные обязательно должны объявляться через ключевое слово "var", запрещено использование "with", массивы не могут иметь пустоты, невозможна инициализация при объявлении вида "new Number(1)", из eval невозможен доступ к локальным переменным.
Производительность Micro QuickJS близка к движку QuickJS, развиваемому Фабрисом c 2019 года. В Micro QuickJS задействована часть кода из движка QuickJS, но архитектура во многом отличается и спроектирована для минимального потребления памяти. Например, в Micro QuickJS задействован трассирующий сборщик мусора, в то время как в QuickJS использован подсчёт ссылок. Накладные расходы сборщика мусора составляют всего несколько бит на каждый выделенный блок памяти. Для выделения памяти используется собственный аллокатор, не зависящий от библиотечной функции malloc().
Другие отличия от QuickJS: не использующая стек виртуальная машина; иное внутреннее представление объектов; хранение строк в кодировке UTF-8; генерация стандартной библиотеки во время компиляции и её хранение в постоянной памяти с созданием в ОЗУ всего нескольких объектов; близкий к QuickJS, но не использующий рекурсию, парсер; совмещение в одном проходе генерации байткода и оптимизации (в QuickJS имеется несколько проходов для оптимизации).
|