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

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

· 3 мин. чтения
Ингвар Степанян ([@RReverser](https://twitter.com/RReverser))

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

JavaScript

Метод at

Новый метод at теперь доступен для массивов, типизированных массивов и строк. Когда ему передается отрицательное значение, он выполняет относительную индексацию с конца индексируемого объекта. Когда передается положительное значение, он работает так же, как доступ через свойство. Например, [1,2,3].at(-1) возвращает 3. Подробнее читайте в нашем описании.

Общая область сжатия указателей

V8 поддерживает сжатие указателей на 64-битных платформах, включая x64 и arm64. Это достигается путем разделения 64-битного указателя на две половины. Верхние 32 бита можно рассматривать как базу, а нижние 32 бита — как индекс в этой базе.

            |----- 32 бита -----|----- 32 бита -----|
Указатель: |________база_______|_______индекс______|

В настоящее время одна изолированная область (Isolate) выполняет все выделения памяти в куче GC в пределах 4 ГБ виртуальной памяти "клетки", что гарантирует, что у всех указателей один и тот же верхний 32-битный базовый адрес. При фиксированном базовом адресе 64-битные указатели можно передавать только используя 32-битный индекс, поскольку полный указатель можно восстановить.

Начиная с версии 9.2, по умолчанию все изолированные области (Isolates) в процессе делят одну и ту же 4 ГБ клетку виртуальной памяти. Это сделано в ожидании прототипирования экспериментальных функций общей памяти в JavaScript. Поскольку у каждого рабочего потока есть своя собственная изолированная область и, следовательно, своя клетка виртуальной памяти размером 4 ГБ, указатели нельзя было передавать между изолированными областями в их собственных клетках, так как они не делили один и тот же базовый адрес. Это изменение также снижает давление на виртуальную память при запуске рабочих потоков.

Обратной стороной этого изменения является то, что общий размер кучи V8 для всех потоков процесса ограничен максимум 4 ГБ. Это ограничение может быть нежелательным для серверных рабочих нагрузок, где порождается множество потоков на процесс, так как это приведет к более быстрому исчерпанию виртуальной памяти. Встроенные системы могут отключить совместное использование клетки сжатия указателей с помощью GN-аргумента v8_enable_pointer_compression_shared_cage = false.

API V8

Используйте команду git log branch-heads/9.1..branch-heads/9.2 include/v8.h, чтобы получить список изменений в API.

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