
предисловие
Эта статья была включенаGitHub https://github.com/ponkans/F2E(Существует большое дерево знаний и навыков, организованное Weiwei), добро пожаловать, Звезда, продолжайте обновлять 💧
Мы пишем JavaScript каждый день, так как же выполняется каждая строка написанного нами кода?
Мы часто говорим, что JavaScript — это интерпретируемый язык, так как же он интерпретируется?
Эта статья посвящена тому, как V8 выполняет JavaScript. Надеюсь, вы прочитали ее и получили следующие преимущества:
- В чем разница между компилятором и интерпретатором
- Что такое абстрактное синтаксическое дерево AST
- Что такое JIT-технология
- Поток выполнения JavaScript
компилятор, интерпретатор
Прежде всего, необходимо прояснить, что наш код не может быть непосредственно выполнен CPU, поскольку ЦП может распознать только двоичные инструкции, но двоичные инструкции аналогичны 10111011111100110. Очевидно, что если мы пишем программу, мы используем двоичную напрямую , Можно себе представить, насколько сложно это.
Даже если вам дана таблица отображения двоичных инструкций, в которой указано назначение каждой строки двоичных инструкций, это чрезвычайно болезненно и чревато ошибками для инженеров.
Поэтому генерируется причина ассемблера.Мы отображаем каждую сложную двоичную инструкцию в ассемблерную инструкцию, что значительно уменьшает объем нашей памяти и делает наш код удобным для сопровождения и расширяемым. Например, следующая инструкция по сборке:
- инструкция добавления: используется для добавления двух операторов и записи результата в первый оператор.
- Инструкция mov: используется для записи значения в регистр.
- ...

Хотя язык ассемблера намного проще, чем машинный язык, нельзя отрицать, что язык ассемблера по-прежнему остается языком, неприемлемым для большинства инженеров.
И тогда этот легендарный человек, который «написал» чрезвычайно красивый ассемблерный код, что он, черт возьми, такое? ?

Может быть, за каждым интернет-гигантом стоит неизвестный анти-небесный код? ?
Не все такие г-н Лэй, даже если мы напишем относительно простую функцию на ассемблере, она потребует много ассемблерного кода. доступен снизудве болевые точкианализировать.
- Существует много типов процессоров, и наборы инструкций разных процессоров разные, поэтому каждый раз, когда мы реализуем функцию, нам нужно писать определенный набор сборок для каждого отдельного процессора.
- Ассемблер напрямую связан с машинными инструкциями.Чтобы хорошо написать ассемблер, нам нужна очень хорошая компьютерная база, например, некоторые знания об оборудовании и некоторые вещи в нижней части операционной системы, которые необходимо освоить, иначе будет сложно писать качественный ассемблерный код.
Тогда реальность такова, что большинство инженеров не так хорошо понимают нижний уровень, особенно мелкие партнеры в передовой бизнес-группе, большую часть времени они придерживаются бизнес-логики, и у них нет времени на работайте над этими низкоуровневыми деталями.
В заключение, компиляция — это не то, что нам нужно! !

Нам нужен язык, который решает вышеуказанные болевые точки и написан таким образом, чтобы люди чувствовали себя обновленными и обновленными.
В результате родился так называемый язык высокого уровня. Например, JavaScript, PHP, Java, Python и т. д. — все это языки высокого уровня.
Точно так же эти языки высокого уровня не могут напрямую выполняться ЦП, и, как и язык ассемблера, их также необходимо преобразовывать.
Есть два способа (компилированное выполнение или интерпретируемое выполнение) для обработки и выполнения этих языков высокого уровня.
Скомпилировать и выполнить

На самом деле вы, наверное, знаете из картинки.Компиляция и выполнение сначала должны преобразовать язык высокого уровня в промежуточный код через парсер, а затем компилятор компилирует промежуточный код в машинный код (обычно это относится к бинарным файлам), а затем ЦП может выполнить его напрямую.
объяснить исполнение

Интерпретация и выполнение связаны с компиляцией и выполнением.Промежуточный код выполняется непосредственно интерпретатором, а результат выводится.Для компиляции и выполнения его необходимо сначала скомпилировать в машинный код.
Нельзя есть и рыбу, и медвежью лапу
Благодаря приведенному выше объяснению на самом деле легче увидеть преимущества и недостатки выполнения компиляции и выполнения интерпретации.
Компиляция и запуск выполнения будут медленнее, но выполнение будет быстрее.
Выполнение интерпретации начнется быстрее, но выполнение будет медленнее.
Не обведите большой кружок и вернитесь к теме, а как наш движок V8 обрабатывает JavaScript?
Не паникуйте, не паникуйте, настало время, сначалаПослушайте песню в сети, чтобы подавить облако и облегчить тяжелое сердце после недавнего краха фондового рынка..

Процесс выполнения V8 — технология JIT (Just In Time)
V8 использует стратегию компромисса, благодаря которой компиляция и выполнение взаимодействуют с интерпретацией и выполнением, что идеально!
Для начала возьмем блок-схему текущего выполнения V8 JavaScript (на самом деле ранний процесс выполнения V8 не такой, я не буду его здесь разворачивать, заинтересованные друзья могут оставить сообщение для обсуждения)

Здесь для приведенного выше изображения дан поток работы V8 (поясняется позже):
Сгенерируйте AST и область видимости из языка высокого уровня
Генерация байт-кода из AST и области действия
Интерпретировать и выполнять байт-код
Мониторинг горячего кода (код, который неоднократно используется в проекте)
Компилировать код точки доступа в двоичный машинный код
При изменении кода точки доступа требуется деоптимизация
V8 сначала получит исходный код JavaScript, который необходимо выполнить, но это всего лишь набор строк в глазах V8, и V8 не может напрямую понять смысл написанного вами if else.
Поэтому эту строку необходимо обработать и преобразовать.
После того, как V8 обработает и структурирует исходный код, будет создано абстрактное синтаксическое дерево (AST), предназначенное для V8, чтобы понять значение исходного кода.
AST делится на два этапа: сначала сегментация слов (лексический анализ), а затем интерпретация (грамматический анализ).
AST ПозадиЯ планирую специально опубликовать статью, поэтому не буду вдаваться в подробности здесь. Опять такиназад назад! !

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

На блок-схеме V8 выше есть Горячая область.Фактически это модуль, который отслеживает состояние выполнения интерпретатора.Во время выполнения байт-кода, если интерпретатор отслеживает, что определенная часть кода выполняется повторно, мониторинг модуль поместит эту часть кода нагорячий кодотметка.
Когда некоторая часть кода помечена горячей точкой, V8 сбрасывает эту часть байт-кода на оптимизирующий компилятор, а оптимизирующий компилятор компилирует эту часть байт-кода в двоичный файл в фоновом режиме. Если эта часть кода будет выполнена позже, V8 отдаст приоритет скомпилированному двоичному файлу, так что скорость выполнения кода значительно улучшится.Это технология компиляции точно в срок (JIT)..
Затем, как мы все знаем, JavaScript — это динамический язык, и объекты могут быть изменены во время выполнения, но код, скомпилированный оптимизированным компилятором, предназначен только для определенной фиксированной структуры. скомпилированный и оптимизированный код понадобитсяАнтиоптимизацияоперации, в противном случае это неверный код. После деоптимизированного кода при следующем выполнении он вернется к интерпретатору для интерпретации и выполнения.
В дополнение к V8, какие места также используют технологию JIT? ?

Теплая мужская вина, чтобы дать вам узел, и это:
- Знаменитая JVM и luajit
- Oracle GraaIVM
- Apple SquirrelFish Extreme
- SpiderMonkey от Mozilla
- Подождите (что еще знаете, увидимся в комментариях)
При обсуждении с коллегами на прошлой неделе мне задали вопрос, что чем дольше выполняется V8, тем больше горячего кода компилируется в машинный код, и общая эффективность выполнения будет выше. Если это так, объем памяти V8 также будет увеличиваться и увеличиваться, как V8 учитывает это? (Как будто коллега берет интервью, паф~)
Кратко отвечу: V8 вводит байт-код, поэтому есть относительно гибкое пространство, а память и скорость выполнения можно регулировать. По сравнению с прямой компиляцией всего JS-кода в байт-код (это фактически имело место с V8 в первые дни, а позже из-за проблем с памятью, вызванных появлением мобильных терминалов, он имеет текущую структуру), в этом режиме нет места для гибкость!
Суммировать
Эта статья была включенаGitHub https://github.com/ponkans/F2E(Существует большое дерево знаний и навыков, организованное Weiwei), добро пожаловать, Звезда, продолжайте обновлять 💧
Делиться процессом выполнения V8 странно, думать, что вещи, связанные с принципом компиляции, для нас достаточно важны, и заставят вас понять суть некоторых фронтенд-приложений.
Я также надеюсь, что мои друзья обратят внимание на основы компьютеров Реальный бой, основанный на теории, принесет больше пользы, чем слепой практический бой. ты.
Если вам это нравится, добавьте подписку, поставьте лайк, спасибо 💕😊
Свяжитесь со мной / публичный аккаунт
Поиск в WeChat【водяной монстр] Или отсканируйте QR-код ниже, чтобы ответить на «Добавить группу», я приглашу вас в группу технического обмена. Честно говоря, в этой группе, даже если вы не говорите, просто чтение записей чата — это своего рода рост. (Али технический эксперт, автор Ao Bing, Java3y, старший клиент Mogujie, эксперт по безопасности Ant Financial, там все большие коровы).
Водяной монстр также будет регулярно создавать оригиналы, регулярно обмениваться опытом с небольшими партнерами или помогать читать резюме. Будьте внимательнее, не теряйтесь, есть возможность побегать вместе 🏃↓↓↓
