Движок JavaScript-V8

JavaScript
Движок JavaScript-V8

1. Ядро браузера — механизм рендеринга

Рендеринг — это процесс построения модели данных на основе описаний или определений для создания графики.

ядро браузераЭто должно превратить страницу (Html, Css, JavaScript) в визуальный и звуковой мультимедийный результат.

Мы также можем настроить ядро ​​​​браузера под названием «движок рендеринга», часто движок рендеринга должен преобразовывать текст Html, Css, JavaScript или другие файлы ресурсов в нашу страницу браузера.

2. JavaScript-движок

2.1 Движок JavaScript (движок JavaScript)

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

Существует много видов движков JavaScript:

  • V8 —  — это программа с открытым исходным кодом, разработанная Google и написанная на C++.
  • Rhino —  управляется Mozilla Foundation, имеет открытый исходный код и полностью разработан на Java.
  • SpiderMonkey —  был первым движком JavaScript, который поддерживал Netscape Navigator и в настоящее время используется Firefox.
  • JavaScriptCore —  Открытый исходный код, продаваемый как Nitro, разработанный Apple для Safari.
  • KJS  — движок KDE, первоначально разработанный Харри Портеном для веб-браузера Konqueror в рамках проекта KDE.
  • Чакра (JScript9) — Internet Explorer.
  • Чакра (JavaScript) — Microsoft Edge.
  • Nashorn, как часть OpenJDK, написан группой Oracle Java Language and Tools.
  • JerryScript —  Легкий движок для Интернета вещей.

Самым известным, несомненно, является движок V8, который используется в браузере Chrome и Node.

Механизм JavaScript отвечает за компиляцию и выполнение всей программы JavaScript от начала до конца.

2.2 Взаимосвязь между движком рендеринга и движком JavaScript

  • Механизм рендеринга обрабатывает логику JavaScript, вызывая интерфейс.
  • Механизм JavaScript получает доступ к DOM, CSSDOM и т. д. механизма рендеринга через интерфейс моста.

2.3 Как работает движок JavaScript?

Основные компоненты движка JavaScript:

  • Компилятор: отвечает за синтаксический анализ и генерацию кода.
  • Парсер: отвечает за получение байт-кодов, а также за анализ и выполнение байт-кодов.
  • Инструменты JIT: конвертируйте байт-коды или абстрактные синтаксические деревья в собственный код (исполняемый код).
  • Сборщик мусора и профилировщик: отвечает за сбор мусора и сбор информации в движке, чтобы помочь улучшить производительность и эффективность движка.

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

3. Компиляция и выполнение движка JavaScript-V8

3.1 Представление данных

  • Базовые типы данных: Boolean, Number, String, Null, Undefined, Symbol, BigInt (второй этап наброска, но это наверняка, когда он будет использоваться в JavaScript позже)
  • Тип объекта (массив, объект, дата, ошибка и т. д.). В V8 представление данных разделено на две части:
  1. Фактическое содержание данных, они имеют переменную длину, и тип содержимого отличается.
  2. Дескриптор данных фиксированного размера, содержащий указатель на первую часть данных.

3.2 Ручка Ручка

V8 должен выполнять сборку мусора и перемещать это содержимое данных.Если указатель используется напрямую, возникнут проблемы или относительно большие накладные расходы. При использовании хэндла этих проблем нет, нужно только изменить указатель в хэндле, пользователь все равно использует хэндл, который сам по себе не изменился.

3.3 Куча памяти и стек вызовов

  • mory Heap (куча памяти) —  где выделена память
  • Стек вызовов — где выполняется код

3.3 Процесс компиляции и выполнения

скомпилировать и выполнить

В-четвертых, выделение памяти V8

4.1 Малый блок памяти Класс зоны

Для управления рядом небольших фрагментов памяти, у этих небольших фрагментов памяти схожий жизненный цикл, вы можете использовать объект Zone. Объект Zone сначала претендует на часть памяти для себя, а затем управляет и выделяет небольшой объем памяти. После того, как часть небольшой памяти выделена, она не может быть освобождена Zone, и вся небольшая память, выделенная Zone, может быть освобождена только за один раз. Например, выделение памяти и использование абстрактного синтаксического дерева будет генерировать собственный код после построения, а затем его память будет восстановлена ​​сразу, что очень эффективно.

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

4.2 Куча памяти

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

Пять, механизм сборки мусора V8

5.1 Алгоритм очистки (очистки) нового поколения

В основном используют алгоритм Чейни (имя человека). Алгоритм сборки мусора, реализованный посредством репликации.   

1. Разделить память кучи нового поколения на две части, и каждая часть пространства называется полупространством. Один из них в работе вызывается из космоса, а другой в простое вызывается в космос.

2. Когда мы размещаем объекты, мы сначала размещаем их в пространстве From.

3. Во время сборки мусора проверьте уцелевшие объекты в пространстве from, прошли ли они очистку и переработку, а также использовано ли пространство to на 25% (чтобы убедиться, что места для нового выделения достаточно). 

4. Скопируйте эти уцелевшие объекты в пространство. Пространство, занятое неживыми объектами, будет освобождено.

5. После завершения копирования роли from space и to space меняются местами.

   Примечание. Фактическая используемая куча памяти представляет собой сумму размера двух полупространств в молодом поколении и размера памяти в старом поколении.

  Как определить, живой ли объект? объем? представляет собой набор правил для хранения и запроса переменных. Этот набор правил определяет, можно ли получить доступ к объектам в памяти.

  Особенности: Алгоритм очистки — это типичный алгоритм, который жертвует пространством ради времени.Он не может быть применен ко всей переработке в больших масштабах, но очень подходит для переменных с коротким жизненным циклом в новом поколении.

5.2 Удаление меток старого поколения Mark-Sweep

1. Фаза маркировки проходит по всем объектам в куче и помечает живые объекты.

2. На этапе очистки очищаются только неотмеченные объекты.

Самая большая проблема с    заключается в том, что после очистки отметки будут разрывы. Эта фрагментация памяти может вызвать проблемы при последующем выделении памяти. Очень вероятно, что когда нужно выделить большой объект, все фрагментированное пространство не может быть заполнено, и сборка мусора будет запущена заранее, и эта полная сборка не нужна.

5.3 Маркировочная обработка Mark-Compact старого поколения

   Разработано на основе удаления следов, в процессе отделки

1. Переместите живой объект в раздел

2. После завершения перемещения очистить память за границей напрямую

5.4 Инкрементальная маркировка Инкрементная маркировка

   Процесс сборки мусора должен приостановить логику приложения. Чтобы сократить время паузы, вызванной полным восстановлением, на этапе маркировки действие, которое изначально должно было быть выполнено за один раз, было изменено на поэтапную маркировку. Сборка мусора и логика приложения выполняются поочередно, пока фаза маркировки не будет завершена. Максимальное время паузы составляет менее 1/6.

Последующие действия также вводят очистку задержки и пошаговую консолидацию, поэтому действия по очистке и организации также становятся пошаговыми.

Шесть, двигатель javaScript v8 почему быстрый

  • Технология контекстных снимков

Что такое контексты (Contexts)? Это фактически среда выполнения JS-приложения, поэтому модификации приложения не будут влиять друг на друга.Например, если страница js изменяет встроенный метод объекта toString, это не должно влиять на другую страницу. Каждый процесс браузера Chrome имеет только один экземпляр движка V8, а каждое окно и iframe в браузере соответствует контексту.

  • Встроенный js-код.

Используйте JS для выражения встроенных объектов и методов, таких как приведенный выше код для реализации метода Math.min, так что V8 должен сосредоточиться только на основных операциях при реализации преобразования кода.Функции, начинающиеся с символа %, взяты из V8 функции времени выполнения.

  • Управление памятью при построении AST (Abstract SyntaxTree).

После того, как V8 создаст AST, он ассемблирует его для создания динамического машинного языка, поэтому AST необходимо повторно использовать после генерации кода; для характеристик многоузлового применения памяти и одноразового восстановления в процессе построения AST V8 использует память управление связанным списком сегментов и в сочетании с режимом блокировки области можно реализовать метод управления несколькими приложениями (сегмент, 8 КБ ~ 1 МБ), множественное выделение узлов AST и однократное восстановление каждого сегмента, что может не только избежать памяти фрагментации, но также избегайте обхода узлов AST для восстановления памяти один за другим

  • CompileCache позволяет избежать повторной компиляции одного и того же кода.

Для фрагмента JS-кода перед началом лексического анализа он проверит, был ли фрагмент кода скомпилирован из области кэша компиляции CompilationCache, если да, то напрямую извлечет скомпилированный машинный код и вернет его, что снижает уровень использования ЦП. , в обмен на определенное количество памяти, если JS-файлы многократно загружаются на страницу, ускорение этого метода очевидно, этот подход должен быть сбалансирован и сравним.

  • Быстрый доступ к свойствам

V8 не использует структуру словаря или карту, реализованную красно-черным деревом, для управления свойствами, как другие JS-движки, а прикрепляет к каждому объекту указатель, указывающий на скрытый класс (если объект этого типа создается впервые, создается новый скрытый класс); когда Каждый раз, когда атрибут добавляется к объекту, будет создаваться новый класс (с записью смещения/положения каждого атрибута), и исходный класс указывает на новый класс, то есть преобразование создается связанный список скрытых классов.

  • Управление памятью кучи кучи
  • Встроенное кэширование снижает накладные расходы на вызовы функций

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

  • Однократная компиляция для генерации машинного языка

Как правило, после создания AST механизм JS компилирует его в промежуточный язык (байт-код), а затем анализирует эти байт-коды во время выполнения; Java также компилируется в эти байт-коды, а затем используется виртуальная машина (для достижения кроссплатформенности). в качестве интерпретатора для повышения производительности Java использует неразборчивый способ компиляции независимого от платформы, часто используемого кода в машинный код. V8 компилирует AST в машинный язык за один раз. Как видно из авторских прав на заголовки файлов, связанных с ассемблером, прототипы компиляторов для этих разных платформ (ia32, arm) принадлежат Sun Microsystems.

Ссылаться на:nuggets.capable/post/684490…

Ссылаться на:Woohoo. Программист взял интервью.com/expensive/mocha...

Ссылаться на:blog.CSDN.net/Тип или пять пальцев…