задний план
Среди существующих движков javascript движок V8, безусловно, лучший среди них.И хром, и узел используют движок V8 внизу.Среди них доля рынка хрома достигла 70%, а узел является ядром внешнего интерфейса. проектирование и расширение границ.Столп, важность двигателя V8 для переднего инженера-разработчика можно себе представить. У большинства наших разработчиков javascript может не быть возможности разработать движок javascript самостоятельно, но изучение движка V8, безусловно, является для нас важным способом улучшить наши технические возможности, поэтому мы специально обращаемся к различным книгам и статьям для обучения, а также организуем серия статей для нас, чтобы учиться и прогрессировать вместе. (Эта статья является первой в серии статей)
Что такое двигатель V8
JavaScript-движок
Прежде чем понять движок V8, мы должны сначала узнать, что такое движок javascript. Проще говоря, ЦП не знает наш js-код, а разные ЦП знают только соответствующие им наборы инструкций.Движок javascript компилирует js-код в набор инструкций, понятный ЦП.Конечно, помимо компиляции, это также отвечает за исполнение и память. Мы все знаем, что js является интерпретируемым языком. Движок напрямую читает исходный код и выполняет его во время компиляции, что относительно неэффективно. Компилируемый язык (например, C++) напрямую компилирует исходный код в непосредственно исполняемый код. Эффективность выполнения выше. .
двигатель v8
С развитием технологий требования к производительности JavaScript становятся все выше и выше, что позволяет быстрее анализировать и выполнять код JavaScript.На этом фоне создается движок V8, и его целью является повышение производительности. Чтобы улучшить производительность, v8 перенял большой опыт от многих пожилых людей, которые одновременно интерпретировали язык.Давайте сначала посмотрим на запущенный процесс java, который также является интерпретируемым языком.
Что такое JIT:blog.CSDN.net/QQ_36042506…
Давайте посмотрим, как это делает V8.
Процесс компиляции и запуска V8
Далее, давайте взглянем на процесс компиляции и запуска v8.
процесс компиляции
Прежде всего, нам нужно понять несколько классов, используемых в процессе выполнения компиляции и запуска.
- Класс скрипта: указывает, что это код JavaScript, включая как исходный код, так и локальный код, сгенерированный после компиляции, поэтому это и запись компиляции, и работающая запись;
- Класс компилятора: класс компилятора, вспомогательный класс скрипта для компиляции и генерации кода, он в основном играет роль координатора и вызывает интерпретатор (парсер) для создания абстрактного синтаксического дерева и генератор полного кода для генерации собственного кода для абстрактного синтаксическое дерево;
- Класс Parser: интерпретирует и строит исходный код в абстрактные синтаксические деревья, использует класс AstNode для их создания и использует класс Zone для выделения памяти;
- Класс AstNode: класс узлов абстрактного синтаксического дерева, который является базовым классом всех остальных узлов, содержит множество подклассов, и позже для разных подклассов будут сгенерированы разные локальные коды;
- класс AstVisitor: класс посетителя абстрактного синтаксического дерева, который в основном используется для обхода абстрактного синтаксического дерева;
- FullCodeGenerator: подкласс класса AstVisitor, который генерирует собственный код для JavaScript путем обхода абстрактного синтаксического дерева;
(Красная отметка - это собственное понимание автора. Если есть какие-либо отклонения или ошибки, укажите и обсудите)
рабочий процесс
- Сценарий представляет собой код JavaScript, который включает исходный код и локальный код, сгенерированный после компиляции, который является как записью компиляции, так и текущей записью;
- Выполнение: Вспомогательный групповой класс для выполнения кода, включая некоторые важные функции, такие как функция вызова, какая вспомогательная группа вводит и выполняет код сценария;
- JSFunction: класс представления функции JavaScript, который необходимо выполнить;
- Время выполнения: Вспомогательные групповые классы, которые запускают эти собственные коды, в основном предоставляя вспомогательные групповые функции, необходимые во время выполнения, такие как: доступ к атрибутам, преобразование типов, компиляция, арифметика, битовые операции, сравнение, регулярное выражение и т. д.;
- Heap: класс кучи памяти, необходимый для запуска машинного кода;
- MarkCompactCollector: основной класс реализации механизма сборки мусора, который используется для основных процессов сборки мусора, таких как маркировка, очистка и сортировка;
- SweeperThread: поток, отвечающий за сборку мусора.
Процесс выполнения следующий:
(Красная отметка - это собственное понимание автора. Если есть какие-либо отклонения или ошибки, укажите и обсудите)
Общий процесс компиляции и выполнения выглядит следующим образом:
(Красная отметка - это собственное понимание автора. Если есть какие-либо отклонения или ошибки, укажите и обсудите)
Суммировать
В этой статье описывается процесс редактирования и запуска движка V8 с точки зрения макросов, но для того, чтобы по-настоящему понять V8 в дополнение к этому, нам также необходимо понимать множество рабочих деталей, включая, помимо прочего, систему циклов событий, управление памятью, отложенный парсинг, скрытые классы, встроенное кэширование и т. д. Следующие статьи будут изучаться по одной, так что следите за обновлениями.
Справочная статья
"Инсайдер технологии WebKit"
Встречайте двигатель V8:zhuanlan.zhihu.com/p/27628685
серия статей
Подробное описание двигателя V8 (1) — обзор
Подробное объяснение двигателя V8 (2) - AST
Подробное объяснение движка V8 (3) — эволюция V8 с точки зрения байт-кода.
Подробное объяснение движка V8 (4) - как выполняется байт-код
Подробное объяснение двигателя V8 (5) - встроенный кэш
Подробное объяснение двигателя V8 (6) - структура памяти
Подробное объяснение двигателя V8 (7) — механизм сбора мусора
Подробное объяснение движка V8 (8) - очередь сообщений
Подробное объяснение двигателя V8 (9) - функция сопрограммы и генератора