JIT-компілятор ZJIT: Новий підхід для мови Ruby
ZJIT: Новий JIT-компілятор для мови Ruby
У кодову базу еталонної реалізації мови Ruby додано новий JIT-компілятор ZJIT, який позиціонується як наступне покоління Ruby JIT. ZJIT увійде до складу наступного значного випуску Ruby 3.5, де буде доступний як опція паралельно з JIT-компілятором YJIT, а у версії Ruby 3.6 можливо замінить його. Як і YJIT, новий JIT-компілятор написаний мовою Rust. Обидва JIT-компілятори створені командою розробників з компанії Shopify в рамках ініціативи з підвищення продуктивності Ruby-програм, що використовують фреймворк Rails і викликають дуже багато методів.
Основні відмінності ZJIT від YJIT
На відміну від YJIT новий JIT-компілятор не транслює байткод віртуальної машини YARV у низькорівневе проміжне представлення, а перетворює байткод у високорівневе проміжне представлення SSA (Static Single Assignment). Завдяки цьому можна реалізувати додаткові фази оптимізації та проводити оптимізацію з урахуванням великих блоків коду, а не відштовхуючись лише від поточних операцій.
ZJIT виконує компіляцію одразу цілого методу, тоді як YJIT міг маніпулювати компіляцією тільки базових блоків. Крім того, для профілювання типів ZJIT реалізує класичну архітектуру JIT, що використовує накопичені інтерпретатором історичні дані про типи, замість застосованої в YJIT техніки версіонування базових блоків (LBBV – Lazy Basic Block Versioning).
Переваги нового підходу у ZJIT
Використання високорівневого проміжного представлення вирішить проблеми з розширенням, що виникли в YJIT. Також це закладе основу для реалізації в майбутньому багаторівневої JIT-компіляції, дозволить реалізувати розширені оптимізації (наприклад, більш агресивне inline-розгортання) і спростить адаптацію JIT для різних платформ.
Повернення до традиційної моделі профілювання типів позбавить код від ускладнень і дасть можливість залучити до роботи нових учасників. Варто зазначити, що використання LBBV в YJIT призвело до того, що проект був незрозумілий іншим учасникам і розвивався тільки співробітниками Shopify.
Майбутнє JIT-компіляції в Ruby
З появою ZJIT команда Ruby робить ще один крок до підвищення продуктивності мови. Однак, спочатку ZJIT буде доступний як експериментальна опція поряд з YJIT у версії 3.5. Це дозволить розробникам перевірити новий компілятор у реальних проектах і надати зворотній зв’язок.
Очікується, що повний перехід на ZJIT може відбутися у версії Ruby 3.6, коли він повністю замінить YJIT як основний JIT-компілятор. Звичайно, це буде залежати від результатів тестування та відгуків спільноти.
Більше інформації про ZJIT можна знайти на офіційному сайті проекту та в документації Ruby.