V8 wersja 8.6 – faza beta silnika Google
V8 jest silnikiem stanowiącym podstawę Node.js. Działa on samodzielnie lub jest osadzony w dowolnej aplikacji C++. Twórcy 21 września opublikowali kolejną gałąź – V8 wersja 8.6 – na razie w fazie beta. W tej fazie będzie do czasu wydania koordynacji ze stabilnym Chrome 86. Nowa wersja silnika posiada wiele różnych gadżetów dla programistów.
#BLM
Nowy V8 sprawia, że baza kodu ma większy szacunek. W związku z ruchem Black Lives Matters wiele programów i narzędzi zmieniło stosowane pojęcia – GitHub zmienia gałąź „master” na „main”, by nie stosować odniesień do niewolnictwa. Ponieważ Google także wydało zobowiązania dotyczące równości rasowej, to V8 zastąpił niektóre terminy w projekcie.
Otwarty JS-Fuzzer w V8 wersja 8.6
JS-Fuzzer to oparty na mutacjach fuzzer JavaScript, który teraz stał się projektem open source. Przede wszystkim mutuje on istniejące przypadki testowe między silnikami. Korzysta przy tym z transformacji Babel AST, skonfigurowanych przez rozszerzalne klasy muratorów.
Przyspieszenia w Number.prototype.toString
Ogólnie konwersja liczby JS na łańcuch jest dość złożoną operacją. Należy zwracać uwagę na wiele czynników, np. notację naukową, NaN, nieskończoności, precyzję zmiennoprzecinkową czy zaokrąglenia. Programista nie zna długości łańcucha przed jego obliczeniem. Dlatego też implementacja Number.prototype.toString przeniosłoby się do funkcji środowiska wykonawczego C++.
V8 wersja 8.6 redukuje koszty związane z wywoływaniem funkcji uruchomieniowej C++ dla prostszych operacji jak drukowanie małych liczb całkowitych (Smi). Współpraca z Microsoftem zaowocowała nową, prostszą i szybszą ścieżką właśnie dla małych liczb całkowitych. Ścieżkę Number.prototype.toString napisano w Torque, dzięki czemu zmniejszono narzuty i poprawiono drukowanie mikro znaków o 75%.
Inne zmiany JS w V8
Wywołanie Atomics.wake przemianowano na Atomics.notify. Dzięki temu dopasowano ją do zmian specyfikacji we wcześniejszej wersji 7.3. Kolejną zmianą jest dodanie właściwości Symbol.toStringTag do obiektu Reflect. Ostatnią w dziale JS jest właściwość .name klas anonimowych, której wartością jest pusty ciąg ”.
WebAssembly – SIMD w Liftoff
Podstawowym kompilatorem dla WebAssembly jest Liftoff. Propozycja SIMD pozwala WebAssembily na korzystanie z dostępnych funkcji wektorowych do przyspieszenia sprzętowego intensywnych obliczeniowo obciążeń. Dotychczas SIMD zaimplementowano wyłącznie w TurboFan – kompilatorze V8. Dzięki temu wydajność instrukcji SIMD jest maksymalna. Na poniższym wykresie widać różnicę w implementowaniu funkcji pobierającej tablicę liczb zmiennoprzecinkowych i ograniczającej jej wartości do zera, korzystając z Liftoff oraz TurboFan. Jako bazę użyto skalarnej implementacji Liftoff.
Liftoff SIMD jest nawet 2,8 razy szybszy od skalarnego Liftoff. Z kolei TurboFan SIMD wykazuje 7,5 razy większą prędkość.
V8 wersja 8.6 z szybszymi połączeniami Wasm do JS
Ostatnią zmianą przy WebAssembly jest dodanie łatki firmy Microsoft, która pozwala uniknąć wywołania przez adapter argumentów. Jeśli WebAssembly wywołuje zaimportowaną funkcję JavaScript, korzystamy z tak zwanego opakowania Wasm-to-JS. To opakowanie tłumaczy argumenty na obiekty zrozumiałe przez JS. Z kolei przy zwrocie wywołania JS – tłumaczy je na wartości zrozumiałe przez WebAssembly.
W przypadku wykrycia niezgodności w liczbie argumentów wywołuje się „trampolinę adaptera argumentów”. Często jednak jest to zbędna operacja – gdy funkcja nie korzysta z obiektu arguments. Wtedy właśnie nowa łatka unika wywołania przez adapter argumentów. Dzięki temu wywołania są znacznie bardziej przyśpieszone.
V8 wersja 8.6 API
Do API V8 dodano nową funkcję Isolate::HasPendingBackgroundTasks, która pozwala programistom sprawdzać, czy istnieją w tle oczekujące prace. Dzięki temu rozwiązano problem wyłączania V8, mimo nieukończonej kompilacji WebAssembly, która dalej rozpoczyna dalsze wykonywanie skryptu. Isolate::HasPendingBackgroundTasks umożliwia programatorowi czekać na nowe zadania pierwszego planu zamiast wyłączania V8.