V8 8.7 beta – silnik Google ze zmianami JavaScript
Minął kolejny miesiąc, co oznacza nową wersję silnika V8. Tym razem jest to wydanie V8 8.7 beta. Każde wydanie silnika jest powiązane z publikowaną stabilną wersją Chrome Beta. Do czasu koordynacji silnika z Chrome 87 Stable, silnik pozostanie w fazie beta. Tak samo było także z wcześniejszymi wersjami – 8.6 i 8.4. Najnowsza wersja posiada kilka gadżetów dla programistów, m.in. szybkie połączenia JS, a także Atomics.waitAsync.
Atomics.waitAsync w V8 8.7 beta
Znane już wcześniej funkcje Atomics.wait i Atomics.notify, typy prymitywne niskiego poziomu, przydają się do implementowania m.in. wzajemnych wykluczeń (mutex). Jednak pierwszego z tych typów nie można wywołać w głównym wątku, blokuje się. Dlatego też zespół pracujący nad silnikiem V8 opracował nową, nieblokującą opcję – Atomics.waitAsync.
API jest oparte na obietnicach. Atomics.waitAsync zwraca jedną z następujących wartości:
- lokalizacja pamięci nie zawiera oczekiwanej wartości – {async: false, value: ‘not-equal’}
- wyłącznie dla natychmiastowego przekroczenia czasu 0 – {async: false, value: ‘timed-out’}
- {async: true, value: promise}
Promise może się później rozwiązać jako wartość ciągu ‘ok’ lub ‘timed-out’, jednak nigdy nie jest odrzucona.
Przykład wykorzystania Atomics.waitAsync
Atomics.waitAsync posiada także następujące parametry:
- Buffer – łańcuch Int32Array lub BigInt64Array,
- Index – poprawny indeks w tablicy,
- ExpectedValue – wartość, której spodziewamy się w miejscu pamięci opisanym przez (buffer, index),
- Timeout – limit czasu w milisekundach (opcjonalnie, domyślnie Infinity).
Przykładowy zapis: Atomics.waitAsync(i32a, 0, 0, 1000)
Poniżej znajduje się przykładowe wykorzystanie typu:
const sab = new SharedArrayBuffer(16);
const i32a = new Int32Array(sab);
const result = Atomics.waitAsync(i32a, 0, 0, 1000);
// | | ^ timeout (opt)
// | ^ expected value
// ^ index
if (result.value === 'not-equal') {
// The value in the SharedArrayBuffer was not the expected one.
} else {
result.value instanceof Promise; // true
result.value.then(
(value) => {
if (value == 'ok') { /* notified */ }
else { /* value is 'timed-out' */ }
});
}
// In this thread, or in another thread:
Atomics.notify(i32a, 0);
Natywne wywołania JavaScript
Nowa wersja silnika ma ulepszony interfejs API do wykonywania natywnych wywołań z JS. Przede wszystkim celem API jest poprawa wydajności natywnych interfejsów graficznych w Chrome. Programistom daje także nowe sposoby tworzenia instancji programu v8::FunctionTemplate. Ponadto interfejs API korzysta z niejawnego wnioskowania o funkcjach, co pozwala na stworzenie wewnętrznej struktury (v8 :: CFunctionInfo).
Jest to na razie funkcja eksperymentalna. Uruchamia się ją przez flagę – -turbo-fast-api-calls w V8, a także w Chrome: – -enable-unsafe-fast-js-calls.
API nowego V8 8.7 beta
Przede wszystkim, aby uzyskać listę zmian interfejsu API, należy skorzystać z git log branch-heads/8.6..branch-heads/8.7 include/v8.h. Programiści mogą skorzystać także z git checkout -b 8.7 -t branch-heads/8.7, aby poeksperymentować z nowymi funkcjami silnika.
Źródło: V8.dev