В этой статье читатель узнает более подробно о строительных блоках 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 – метод скрытых классов, работающий по принципу неподвижных макетов объектов.
Как это работает? При каждом добавлении нового свойства к определенному объекту, предыдущий класс переходит в разряд скрытого. Это очень важный момент, ведь скрытые моменты могут быть использованы и для других объектов, создаваемых аналогичным образом. К примеру, есть два объекта, разделяющих скрытый класс – в этом случае добавляемая опция автоматически присваивается им обоим:
1 2 3 4 5 6 |
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-приложений и кодов!
- Порядок свойства объекта – объект недвижимости следует инстанцировать (создавать) исключительно в той последовательности, что и скрытые классы.
- Динамические свойства – если возникает необходимость добавления свойств к уже созданному объекту, проще и быстрее назначить все требуемые свойства в его конструкторе.
- Методы – код, реализующий один метод за один раз, намного производительнее кода, реализующего несколько методов.
- Массивы – сразу стоит отказаться от разреженных массивов, выделения больших массивов и удаления элементов в массивах.
- Помеченные значения – в описываемом движке В8 представлены объекты и номера с 32 битами. Изучите значения объектов и чисел – это поможет избежать целого ряда ошибок.