В кодовую базу Ruby принят новый JIT-компилятор ZJIT

В кодовую базу эталонной реализации языка Ruby добавлен новый JIT-компилятор ZJIT, позиционируемый как следующее поколение Ruby JIT. ZJIT войдёт в состав следующего значительного выпуска Ruby 3.5, в котором будет доступен в качестве опции параллельно с JIT-компилятором YJIT, а в версии Ruby 3.6 возможно заменит его. Как и YJIT новый JIT-компилятор написан на языке Rust. Оба JIT-компилятора созданы командой разработчиков из компании Shopify в рамках инициативы по увеличению производительности Ruby-программ, использующих фреймворк Rails и вызывающих очень много методов.

В отличие от YJIT новый JIT-компилятор не транслирует байткод виртуальной машины YARV в низкоуровневое промежуточное представление (по сути почти напрямую в машинный код), а преобразует байткод в высокоуровневое промежуточное представление SSA (Static Single Assignment), над которым можно реализовать дополнительные фазы оптимизации и проводить оптимизацию с оглядкой на крупные блоки кода, а не отталкиваясь только от текущих операций.

ZJIT выполняет компиляцию за раз целого метода, в то время как YJIT мог манипулировать компиляцией только базовых блоков. Для профилирования типов ZJIT реализует классическую архитектуру JIT, использующую накопленные интерпретатором исторические данные о типах, вместо применённой в YJIT техники версионирования базовых блоков (LBBV – Lazy Basic Block Versioning).

Использование высокоуровневого промежуточного представления решит проблемы с расширением, возникшие в YJIT, заложит основу для реализации в будущем многоуровневой JIT-компиляции, позволит реализовать расширенные оптимизации (например, более агрессивное inlinе-развёртывание) и упростит адаптацию JIT для различных платформ. Возвращение к традиционной модели профилирования типов избавит код от усложнений и даст возможность привлечь к работе новых участников (использование LBBV в YJIT привело к тому, что проект был непонятен другим участникам и развивался только сотрудниками Shopify).

Release. Ссылка here.