Compiling Ruby to machine language
Пэт Шонесси работает над новым изданием книги "Ruby Under a Microscope" для Ruby 3.x, в котором подробно рассматривается работа JIT-компиляторов YJIT и ZJIT. YJIT оптимизирует Ruby-код, подсчитывая вызовы методов и блоков, и когда счетчик достигает порога (30 для небольших программ, 120 для крупных), компилирует этот участок в машинный код. Для отслеживания вызовов YJIT использует внутренний счетчик jit_entry_calls, который хранится рядом с последовательностью YARV-инструкций.
YJIT сохраняет созданные машинные инструкции в "YJIT-блоки", которые соответствуют не целым Ruby-блокам, а более мелким участкам кода — отдельным YARV-инструкциям или их небольшим группам. Каждый Ruby-метод или блок обычно состоит из нескольких YJIT-блоков. Когда порог вызовов достигается, YJIT компилирует YARV-инструкции в машинный код, создавая эти блоки, которые затем выполняются вместо оригинальных инструкций YARV, что значительно повышает производительность.