LanguageRussian

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Кэширование

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

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

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

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

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

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

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

Сбор мусора

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

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

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

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

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

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

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

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.