Інженери з компаній Cloudflare, Mozilla, Facebook та Bloomberg
Для тестування
BinaryAST вже доступна в
Значний час при обробці 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