Russian

Все о движке V8 – пишем оптимизированный код самостоятельно

В этой статье читатель узнает более подробно о строительных блоках JavaScript V8. Зачем это нужно? Данная информация чрезвычайно важна для тех, кто работает над написанием кодов и приложений.

Предлагаем вниманию всех, кому интересна данная тема, полезные и действенные советы по написанию кодов JavaScript. Все советы проверены на практике авторитетными разработчиками.

Общие сведенья

Для начала определим понятие JavaScript-движка – это специальная программа/переводчик, реализующая код JavaScript. Это может быть как стандартный переводчик, так и программа, компилирующая JavaScript для байт-кода.

Подробнее о движке V8

В качестве примера рассмотрим движок V8 от талантливых разработчиков легендарной компании Google. Это движок, при написании которого применялся языке C++, так же, он имеет открытый исходный код. Его прямое назначение – браузер Google Chrome.

Приступив к разработке это движка, перед специалистами стояла задача существенно увеличить производительности выполнения JavaScript в интернет-браузере. И цель была достигнута – секрет заключается в том, что V8 компилирует код JavaScript на более высокий и эффективный, а не отправляет эту задачу переводчику. Машинный код преобразуется в системе jit – название которой буквально переводится как «точно в срок». И повышение производительности достигается тем, что движок сразу компилирует машинный код, пропуская промежуточный уровень.

Поговорим о движке В8, состоящем из двух компиляторов

Последняя версия В8 состоит из двух компиляторов:

– полный-что codegen — простейший компилятор, создающий обычные машинные коды, не отличающиеся высокой скоростью;

– коленвал — компилятор, работающий в системе jit, создающий быстрые и производительные коды.

В своей работе движок В8 использует разные потоки:

  • Основной поток – выполнение прямых задач. То есть – передача кода, его компиляция и реализация;
  • Дополнительный поток – оптимизирует коды, с целью разгрузки основного потока;
  • Потоки для обработки сборщиком мусора.

Как же все это работает? На стадии первого выполнения кода движок применяет полный-что codegen, задачей которого является преобразование кода в машинный. Так как промежуточная стадия (байт-код) не используется, то необходимость применения в работе переводчика устраняется сама собой.

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

Теперь вступает в работу коленвал – начинается оптимизация кода в дополнительной ветке. Суть оптимизации заключается в том, что В8 переводит код на JavaScript с абстрактного синтаксического дерева до высокого уровня статической одного назначения. Именно по такой схеме происходит подавляющее количество оптимизаций. О других видах подробнее стоит говорить только в конкретных случаях, сегодня эту тему можно упустить.

Первая стадия оптимизации – выстраивание, в процессе которой меняются местами место и тело вызова кода.

Скрытый класс

В целом, JavaScript – это прототипно-ориентированный язык. Иными словами, используя его, можно не только писать и создавать, но и клонировать процесс, что в разы упрощает работу разработчиков приложений. Динамичность этого языка позволяет вести работу над объектом уже после его создания – добавление/удаление/редактирований опций.

Многие программы интерпретации JavaScript применяют словарь структуры, что позволяет сохранять в памяти значения расположения объекта недвижимости. Эти значения чаще всего хранятся в непрерывном буфере памяти. Но поиск определенного объекта недвижимости при помощи словарей весьма затруднителен. Намного резоннее метод применяется в движке В8 – метод скрытых классов, работающий по принципу неподвижных макетов объектов.

Как это работает? При каждом добавлении нового свойства к определенному объекту, предыдущий класс переходит в разряд скрытого. Это очень важный момент, ведь скрытые моменты могут быть использованы и для других объектов, создаваемых аналогичным образом. К примеру, есть два объекта, разделяющих скрытый класс – в этом случае добавляемая опция автоматически присваивается им обоим:

function Point(x, y) {
    this.x = x;
    this.y = y;
}

var p1 = new Point(1, 2);

Кэширование

Движок V8 применяет метод инлайн кэширования. Иными словами, встроенное кэширование построено на наблюдении и при повторном вызове определенного метода, происходит тот же тип. Рассмотрим общее понятие кэширования – углубленные знания требуются только в определенных случаях.

Движок V8, в отличие от многих других популярных движков, не поддерживает кэш тех объектов, которые передавались в качестве параметров. Кэширование включается лишь в том случае, когда движок В8 имеет возможность выстроить предположение о типе объекта.

Что же связывает скрытые классы и кэширование? В том случае, когда на определенном объекте происходит вызов метода,  движок активирует функцию поиска скрытого класса, чтобы получить возможность определить смещения для доступа к конкретному объекту. Если аналогичные действия выполняются более двух раз, движок автоматически пропускает последнюю цепочку, сразу добавляя смещение.  Такое упрощение работы весьма положительно сказывается на скорости выполнения задачи.

А благодаря встроенному кэшированию все объекты одного типа имеют совместные скрытые классы. Но, в случае создания двух однотипных объектов с разными скрытыми классами, встроенное кэширование не работает.

Преобразование в машинный код

Как же происходит компиляция кода в машинный? Сначала движок V8 выполняет простейшее преобразование и оптимизацию, в результате чего получается высокий код, условно называемый «график водорода». Следующий этап – понижение до более низкого уровня (литий), с последующей компиляцией в машинный код. И завершающая стадия – стек замены.

Стоит отметить, что В8 – уникальный движок, способный выполнить ряд таких сложных задач. Более того, при необходимости можно активировать обратный процесс – деоптимизацию- и получить исходный код.

Сбор мусора

Сбор мусора происходит следующим образом – выполняется Марк-и-развертка, позволяющая очистить устаревшие данные. Кроме того, в движке В8 применяется добавочное обозначение, позволяющее удалять устаревшие объекты не по одному, а группами. Это позволяет выполнять очистку мусора в кратких перерывах, без ущерба для производительности.

О прочих улучшениях

В новой версии движка V8 используется улучшенный трубопровод исполнения, позволяющий не только увеличить производительность, но существенно экономить такую ценную память JavaScript-приложений. кроме того, такая архитектура движка делает его белее удобным в использовании и обслуживании.

В дальнейшем разработчики движка обещают еще больше положительных изменений, который облегчат работу над JavaScript-приложениями и кодами.

Как написать оптимизированный JavaScript

А теперь, на основе всей вышеизложенной информации, мы предлагаем читателю пятерку ценных советов по написанию JavaScript-приложений и кодов!

  1. Порядок свойства объекта – объект недвижимости следует инстанцировать (создавать) исключительно в той последовательности, что и скрытые классы.
  2. Динамические свойства – если возникает необходимость добавления свойств к уже созданному объекту, проще и быстрее назначить все требуемые свойства в его конструкторе.
  3. Методы – код, реализующий один метод за один раз, намного производительнее кода, реализующего несколько методов.
  4. Массивы – сразу стоит отказаться от разреженных массивов, выделения больших массивов и удаления элементов в массивах.
  5. Помеченные значения – в описываемом движке В8 представлены объекты и номера с 32 битами. Изучите значения объектов и чисел – это поможет избежать целого ряда ошибок.
Dr. Michael J. Garbade

I, Dr. Michael J. Garbade is the co-founder of the Education Ecosystem (aka LiveEdu), ex-Amazon, GE, Rebate Networks, Y-combinator. Python, Django, and DevOps Engineer. Serial Entrepreneur. Experienced in raising venture funding. I speak English and German as mother tongues. I have a Masters in Business Administration and Physics, and a Ph.D. in Venture Capital Financing. Currently, I am the Project Lead on the community project -Nationalcoronalvirus Hotline I write subject matter expert technical and business articles in leading blogs like Opensource.com, Dzone.com, Cybrary, Businessinsider, Entrepreneur.com, TechinAsia, Coindesk, and Cointelegraph. I am a frequent speaker and panelist at tech and blockchain conferences around the globe. I serve as a start-up mentor at Axel Springer Accelerator, NY Edtech Accelerator, Seedstars, and Learnlaunch Accelerator. I love hackathons and often serve as a technical judge on hackathon panels.

Recent Posts

Blockchain in Elections: A Leap Toward Transparent Democracy

In 2024 we're witnessing a critical point in democratic technology: the integration of blockchain and…

4 months ago

Win Big with Our Amazon Fire Max 11 & AirPods Pro Giveaway!

We’re thrilled to announce an exciting opportunity for you to win not one but two…

6 months ago

Unleashing Potential: How Education Ecosystem Transforms Learning into Real-World Success

Acquiring practical skills is crucial for career advancement and personal growth. Education Ecosystem stands out…

8 months ago

The Role of Artificial Intelligence in Modern Software Development

Artificial Intelligence (AI) has been making significant strides in various industries, and the software development…

11 months ago

Highest Stable Coin Yields – (W16 – 2024)

Another week to bring you the top yield platforms for three of the most prominent…

12 months ago

LEDU Token OTC Trading

If you hold a large volume of LEDU tokens above 1 million units and wish…

1 year ago