Перейти к основному содержимому

Релиз V8 версии 8.5

· 4 мин. чтения
Зейнеп Чанкера, отслеживающий некоторые Карты

Каждые шесть недель мы создаем новую ветку V8 в рамках нашего процесса релиза. Каждая версия отделяется от основной ветки Git V8 непосредственно перед этапом бета-релиза Chrome. Сегодня мы рады объявить о нашей новейшей ветке, V8 версии 8.5, которая находится в стадии бета до своего релиза вместе с Chrome 85 Stable через несколько недель. V8 v8.5 наполнен множеством полезных функций для разработчиков. Этот пост предоставляет предварительный обзор некоторых ключевых моментов в ожидании релиза.

JavaScript

Promise.any и AggregateError

Promise.any — это комбинатор обещаний, который разрешает результирующее обещание, как только одно из входных обещаний выполнено.

const promises = [
fetch('/endpoint-a').then(() => 'a'),
fetch('/endpoint-b').then(() => 'b'),
fetch('/endpoint-c').then(() => 'c'),
];
try {
const first = await Promise.any(promises);
// Любое из обещаний было выполнено.
console.log(first);
// → например, 'b'
} catch (error) {
// Все обещания были отклонены.
console.assert(error instanceof AggregateError);
// Логируем значения отклонений:
console.log(error.errors);
}

Если все входящие обещания отклонены, результирующее обещание отклоняется с объектом AggregateError, содержащим свойство errors, которое содержит массив значений отклонений.

Подробнее смотрите в нашем объяснении.

String.prototype.replaceAll

String.prototype.replaceAll предоставляет простой способ заменить все вхождения подстроки без создания глобального RegExp.

const queryString = 'q=query+string+parameters';

// Работает, но требует экранирования внутри регулярных выражений.
queryString.replace(/\+/g, ' ');
// → 'q=query string parameters'

// Проще!
queryString.replaceAll('+', ' ');
// → 'q=query string parameters'

Подробнее смотрите в нашем объяснении.

Операторы логического присваивания

Операторы логического присваивания — это новые составные операторы присваивания, которые объединяют логические операции &&, || или ?? с присваиванием.

x &&= y;
// Приблизительно эквивалентно x && (x = y)
x ||= y;
// Приблизительно эквивалентно x || (x = y)
x ??= y;
// Приблизительно эквивалентно x ?? (x = y)

Обратите внимание, что, в отличие от математических и битовых составных операторов присваивания, операторы логического присваивания выполняют присваивание только при определенных условиях.

Прочитайте наше объяснение для более детального ознакомления.

WebAssembly

Liftoff на всех платформах

Начиная с V8 версии 6.9, Liftoff используется как базовый компилятор для WebAssembly на платформах Intel (а Chrome 69 включил его на десктопных системах). Так как мы опасались увеличения памяти (из-за большего объема кода, создаваемого базовым компилятором), мы до сих пор задерживали его для мобильных систем. После экспериментов в последние месяцы мы уверены, что увеличение памяти незначительное в большинстве случаев, поэтому мы наконец включили Liftoff по умолчанию на всех архитектурах, обеспечивая более быструю компиляцию, особенно на устройствах arm (32- и 64-бит). Chrome 85 следует этому и включает Liftoff.

Включена поддержка многозначных возвращаемых значений

Поддержка WebAssembly для многозначных блоков кода и возвращаемых значений функций теперь доступна для общего использования. Это отражает недавнее слияние предложения в официальном стандарте WebAssembly и поддерживается всеми уровнями компиляции.

Например, теперь это допустимая функция WebAssembly:

(func $swap (param i32 i32) (result i32 i32)
(local.get 1) (local.get 0)
)

Если функция экспортирована, её можно вызвать из JavaScript, и она возвращает массив:

instance.exports.swap(1, 2);
// → [2, 1]

Наоборот, если функция JavaScript возвращает массив (или любой итератор), её можно импортировать и вызвать как функцию с многозначным возвращаемым значением внутри модуля WebAssembly:

new WebAssembly.Instance(module, {
imports: {
swap: (x, y) => [y, x],
},
});
(func $main (result i32 i32)
i32.const 0
i32.const 1
call $swap
)

Более важно, что теперь инструментальные цепочки могут использовать эту функцию для создания более компактного и быстрого кода внутри модуля WebAssembly.

Поддержка JS BigInts

Поддержка WebAssembly для преобразования значений WebAssembly I64 из и в JavaScript BigInts была внедрена и доступна для общего использования согласно последним изменениям в официальном стандарте.

Таким образом, функции WebAssembly с параметрами и значениями возвращения типа i64 могут быть вызываны из JavaScript без потерь точности:

(module
(func $add (param $x i64) (param $y i64) (result i64)
local.get $x
local.get $y
i64.add)
(export "add" (func $add)))

Из JavaScript можно передавать только BigInts в качестве параметров I64:

WebAssembly.instantiateStreaming(fetch('i64.wasm'))
.then(({ module, instance }) => {
instance.exports.add(12n, 30n);
// → 42n
instance.exports.add(12, 30);
// → TypeError: parameters are not of type BigInt
});

V8 API

Пожалуйста, используйте git log branch-heads/8.4..branch-heads/8.5 include/v8.h для получения списка изменений API.

Разработчики с активным репозиторием V8 могут использовать git checkout -b 8.5 -t branch-heads/8.5 для экспериментов с новыми функциями в V8 v8.5. Альтернативно можно подписаться на бета-канал Chrome и вскоре самостоятельно попробовать новые функции.