Love Frontend
Сообщество
фронтенд разработчиков
EN

Быстрый взгляд на движок V8 TurboFan

Автор: mrlozchka
Дата публикации: 07.11.2019

Представляем вашему вниманию перевод материала из блога разработчиков движка V8.

Так сложилось, что команда V8 публикует свои посты в хромиум блоге. Большинство из них содержат очень глубокую и детальную информацию для “хардкордных” разработчиков. В подборке переводов мы будем выкладывать материалы, доступные более широкому кругу читателей, без необходимости глубоких знаний низкоуровневых языков программирования. Вас ждут переводы о продвинутых техниках компиляции, низкоуровневой оптимизациии и технических нюансах работы движка V8.

Копаемся в движке TurboFan JIT

Сегодня расскажем подробнее о архитектуре движка TurboFan

Производительность всегда была основной стратегией разработки движков в принципе и нашего движка в частности. TurboFan соединяет в себе набор алгоритмов оптимизаций, исполняемых в момент пакетной обработки кода (обработка через pipeline). Это позволяет улучшить качество исходного кода компилятора в отличии от предыдущей версии движка - CrankShaft JIT. Алгоритмов оптимизации в TurboFan больше, они сложнее и совершеннее, чем в CrankShaft (включая в себя оптимизацию потока управления и точный числовой анализ, которые были не реализованы в прошлом).

Архитектурные слои

Со временем компиляторы усложняются, так как необходимо поддерживать все новые и новые функции языка, улучшать производительность и следовать тенденциям современной архитектуры кода. Взяв пример с других компиляторов, мы разработали свою многоуровневую архитектуру, чтобы компилятор, мог справляться со всеми вышеописанными трудностями. Более четкое разделение между исходным языком (JavaScript), возможностями виртуальной машины (V8) и сложностями архитектуры процессоров (с x86, ARM и до MIPS) позволяет получить намного более чистый и отказоустойчивый код.

Разделение на архитектурные слои позволяет разработчикам компилятора вносить локальные правки в код конкретного слоя. Это помогает при рефакторинге, и позволяет писать эффективные модульные тесты, сохраняя код движка в чистоте. Каждый из 7 архитектурных слоев, поддерживаемых TurboFan умещается в 3000 строк кода, в отличие от CrankShaft, занимаемом порядка 13 000-16 000 строк. Это позволяет инженерам из ARM, Intel, MIPS и IBM вносить гораздо более эффективный и точечный вклад в развитие движка. TurboFan легче поддерживает нововведения ES6, потому что зависимые архитектурные части отделены от внешнего интерфейса JavaScript.

Как работает оптимизация кода

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

Пример графа обработки кода TurboFan

Численный анализ позволяет движку работать намного более эффективно, а архитектура, базирующаяся на графах позволяет разбивать части (pipeline) оптимизации на более простые выражения. С таким подходом код становится проще, чище и удобен для тестирования. Движок оптимизации применяет эти выражения для каждого правила в конвейере компиляции.

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

Производительность нового уровня

Уже сейчас налицо повышение производительности генерации кода с TurboFan, но работа над движком продолжается и по сей день.

Оставьте свой e-mail чтобы получать уведомления о свежих статьях.