Cloudflare, Mozilla i Facebook rozwijają BinaryAST w celu przyspieszenia ładowania JavaScript

Inżynierowie z firm Cloudflare, Mozilla, Facebook i Bloomberg zapropnowano nowy format BinaryAST w celu przyspieszenia dostarczania i przetwarzania kodu JavaScript podczas otwierania stron w przeglądarkach. BinaryAST przenosi fazę analizy składniowej na serwer i dostarcza już utworzone abstrakcyjne drzewo składniowe (AST). Po otrzymaniu BinaryAST przeglądarka może od razu przejść do etapu kompilacji, omijając analizę kodu źródłowego JavaScript.

Do testowania przygotowano referencyjna implementacja udostępniana na licencji MIT. Do analizy używane są komponenty Node.js, a kod do optymalizacji i tworzenia AST napisany jest w języku Rust. Po stronie przeglądarek wsparcie
BinaryAST jest już dostępne w nocnych wersjach Firefox. Koder w BinaryAST może być stosowany zarówno na poziomie narzędzi końcowej strony, jak i do pakowania skryptów stron zewnętrznych po stronie proxy lub sieci dostarczania treści. W chwili obecnej rozpoczął się już proces standaryzacji BinaryAST przez grupę roboczą ECMA TC39, po zakończeniu której format będzie mógł współistnieć z istniejącymi metodami kompresji dostarczanych treści, takimi jak gzip i brotli.

Cloudflare, Mozilla i Facebook rozwijają BinaryAST w celu przyspieszenia ładowania JavaScript

Cloudflare, Mozilla i Facebook rozwijają BinaryAST w celu przyspieszenia ładowania JavaScript

Znaczny czas przetwarzania JavaScript zajmuje faza ładowania i analizy składniowej kodu. Biorąc pod uwagę, że rozmiar ładowanego JavaScript na wielu popularnych stronach zbliża się do 10 MB (na przykład LinkedIn — 7,2 MB, Facebook — 7,1 MB, Gmail — 3,9 MB) wstępne przetwarzanie JavaScript wprowadza istotne opóźnienie. Faza analizy składniowej po stronie przeglądarki również zwalnia z powodu niemożności pełnego zbudowania AST w czasie rzeczywistym, razem z ładowaniem kodu (przeglądarka musi czekać na zakończenie ładowania bloków kodu, na przykład końca funkcji, aby uzyskać brakujące informacje potrzebne do analizy bieżących elementów).

Częściowo problem ten próbuje się rozwiązać poprzez rozpowszechnianie kodu w zminimalizowanej i skompresowanej formie, a także przy pomocy pamięci podręcznej przeglądarki, która generuje kod bajtowy. Na nowoczesnych stronach kod jest aktualizowany dość często, dlatego pamięci podręczne jedynie częściowo rozwiązują problem. Rozwiązaniem mogłoby być WebAssembly, ale wymaga ono użycia jawnej typizacji w kodzie i nie nadaje się do przyspieszenia przetwarzania już istniejącego kodu JavaScript.

Innym rozwiązaniem jest dostarczenie gotowego skompilowanego bajtkodu zamiast skryptów JavaScript, jednak deweloperzy silników przeglądarek są przeciwni temu, ponieważ zewnętrzny bajtkod jest trudny do weryfikacji, a jego bezpośrednie przetwarzanie może prowadzić do rozwarstwienia Web, pojawiają się dodatkowe zagrożenia dla bezpieczeństwa i wymagana jest rozwój formatu uniwersalnego bajtkodu.

BinaryAST pozwala na wpasowanie się w obecny model rozwoju i dostarczania kodu bez tworzenia nowego bajtkodu i bez zmiany języka JavaScript. Rozmiar danych w formacie BinaryAST jest porównywalny z skompresowanym, zminimalizowanym kodem JavaScript, a prędkość przetwarzania wzrasta znacząco dzięki wyeliminowaniu fazy analizy tekstów źródłowych. Dodatkowo, format umożliwia kompilację do bajtkodu podczas ładowania BinaryAST, nie czekając na zakończenie odbioru wszystkich danych. Co więcej, analiza po stronie serwera pozwala na wykluczenie z przekazywanego przedstawienia BinaryAST nieużywanych funkcji i zbędnego kodu, na co przy analizie po stronie przeglądarki tracony jest czas zarówno na analizę, jak i na przesyłanie zbędnego ruchu.

Cechą BinaryAST jest również możliwość odtworzenia czytelnego JavaScriptu, który nie jest identyczny z oryginałem, ale semantycznie równoważny i zawiera te same nazwy zmiennych oraz funkcji (BinaryAST zachowuje nazwy, ale nie przechowuje informacji o pozycjach w kodzie, formatowaniu i komentarzach). Drugą stroną medalu jest pojawienie się nowych wektorów ataków, ale według deweloperów są one znacznie mniejsze i bardziej kontrolowane niż w przypadku alternatyw, jak np. rozpowszechnianie bajtkodu.

Testy kodu facebook.com wykazały, że analizowanie JavaScriptu zajmuje 10-15% zasobów CPU, a analiza zajmuje więcej czasu niż generowanie bajtkodu i początkowe formowanie kodu do JIT. W silniku SpiderMonkey czas pełnego budowania AST wynosi 500-800 ms, a zastosowanie BinaryAST pozwoliło skrócić ten czas o 70-90%.
Ogólnie rzecz biorąc, dla większości frameworków webowych przy zastosowaniu BinaryAST czas analizy JavaScriptu skraca się o 3-10% w trybie bez optymalizacji i o 90-97% przy włączeniu trybu ignorowania nieużywanych funkcji.
Podczas testowania zestawu JavaScript o rozmiarze 1,2 MB użycie BinaryAST pozwoliło skrócić czas uruchamiania z 338 do 314 ms na komputerach stacjonarnych (Intel i7) oraz z 2019 do 1455 ms na urządzeniach mobilnych (HTC One M8).

Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster