Cloudflare, Mozilla та Facebook розвивають BinaryAST для прискорення завантаження JavaScript

Інженери з компаній Cloudflare, Mozilla, Facebook та Bloomberg запропонували новий формат Двійковий AST для прискорення доставки та обробки JavaScript коду під час відкриття сайтів у браузері. BinaryAST виносить фазу синтаксичного розбору на бік сервера і постачає вже сформоване абстрактне синтаксичне дерево (АСТ). При отриманні BinaryAST браузер може перейти на стадію компіляції, минаючи парсинг вихідного коду JavaScript.

Для тестування підготовлена еталонна реалізація, яка постачається під ліцензій MIT. Для парсингу використовують компоненти Node.js, а код для оптимізації та формування AST написаний мовою Rust. На стороні браузерів підтримка
BinaryAST вже доступна в нічних зборках Firefox. Кодувальник BinaryAST може застосовуватися як на рівні інструментарію кінцевого сайту, так і для пакування скриптів зовнішніх сайтів на стороні проксі або мережі доставки контенту. В даний час вже розпочався процес стандартизації BinaryAST робочою групою ECMA TC39, після завершення якої формат зможе співіснувати разом з існуючими методами стиснення контенту, що віддається, такими як gzip і brotli.

Cloudflare, Mozilla та Facebook розвивають BinaryAST для прискорення завантаження JavaScript

Cloudflare, Mozilla та Facebook розвивають BinaryAST для прискорення завантаження JavaScript

Значний час при обробці JavaScript займає фаза завантаження та синтаксичного аналізу коду. З урахуванням того, що об'єм JavaScript, що завантажується, на багатьох популярних сайтах наближається до 10 Мб (наприклад для LinkedIn - 7.2Мб, Facebook - 7.1Мб, Gmail - 3.9Мб) первинна обробка JavaScript вносить істотну затримку. Стадія парсингу на стороні браузера також уповільнюється через неможливість повноцінної побудови AST на льоту, у міру завантаження коду (браузеру доводиться чекати завершення завантаження блоків коду, наприклад кінця функцій, для отримання інформації, що бракує для розбору поточних елементів).

Частково проблему намагаються вирішити через поширення коду в мінімізованому та стислому вигляді, а також за допомогою кешування браузером згенерованого байткоду. На сучасних сайтах код оновлюється досить часто, тому кешування лише частково вирішує проблему. Виходом міг би стати WebAssembly, але він вимагає використання явної типізації в коді і погано підходить для прискорення обробки вже існуючого коду JavaScript.

Іншим варіантом є доставка готового скомпільованого байткоду замість JavaScript-скриптів, але розробники браузерних движків виступають проти, так як сторонній байткод важко верифікувати, його пряма обробка може призвести до розшарування Web, виникають додаткові загрози безпеці і потрібна розробка формату універсального байтко.

BinaryAST дозволяє вписатися в поточну модель розробки та доставки коду без створення нового байткоду та зміни мови JavaScript. Розмір даних у форматі BinaryAST можна порівняти зі стисненим мініфікованим JavaScript-кодом, а швидкість обробки за рахунок виключення фази парсингу вихідних текстів помітно збільшується. Крім того, формат дозволяє виконувати компіляцію в байткод у міру завантаження BinaryAST, не очікуючи на завершення отримання всіх даних. Крім того, парсинг на стороні сервера дозволяє виключити з подання BinaryAST, що не використовується, і зайвий код, на який при парсингу на стороні браузера витрачається час як на розбір, так і на передачу зайвого трафіку.

Особливістю BinaryAST також є можливість відновлення JavaScript, що читається, не один в один збігається з вихідним варіантом, але семантично еквівалентного і включає ті ж імена змінних і функцій (BinaryAST зберігає імена, але не зберігає інформацію про позиції в коді, форматування і коментарі). Зворотною стороною медалі є поява нових векторів для атак, але на думку розробників вони значно менші та більш контрольовані, ніж при застосуванні альтернатив, таких поширення байткоду.

Тести коду facebook.com показали, що на аналіз JavaScript витрачається 10-15% ресурсів CPU і на парсинг йде більше часу, ніж на генерацію байткоду і початкове формування коду для JIT. У двигуні SpiderMonkey час повної побудови AST займає 500-800 мс і застосування BinaryAST дозволило скоротити цей показник на 70-90%.
Загалом для більшості web-феймроків при застосуванні BinaryAST час парсингу JavaScript скорочується на 3-10% у режимі без оптимізації та на 90-97% при включенні режиму ігнорування функцій, що не використовуються.
При виконанні тестового JavaScript-набору розміром 1.2 Мб застосування BinaryAST дозволило прискорити час початку запуску з 338 до 314 мс на настільній системі (Intel i7) і з 2019 до 1455 мс на мобільному пристрої (HTC One M8).

Джерело: opennet.ru

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