Эта статья является третьей частью серии подробных сведений о движке V8. Основное внимание уделяется пониманию концепции байт-кода и важному влиянию байт-кода на эволюцию движка V8. В то же время она поможет вам разобраться в архитектуре движка V8. двигатель v8, чтобы помочь вам лучше понять архитектуру двигателя V8, в конце статьи будут ссылки на завершенную серию статей.Эта серия статей все еще обновляется.Добро пожаловать, чтобы продолжать обращать внимание.
концепция байт-кода
1. Что такое байт-код
Описание байт-кода в Википедии таково:
Байт-код (англ. Bytecode) обычно относится к промежуточному коду, который был скомпилирован, но не имеет ничего общего с конкретным машинным кодом и должен быть преобразован интерпретатором, чтобы стать машинным кодом. Байт-код обычно не читается человеком, как исходный код, а представляет собой последовательность закодированных числовых констант, ссылок, инструкций и т. д.
Согласно авторскому пониманию байт-кода, это, вероятно, так: Компьютеры могут распознавать только двоичные коды, а двоичные коды (наборы инструкций) не подходят для записи и чтения людьми.Наборы инструкций, соответствующие разным архитектурам ЦП, также совершенно разные.Чтобы преодолеть эту проблему, великие боги создали подходящие человеческие существа Языки, так называемые языки «высокого уровня», очень близки к естественному человеческому языку и использованию математических формул, независимо от архитектурных различий ЦП. Разница между языком высокого уровня и двоичным кодом довольно велика, и прямое преобразование будет очень проблематичным.байт-код.
Во-вторых, преимущества байт-кода
Чтобы понять преимущества байт-кода, самый интуитивный способ — это непосредственно взглянуть на то, что байт-код привносит в java. Девиз раннего продвижения java — «Компилируй один раз, запускай где угодно». Исходный код Java компилируется программой-компилятором. Файл байт-кода с Затем создается расширение .class. Затем байт-код транслируется в компьютерные инструкции машины через JVM (на целевой машине должна быть установлена соответствующая JVM (виртуальная машина Java)). Язык Java использует байт-код, чтобы в определенной степени решить проблему низкой эффективности исполнения интерпретируемого языка. перекомпилировать.
Преимущества байт-кода можно резюмировать следующим образом:
Не относится к архитектуре ЦП
Преобразует в машинный язык быстрее, чем исходный язык высокого уровня
Эволюция V8
Во-первых, ранняя архитектура V8
До появления V8 наиболее популярным движком JavaScript в первые дни был движок JavaScriptCore. javasSriptCore запускается путем создания байт-кода, а затем преобразования байт-кода в двоичный код. Миссия V8 — достижение максимальной производительности. Google считает, что эта архитектура будет тратить время на создание байт-кода. Способ создания машинного кода следующий:
Давайте посмотрим, как ранняя архитектура V8 выполняет код js:
Первым шагом является преобразование исходного кода js в AST (абстрактное синтаксическое дерево).
Второй шаг — скомпилировать AST в двоичные файлы с помощью механизма Full-Codegen, а затем выполнить эти двоичные файлы напрямую.
На третьем шаге, в процессе выполнения бинарного кода, отметить повторно исполняемую функцию, оптимизировать бинарный код с более высокой эффективностью компиляции через Crankshaft engine, прибегая к этой функции, более эффективный бинарный код при запуске к этой функции.
В то же время для экономии времени повторной компиляции принята стратегия кэширования бинарного кода (кэшируется в памяти и на жестком диске), что на начальном этапе давало прирост скорости.
2. Зачем вводить байт-код
Из-за сложности веб-страниц и популярности мобильных терминалов ранняя архитектура также приносила много проблем.
1. Проблема использования памяти
Основной проблемой является проблема занятости пространства.Процесс выполнения в V8 преобразует исходный код js в двоичный код и сохраняет двоичный код в памяти.После выхода из процесса двоичный код будет сохранен на жестком диске. Пространство памяти, занимаемое двоичным кодом, преобразованным из исходного кода js, очень велико.Если размер файла исходного кода js составляет 1M, то сгенерированный двоичный код может быть более десяти мегабайт.Однако память ранних мобильных телефонов как правило, невысокие и чрезмерно занятые. Это приведет к значительному снижению производительности.
2. Сложность кода слишком высока
Как упоминалось выше, наборы инструкций, соответствующие разным архитектурам ЦП, совершенно различны, и на рынке существует множество типов архитектур ЦП, поэтому механизм Full-Codegen, преобразующий AST в двоичный код, и механизм Crankshaft, оптимизирующий компиляцию, должны Можно представить себе сложность и рабочую нагрузку архитектуры ЦП, и компиляция байт-кода может значительно уменьшить эту рабочую нагрузку, как показано на следующем рисунке:
3. Ошибка
Давайте сначала посмотрим на этоbug, который примерно описывается следующим образом: В то время автор сообщения об ошибках неоднократно загружал Facebook в браузере Chrome и открывал различные результаты мониторинга: v8.CompileScript занимал 165 мс при первой загрузке, а при повторной загрузке было обнаружено, что действительно время- потребляющий код js не кэшируется, в результате чего время компиляции при повторных загрузках будет примерно таким же, как стоимость первой загрузки.
Фактически, причина проблемы хорошо понята, как упомянуто более раннее двоичное пространство большого объема памяти, в соответствии с принципом оптимизации компилятора инерции, поэтому V8 не принимает весь компилятор кода для компиляции только внешнего слоя кода, внутри Функция кода будет скомпилирована при первом вызове, например:
Если браузер кэширует самый внешний код, ключевой код, в котором могут находиться наши передовые высокотехнологичные модули, не может быть кэширован, что также является основной причиной вышеуказанной ОШИБКИ.
3. Существующая архитектура V8
Чтобы решить вышеуказанные проблемы, V8 начал использовать архитектуру введения байт-кода и, наконец, принял архитектуру, как показано ниже:
(Источник изображения:blog.IT pub.net/69912579/vi… Давайте посмотрим, как существующая архитектура V8 выполняет код js:
Первым шагом является преобразование исходного кода js в AST (абстрактное синтаксическое дерево).
Второй шаг — скомпилировать AST в байт-код с помощью интерпретатора Ignition и начать интерпретировать байт-код в двоичный код предложение за предложением и выполнить его.
Третий шаг, в процессе интерпретации и выполнения, пометить многократно исполняемый горячий код и скомпилировать помеченный код через двигатель Turbofan для создания более эффективного двоичного кода.При повторном запуске этой функции выполняется только эффективный код. без интерпретации и исполнения байт-кода.
После того, как V8 представил режим архитектуры байт-кода, очевидно, были решены следующие проблемы:
Длительное время запуска: нужно только скомпилировать байт-код при запуске, а затем выполнить байт-код предложение за предложением.Скорость компиляции байт-кода может быть намного выше, чем скорость компиляции двоичного кода.
Большой объем памяти: байт-код занимает гораздо меньше места, чем двоичный код.
Слишком высокая сложность кода: сложность кода, необходимая для адаптации V8 к различным ЦП, значительно снижена.
Наконец, давайте посмотрим на эффект новой архитектуры по сравнению с исходной архитектурой:
Эта статья в основном черезбайт-кодХарактеристики двигателя V8, чтобы понять эволюцию архитектуры двигателя V8, проанализировать причины эволюции и разобраться в архитектуре, чтобы помочь нам продолжить понимать V8 позже, если есть какие-либо ошибки, пожалуйста, обсудите с автором. в комментариях, если вы думаете, что эта статья Пожалуйста, поставьте палец вверх, если вы были полезны, большое спасибо.