Silnik JavaScript Hermes oparty na otwartym kodzie źródłowym Facebooka

Lekki silnik JavaScript oparty na otwartym kodzie źródłowym Facebooka Hermes, zoptymalizowany do uruchamiania aplikacji opartych na frameworku React Native na platformie Android. Wsparcie Hermesa wbudowany w React Native, począwszy od dzisiejszej wersji 0.60.2. Projekt ma na celu rozwiązanie problemów związanych z długimi czasami uruchamiania natywnych aplikacji JavaScript i znacznym zużyciem zasobów. Kod pisemny w języku C++ i rozpowszechniany na licencji MIT.

Wśród zalet korzystania z Hermesa można wymienić skrócenie czasu uruchamiania aplikacji, zmniejszenie zużycia pamięci i zmniejszenie rozmiaru aplikacji. Podczas korzystania z V8 najbardziej czasochłonnymi etapami są etapy analizowania kodu źródłowego i kompilowania go w locie. Hermes przenosi te kroki na etap kompilacji i umożliwia dostarczanie aplikacji w postaci kompaktowego i wydajnego kodu bajtowego.

Do bezpośredniego uruchomienia aplikacji wykorzystywana jest stworzona w ramach projektu maszyna wirtualna wraz z śmieciarzem SemiSpace, który dystrybuuje bloki tylko w miarę potrzeb (On-demand), obsługuje przenoszenie i defragmentację bloków, zwracanie zwolnionej pamięci do systemu operacyjnego, bez okresowego skanowanie zawartości całej sterty.

Przetwarzanie JavaScriptu podzielone jest na kilka etapów. Najpierw analizuje się teksty źródłowe i generowana jest pośrednia reprezentacja kodu (Hermes IR), na podstawie reprezentacji SSA (Statyczne pojedyncze przypisanie). Następnie reprezentacja pośrednia jest przetwarzana w optymalizatorze, który stosuje techniki optymalizacji statycznej w przód w celu przekształcenia pierwotnego kodu pośredniego w bardziej wydajną reprezentację pośrednią, zachowując jednocześnie oryginalną semantykę programu. W ostatnim etapie generowany jest kod bajtowy dla zarejestrowanej maszyny wirtualnej.

W silniku wspierany przez stanowi część standardu JavaScript ECMAScript 2015 (ostatecznym celem jest jego pełna obsługa) i zapewnia kompatybilność z większością istniejących aplikacji React Native. Hermes zdecydował się nie wspierać lokalnego wykonywania eval(), z instrukcjami, odbiciem (Reflect i Proxy), Intl API i niektórymi flagami w RegExp. Aby włączyć Hermes w aplikacji React Native, wystarczy dodać do projektu opcję „enableHermes: true”. Możliwe jest również zbudowanie Hermesa w trybie CLI, co pozwala na uruchamianie dowolnych plików JavaScript z linii poleceń. Do debugowania dostępny jest tryb leniwej kompilacji, który pozwala nie kompilować JavaScriptu za każdym razem podczas procesu programowania, ale generować kod bajtowy w locie już na urządzeniu.

Jednocześnie Facebook nie planuje adaptacji Hermesa pod Node.js i inne rozwiązania, skupiając się wyłącznie na aplikacjach mobilnych (kompilacja AOT zamiast JIT jest najbardziej optymalna w kontekście systemów mobilnych, które mają ograniczoną pamięć RAM i wolniejszy Flash). Wstępne testy wydajności przeprowadzone przez pracowników Microsoft ujawnioneże korzystając z Hermes, aplikacja Microsoft Office na Androida staje się dostępna do użytku w 1.1 sekundy. po uruchomieniu i zużywa 21.5 MB pamięci RAM, natomiast przy korzystaniu z silnika V8 uruchomienie zajmuje 1.4 sekundy, a zużycie pamięci wynosi 30 MB.

Dodatek: Facebook opublikowany własne wyniki badań. W przypadku korzystania z Hermesa z aplikacją MatterMost czas rozpoczęcia dostępności do pracy (TTI, Time To Interact) skrócił się z 4.30 do 2.01 sekundy, rozmiar pakietu APK zmniejszył się z 41 do 22 MB, a zużycie pamięci ze 185 do 136 MB.

Źródło: opennet.ru

Dodaj komentarz