Общая карта02 / 19

Как V8 выполняет JavaScript

Путь от исходного кода до инструкций процессора.

Рассмотрим выражение const damage = 2 + 3;. Для человека это короткая инструкция. Для движка сначала это последовательность символов. Scanner выделяет токены, parser собирает структуру программы, а генератор байткода превращает её в инструкции, пригодные для исполнения.

В V8 первоначальное выполнение обычно связано с Ignition. Часть кода затем может получить машинную версию: быстрее подготовленную baseline-компилятором или более тщательно оптимизированную.

Разные функции одной программы могут выполняться по-разному. Например, одну V8 выполняет через интерпретатор, а для другой уже создал машинный код. Подготовку функций, которые пока не нужны, движок может отложить. При повторном вызове функции он может использовать уже подготовленный код.

От символов к исполнению

Последовательно рассмотрим основные представления кода.

01
Исходный текстТекущая стадия
02
ТокеныВпереди
03
ASTВпереди
04
БайткодВпереди
05
ВыполнениеВпереди

Текст описывает программу на языке JavaScript.

1 / 5
Основной вывод

AST описывает структуру; байткод — инструкции для интерпретатора Ignition; машинный код — инструкции CPU.

Проверить по первоисточнику ↗

V8 · Scanner↗Команда V8 о токенизации и пути от текста к AST.V8 · Sparkplug↗Baseline-компиляция из байткода в машинный код.V8 · ленивый разбор↗Почему полную подготовку функции можно отложить до её вызова.