Современный веб и популярные серверные платформы невозможно представить без быстрого и эффективного выполнения JavaScript. Движок V8, являющийся сердцем браузера Google Chrome и таких сред выполнения как Node.js и Deno, постоянно развивается для повышения производительности и оптимизации кода. В последние годы в V8 внедряются многослойные технологии JIT-компиляции, позволяющие эффективно преобразовывать скрипты в машинные инструкции с разной степенью оптимизации. Одним из наиболее перспективных и важных направлений стала разработка и внедрение компилятора Turbolev, который представляет собой новый топовый JIT-компилятор, объединяющий сильные стороны уже существующих технологий.
Лично я расширил свою зону вклада в проект, перейдя от работы с высокоуровневым JavaScript API к глубокому внедрению в архитектуру JIT-компилятора, участвуя в разработке и совершенствовании Turbolev. Эта статья расскажет о технических аспектах, мотивации и первых опытах в области создания нового компилятора, влияющего на будущее производительности V8. Изначально V8 имел традиционный подход к выполнению кода — исходный JavaScript преобразовывался в байт-код, который выполнялся виртуальной машиной. Однако в современных реалиях такой способ не обеспечивает необходимой скорости, особенно для горячих участков кода, которые выполняются многократно. Поэтому внедрилась многоуровневая JIT-компиляция — сначала функция преобразуется в промежуточное представление среднего уровня для быстрой компиляции и низкой латентности, а наиболее часто вызываемые функции затем оптимизируются с более высокой степенью, преобразуясь в максимально эффективный машинный код.
Ранее средний уровень занимает компилятор Maglev, а высокий — Turbofan вместе с Turboshaft. Каждый из них имеет свои архитектурные особенности, компромиссы между скоростью компиляции и оптимизацией, а также сложность реализации. Maglev — это быстрый компилятор с упрощённой моделью промежуточного представления и менее сложной логикой оптимизаций. Он обеспечивает эффективную JIT-компиляцию для широкого спектра функций с приемлемым уровнем оптимизаций. В противоположность этому, Turbofan применяет технику Sea of Nodes — продвинутую модель графового представления, позволяющую применять агрессивные оптимизации, но обладающую высокой сложностью и техническим долгом.
Разработчики V8 давно искали решение, способное соединить быстроту компиляции и мощь оптимизаций с более простой архитектурой, улучшая поддержку и развитие кода. Проект Turbolev возник как инновационный подход, который сочетает в себе лучшие качества Maglev и Turboshaft. Его название — производное от этих двух компонентов, что подчёркивает идею объединения их технологий. Вместо классической топовой компиляции, начинающейся с Turbofan, Turbolev использует Maglev IR (Intermediate Representation), как начальную точку для построения топ-tier компиляции через Turboshaft, используя более привычный для backend CFG (Control Flow Graph) подход вместо Sea of Nodes. Это переводит процесс создания нативного кода на новую ступень, повышая производительность, поддерживаемость и простоту развития кода.
Мой путь участия в проекте начался с желания покинуть привычную зону комфорта, связанную с поверхностным уровнем разработки функций ECMAScript, и изучить внутренние механизмы движка, которые для меня долгое время оставались чёрным ящиком. Впечатления от работы с управлением памятью и внутренними структурами стимулировали меня углубиться в работу JIT-компилятора. Получив поддержку и руководящие рекомендации от ведущих разработчиков, таких как Darius, я начал исследовать возможности, которые открывал новый проект Turbolev. Первой задачей, выбранной мною для внедрения, стала оптимизация Math.atan2 — математической функции, требующей аккуратной работы с IEEE754 числами с плавающей точкой.
Эта задача была интересна тем, что существовал аналогичный путь для Math.pow, что значительно помогло в понимании и реализации логики. После создания первого рабочего варианта кода и широкой коммуникации с командой, я получил необходимые отзывы и советы, а также освоил использование внутренних инструментов для измерения и анализа производительности внутри крупных систем Google. В дальнейшем мои усилия были направлены на оптимизацию других функций, включая Math.sqrt и Array.
prototype.at, а также ряд рефакторингов, упрощающих и улучшающих структуру компилятора. Наиболее значимым оказался проект по внедрению поддержки Math.sqrt на уровне Turbolev. Добавленный IR узел Float64Sqrt аккуратно интегрируется как на уровне Maglev, так и в Turbolev, создавая основу для генерации машинных инструкций, таких как fsqrt для архитектуры ARM64 или sqrtsd для x64.
Это позволило добиться улучшения производительности на 61%, что стало заметным вкладом. Технически работа включала добавление новой структуры узла в маглевовском IR, определение ограничений по расположению значений и создание генератора кода для целевой архитектуры. Затем соответствующая часть была связана с Turbolev, где новый узел обрабатывался в процессе построения графа Turboshaft, обеспечивая компактное и эффективное представление для последующих высокоуровневых оптимизаций. Благодаря этому подходу функции, приобретая статус «горячих», подвергаются высокоэффективной компиляции с применением современных методов оптимизации, таких как развёртывание циклов, устранение лишних операций записи и продвинутое распределение регистров. Участие в проекте Turbolev обогатило мои знания о внутреннем устройстве V8, позволило осознать взаимосвязи между аналитическими и прикладными аспектами разработки языкового движка.
Внедрение новаций требует детального понимания архитектуры каждого компонента, глубокого тестирования и адаптации под разнообразные аппаратные платформы. Стратегия постепенного расширения зоны вклада и выбор задач средней сложности обеспечили плавный рост компетенций и интеграцию в команду разработчиков. Преимущества Turbolev заключаются не только в повышении скорости работы JavaScript кода, но и в улучшении архитектурной последовательности проекта. Освобождение от Sea of Nodes упрощает сопровождение и масштабирование компилятора, облегчает внедрение новых функций и усовершенствований. Это особенно важно в условиях постоянного расширения возможностей языка и увеличения требований к экспрессии и безопасности кода.
Будущее развития V8 и его JIT-компиляторов безусловно будет связано с расширением Turbolev и активным внедрением новых IR узлов, применением машинно-зависимых оптимизаций и углублением интеграции с другими подсистемами движка, такими как сборщик мусора и компиляция WebAssembly. Мой опыт показывает, что участие в таких глобальных проектах открывает большие возможности как для профессионального роста, так и для значимого влияния на развивающиеся технологии. Для разработчиков и исследователей, интересующихся внутренними механизмами языка JavaScript и особенностями современных компиляторов, изучение и участие в Turbolev представляет уникальный шанс ознакомиться с передовыми мировыми практиками. Постоянное совершенствование архитектуры движков — ключ к скорому, стабильному и безопасному выполнению веб-приложений и серверного кода. Мои планы связаны с продолжением работы в области углубления функционала Turbolev, добавления поддержки новых функций и оптимизаций, а также изучения смежных областей V8, таких как WebAssembly и управление памятью.
Такой комплексный подход позволит раскрыть потенциал движка полностью и улучшить опыт пользователей и разработчиков по всему миру. В завершение хочу поблагодарить коллег — Darius, Marja, Victor, Leszek — за поддержку, наставничество и ценные отзывы, которые существенно ускорили адаптацию и повысили качество моего вклада. Совместная работа над Turbolev — пример успешного сочетания профессионализма, инноваций и открытого обмена знаниями в крупном проекте с мировым влиянием. Я уверен, что новые идеи и подходы в разработке высокопроизводительных компиляторов будут и дальше формировать основы веб-экосистемы, а опыт работы с ними станет важной вехой в карьере любого инженера по программным системам.
 
     
    