Co nowego w silniku JavaScript V8 firmy Google w wersji 7

Wersja beta V8 7.4 jest już dostępna, z możliwością rozszerzenia zasięgu silnika na platformy takie jak Apple iOS. V8 to mechanizm JavaScript i WebAssembly firmy Google o otwartym kodzie źródłowym dla przeglądarki Chrome. Jest to podstawowy element zarówno przeglądarki Chrome, jak i środowiska wykonawczego JavaScript Node.js.

Skąd pobrać Google V8

Możesz pobrać wersję produkcyjną Google V8 z repozytorium Chromium V8.

Przyszła wersja: Co nowego w V8 wersja 7.4

Wraz z wersją produkcyjną, która ma się ukazać w kwietniu 2019 r., Google V8 beta 7.4 ma następujące nowe funkcje:

  • Wersja 8 bez JIT, w której obsługa JavaScript jest obsługiwana bez przydzielania pamięci wykonywalnej w czasie wykonywania. Może to pozwolić na rozszerzenie V8 na platformy takie jak Apple iOS, telewizory smart i konsole do gier. Domyślna konfiguracja V8 opierała się na możliwości przydzielania i modyfikowania pamięci wykonywalnej w czasie wykonywania. Są jednak sytuacje, w których może być pożądane uruchomienie silnika bez przydzielania pamięci wykonywalnej, na przykład platformy, które zakazały dostępu do zapisu do niewykonalnej pamięci dla nieuprzywilejowanych aplikacji, w tym iOS. Ponadto blokowanie zapisów do pamięci wykonywalnej zmniejsza powierzchnię ataku aplikacji na exploity. W trybie bez JIT V8 przełącza się na tryb tylko interpretera dla JavaScript; WebAssembly obecnie nie obsługuje tego trybu. Tryb bez JIT wiąże się jednak ze spadkiem wydajności.
  • Wątki / Atomics WebAssembly są teraz włączone w systemach operacyjnych innych niż Android. To posunięcie odblokowuje użycie wielu rdzeni poprzez WebAssembly, umożliwiając nowe, wymagające dużej mocy obliczeniowej zastosowania w sieci.
  • Aby poprawić wydajność, wersja 7.4 pomija w niektórych przypadkach adaptację argumentów, zmniejszając obciążenie połączeń o 60 procent.
  • Poprawiono wydajność wywoływania natywnych metod dostępu, które są akcesoriami DOM.
  • Wydajność preparsera została poprawiona poprzez usunięcie deduplikacji obejmującej nazwy właściwości. Ponadto naprawiono problem z wydajnością, który obejmował niestandardowe dekodowanie UTF-8 używane przez strumień źródłowy.
  • Aby zmniejszyć obciążenie pamięci, zaimplementowano obsługę opróżniania skompilowanego kodu bajtowego z funkcji podczas czyszczenia pamięci, jeśli nie były one ostatnio wykonywane.
  • Aby obsługiwać pola klasy prywatnej, programiści mogą oznaczyć pole jako prywatne, dodając do niego #przedrostek.

Skąd pobrać wersję beta V8 7.4

Możesz pobrać wersję beta V8 z repozytorium Google Chromium Git.

Bieżąca wersja: Co nowego w V8 wersja 7.3

Nowe funkcje w wersji 8 7.3 obejmują:

  • --async-stack-tracesFlaga jest włączona domyślnie.
  • Ślady stosu asynchronicznego o zerowym koszcie ułatwiają diagnozowanie problemów w środowisku produkcyjnym za pomocą kodu asynchronicznego; stacknieruchomość zazwyczaj wysyłane do plików i usług dziennika teraz zapewnia lepszy wgląd w problemy.
  • Szybszy await, z --harmony-await-optimizationdomyślnie włączoną flagą. Jest to warunek wstępny --async-stack-traces.
  • Szybsze uruchamianie WebAssembly dzięki optymalizacji. W przypadku większości obciążeń kompilacja poprawia się o 15–25%.
  • Funkcje JavaScript, takie jak fromEntries()API do wykonywania odwrotności Object.entriesString.prototype.Matchall, API ułatwiające stosowanie globalnych lub lepkich wyrażeń regularnych do łańcucha i iterowanie przez wszystkie dopasowania.

Bieżąca wersja: Co nowego w Google V8 w wersji 7.2

Wersja 7.2 V8 ze stycznia 2019 r. Ulepsza analizowanie JavaScript, format binarny WebAssembly i pamięć.

Aby przyspieszyć parsowanie, wersja 8 V8 zawiera to, co Google nazywa najszybszym parserem JavaScript w tym silniku, co skutkuje szybszym ładowaniem stron i bardziej responsywnymi stronami. Od wersji V8 7.0 szybkość analizowania komputerów wzrosła o około 30 procent, twierdzi Google.

W przypadku pamięci wbudowane wbudowane funkcje, które oszczędzają pamięć, udostępniając wygenerowany kod w wielu izolatach, są teraz obsługiwane i domyślnie włączone w architekturze IA32.

W przypadku WebAssembly wersja 8 7.2 zawiera ulepszenia generowania kodu, w tym włączenie podziału węzłów w harmonogramie kompilatora optymalizującego i rotację pętli w zapleczu. Ponadto ulepszono buforowanie opakowania i wprowadzono niestandardowe opakowania w celu zmniejszenia narzutu podczas wywoływania importowanych funkcji matematycznych JavaScript.

Zmiany projektowe w alokatorze rejestrów poprawiają wydajność wzorców kodu, które pojawią się w późniejszej wersji. Ponadto programy obsługi pułapek w wersji 7.2 poprawiają przepustowość kodu WebAssembly. Są zaimplementowane w systemach Windows, MacOS i Linux. W Chromium są one włączone w systemie Linux, z MacOs i Windows, które mają być śledzone po potwierdzeniu stabilności. W planach jest też udostępnienie ich na Androida.

Inne nowe funkcje w wersji 8 7.2 obejmują:

  • Poprawiono wydajność elementów rozkładających, gdy występują one na początku literału tablicy.
  • Szybsza async/ await implementacja jest domyślnie włączona. Zmiana może zostać włączona do oficjalnej specyfikacji ECMAScript.
  • Ślady stosu asynchronicznego zerowego wybrzeża wzbogacają stackwłaściwość o asynchroniczne ramki wywołań. Ta funkcja jest dostępna za --async-stack-tracesflagą wiersza polecenia.
  • Obsługa pól klas publicznych, która rozszerza składnię JavaScript w celu uproszczenia.
  • ListFormatPropozycja, do lokalizowania formatowania list.
  • stringify teraz wyświetla sekwencje ucieczki dla samotnych surogatów, dzięki czemu dane wyjściowe są poprawne w standardzie Unicode.

Poprzednia wersja: Co nowego w Google V8 w wersji 7.1

Wersja 7.1 V8 z listopada 2018 r. Zawiera ulepszenia pamięci i wydajności, a także ulepszenia zarówno dla JavaScript, jak i formatu binarnego WebAssembly. W przypadku pamięci, kody bajtowe interpretera są teraz osadzone w pliku binarnym, oszczędzając średnio około 200 KB na izolat. Aby poprawić wydajność, analiza ucieczki w kompilatorze TurboFan została rozszerzona o obsługę lokalnych kontekstów funkcji dla funkcji wyższego rzędu, gdy zmienne z otaczającego kontekstu przechodzą do lokalnego zamknięcia. W przypadku analizy ucieczki zastępowanie skalarne jest wykonywane dla obiektów lokalnych dla jednostki optymalizacji.

Inne nowe funkcje w wersji V8 7.1:

  • W przypadku języka JavaScript RelativeTimeformatudostępniony w aktualizacji interfejs API umożliwia zlokalizowane formatowanie względnych czasów, takich jak „wczoraj”, bez poświęcania wydajności. Również wersja 7.1 obsługuje tę GlobalThispropozycję, zapewniając uniwersalny mechanizm dostępu do obiektu globalnego nawet w ściśle określonych funkcjach lub modułach, niezależnie od platformy.
  • W przypadku formatu kodu bajtowego WebAssembly postMessagejest obsługiwany dla modułów. To zachowanie jest ograniczone do procesów roboczych sieci Web i nie jest rozszerzane na scenariusze międzyprocesowe.

Poprzednia wersja: Co nowego w Google V8 w wersji 7.0

Wersja 7.0 V8 z października 2018 r. Zawiera podgląd wątków WebAssembly, które zapewniają prymityw do obliczeń równoległych. Aby korzystać z wątków w przeglądarce Chrome, która korzysta z V8, programiści mogą ją włączyć za pośrednictwem chrome://flags/#enable-webassembly-threadslub zarejestrować się w wersji próbnej Origin, aby eksperymentować z nowymi funkcjami internetowymi. WebAssembly, znany również jako Wasm, umożliwia kompilację kodu napisanego w różnych językach do uruchomienia w sieci.

Inne nowe funkcje w wersji 8 7.0 obejmują:

  • W przypadku JavaScript descriptionwłaściwość jest dodawana do prototype, zapewniając bardziej ergonomiczny sposób dostępu do opisu. W Array.prototype.sortwersji 7.0 staje się również stabilny.
  • Rozszerzenie wbudowanych wbudowanych, które oszczędzają pamięć, udostępniając wygenerowany kod w wielu izolatach. V8 wersja 6.9 włączono wbudowane funkcje w architekturze X64, podczas gdy wersja 7.0 rozszerza je na pozostałe platformy oprócz IA-32.

Poprzednia wersja: Co nowego w Google V8 w wersji 6.9

Wersja 6.9 V8 z września 2018 r. Skupia się na poprawie pamięci i wydajności silnika JavaScript Google.

Aby oszczędzać pamięć, wersja 6.9 oferuje wbudowane wbudowane funkcje dla komputerów z procesorami x64. Są to funkcje wspólne dla wszystkich izolatów i osadzone w samym pliku binarnym zamiast kopiowania ich na stercie JavaScript, dzięki czemu istnieją w pamięci tylko raz, niezależnie od liczby uruchomionych izolatów. Projektanci V8 zauważyli średnio 9-procentową redukcję rozmiaru sterty w 10 000 najpopularniejszych witryn internetowych na komputerach x64. Wsparcie dla innych platform nastąpi w późniejszych wersjach.

Ze względu na wydajność, wersja 6.9 V8 skraca czasy przerw w usuwaniu elementów bezużytecznych w programie Mark-Compact, usprawniając WeakMapprzetwarzanie. Teraz można przetwarzać znakowanie równoczesne i przyrostowe WeakMaps. Wcześniej ta praca była wykonywana podczas ostatniej atomowej przerwy w usuwaniu elementów bezużytecznych Mark-Compact. Wyrzucanie elementów bezużytecznych wykonuje teraz więcej pracy równolegle z krótszymi czasami przerw.

Ze względu na wydajność DataViewmetody zostały ponownie zaimplementowane w V8 Torque, oszczędzając kosztowne wywołanie C ++ w porównaniu z poprzednią implementacją środowiska wykonawczego. Ponadto wywołania DataViewmetod są teraz wbudowywane podczas kompilowania JavaScript do optymalizującego kompilatora TurboFan. Zapewnia to lepszą wydajność szczytową dla kodu aktywnego.

V8 wersja 6.9 zawiera także Liftoff, podstawowy kompilator dla formatu kodu przenośnego WebAssembly. Jest on domyślnie włączony i ma na celu skrócenie czasu uruchamiania aplikacji opartych na zestawie WebAssembly poprzez jak najszybsze generowanie kodu. Jakość samego kodu jest drugorzędnym priorytetem dla Liftoff, a kod ostatecznie zostanie ponownie skompilowany przez kompilator TurboFan V8.

Liftoff został opracowany w celu rozwiązania problemu, w którym zaplecze procesu kompilacji dla TurboFan zajmowało dużo czasu i pamięci, zmniejszając wydajność kodu WebAssembly. Liftoff pozwala uniknąć czasu i narzutu pamięci reprezentacji pośredniej, generując kod maszynowy w jednym przejściu przez kod bajtowy funkcji WebAssembly. Liftoff i Turbofan zapewniają V8 dwa poziomy kompilacji, z Liftoff kompilatorem bazowym do szybkiego uruchamiania i TurboFan zapewniającym optymalizację pod kątem wydajności.

Google planuje również dalsze skrócenie czasu uruchamiania, zmniejszenie zużycia pamięci i udostępnienie korzyści z Liftoff większej liczbie użytkowników. Plany te obejmują porty do procesorów ARM do użytku na urządzeniach mobilnych. Liftoff obecnie działa tylko na platformach Intel 32- i 64-bitowych. Inne rozważane ulepszenia obejmują:

  • Wdrażanie dynamicznej warstwy dla urządzeń mobilnych, aby pomieścić mniejsze ilości pamięci na tych urządzeniach. Trwają eksperymenty z połączeniem leniwej kompilacji z funkcją Liftoff i dynamiczną warstwą gorących funkcji w TurboFan.
  • Poprawa wydajności generowania kodu Liftoff i ulepszanie generowanego kodu.

Poprzednia wersja: Co nowego w V8 w wersji 6.8.0

Google V8 wersja 6.8, wydana w lipcu 2018 r., Koncentruje się na wydajności i wykorzystaniu pamięci.

Wydajność została zwiększona dzięki ulepszeniom niszczenia macierzy. Optymalizujący kompilator nie generował idealnego kodu do niszczenia macierzy, więc konstruktorzy V8 zablokowali analizę ucieczki, aby wyeliminować tymczasową alokację, co spowodowało, że zniszczenie tablicy przy użyciu tymczasowej tablicy było tak szybkie, jak sekwencja przypisań.

Nowa implementacja Object.POOL poprawia wydajność poprzez implementację szybkiej ścieżki dla JavaScript.

Wydajność dla TypedArrays została zwiększona w przypadkach, gdy sortowanie odbywa się za pomocą funkcji porównania.

Inne nowe funkcje w V8 w wersji 6.8 obejmują:

  • Aby zwiększyć szybkość wykonywania za pomocą przenośnego formatu kodu WebAssembly, programiści mogą używać sprawdzania granic opartych na pułapkach, optymalizacji zarządzania pamięcią, na platformach Linux x64.
  • Zmniejszono zużycie pamięci przez funkcje SFI ( SharedFunctionInfo) dzięki kompresji i usunięciu niepotrzebnych pól.
  • Aby poprawić możliwości pamięci, zerwano zależność od SFI, w której SFI były niepotrzebnie utrzymywane przy życiu, co doprowadziło do ryzyka wycieków pamięci.

Poprzednia wersja: Co nowego w V8 w wersji 6.7

Mechanizm JavaScript V8 firmy Google otrzymuje ulepszenia funkcji językowych i bezpieczeństwa w gałęzi wersji 6.7, która jest teraz w wersji produkcyjnej.

Silnik V8 6.7 ma BigIntdomyślnie włączoną obsługę. Oczekiwana w przyszłej wersji ECMAScript,  BigIntssłuży jako numeryczny prymityw w JavaScript do reprezentowania liczb całkowitych z dowolną precyzją. Dzięki BigInt, możliwe jest wykonywanie arytmetyki liczb całkowitych bez przepełnienia. BigIntmoże służyć jako podstawa ostatecznej BigDecimalimplementacji, przydatnej do przedstawiania sum pieniędzy z dokładnością do dziesiętnych.

Wersja 8 6.7 zawiera również więcej środków ograniczających zagrożenie dla luk bocznych, mających na celu zapobieganie wyciekom informacji do niezaufanego kodu JavaScript i WebAssembly.

Poprzednia wersja: Co nowego w V8 w wersji 6.6

Wersja 6.6 silnika JavaScript V8 firmy Google koncentruje się na funkcjach języka JavaScript i możliwościach buforowania kodu.

W przypadku języka JavaScript Function.prototype.toString()zwraca dokładne fragmenty tekstu kodu źródłowego, w tym spacje i komentarze. V8 wersja 6.6 również implementuje String.prototype.trimStart() and String.prototype.trimEnd(). Ta możliwość była dostępna za pomocą niestandardowych metod trimLeft()i trimRight()metod, które pozostają aliasami nowych metod, aby umożliwić wsteczną kompatybilność.

Ponadto w literałach ciągów można używać symboli separatorów wierszy i akapitów, dopasowując w ten sposób kod JSON. Wcześniej były one traktowane jako terminatory linii w literałach łańcuchowych, a ich użycie powodowało wyjątek SyntaxError.

Array.prototype.values Metoda daje macierzami tego samego interfejsu iteracji jako ECMAScript 2015 Map i Setkolekcjach. Te mogą być przejęte przez interakcje keys,values albo entriesprzez wywołanie tej samej nazwie metody. Ta zmiana może być niezgodna z istniejącym kodem JavaScript; programiści, którzy zauważą dziwne lub nieprawidłowe zachowanie w witrynie, mogą spróbować wyłączyć tę funkcję za pośrednictwem chrome://flags/#enable-array-prototype-values.