Ruby: GIL, MRI, MJIT, YJIT — глоссарий рубистовских страшилок

Ruby продолжает развиваться, предлагая разработчикам новые инструменты для оптимизации производительности и параллельной работы. В этой статье разберём ключевые термины — от GVL и YJIT до Ractors и Fiber Scheduler, — которые помогут глубже понять внутреннее устройство языка и его экосистему.


Если ты читаешь релиз-ноты Ruby, а там в каждом втором абзаце: “GVL”, “JIT”, “MJIT”, “YJIT”, “CRuby” и что-то про Ractors — не пугайся.
Это всего лишь жаргон. Ниже — расшифровка всех ключевых понятий, которые любят на собеседованиях, митапах и changelog’ах.

🧠 MRI (или CRuby)

Matz’s Ruby Interpreter — основная реализация Ruby, написанная на C.

  • Версия Ruby, которую ты ставишь через rbenv/rvm
  • Иногда называют CRuby (Ruby, написанный на C)

🛡 GIL / GVL

GIL — Global Interpreter Lock (в Ruby → GVL — Global VM Lock)

  • Не позволяет нескольким Ruby-потокам выполнять Ruby-код одновременно
  • Поэтому Ruby потоки ≠ параллельность

⚙️ JIT (Just-In-Time Compiler)

Ruby интерпретируемый, но с 2.6 появилась опция компиляции “на лету”:

  • Ruby-код транслируется в C, потом в машинный код
  • Это ускоряет часто вызываемые методы

🔧 MJIT (Method-based JIT)

Появился в Ruby 2.6–3.2. Работает так:

  • Ruby-код → C-код → скомпилированный .so → подключается
  • Работает медленно и с нагревом (warm-up)

Ruby 3.2 убрал MJIT из продакшн-пути (остался для исследования)


⚡️ YJIT (Yet another JIT)

Создан Shopify. Работает на Rust, встроен прямо в интерпретатор.

  • Быстрее разогревается
  • По умолчанию включён с Ruby 3.3 (на Linux/macOS)
  • Идеален для Rails-приложений

🧵 Fiber

Облегчённый поток внутри Ruby:

f = Fiber.new do
  puts "start"
  Fiber.yield
  puts "resume"
end

f.resume # => start
f.resume # => resume

🔁 Fiber Scheduler API

Позволяет Ruby перехватывать операции I/O (sleep, gets, open-uri) и делать их неблокирующими:

  • Используется библиотеками вроде async, httpx, falcon
  • Основной шаг к полноценному async в Ruby

👥 Ractor

Новый механизм параллельности (с Ruby 3.0):

  • Запускает Ruby-код параллельно
  • Без GVL!
  • Жёсткая изоляция — только shareable объекты

💠 Data

Лёгкая структура (альтернатива Struct) с иммутабельностью:

Point = Data.define(:x, :y)
Point.new(1, 2)
  • Работает с Ractor (автоматически shareable)
  • Быстрее и проще Struct

🧪 RuboCop, Sorbet, RBS — это не ядро, но тоже словечки

  • RuboCop — линтер, проверяет стиль кода
  • Sorbet — статическая типизация от Shopify
  • RBS — декларативные сигнатуры типов (встроены в Ruby 3+)

🔬 TruffleRuby / JRuby / mruby

Альтернативные реализации:

Реализация Написана на Особенности
JRuby Java Потоки без GIL, JVM
TruffleRuby Java+Graal Быстрая, экспериментальная
mruby C Встраиваемый Ruby

🔚 Вывод: Ruby — не просто язык, а целая экосистема с множеством аббревиатур. На собеседованиях могут спросить хоть GVL, хоть YJIT. Главное — не запоминать термины, а понимать зачем они нужны.

🗓 Дата публикации: 30.01.2025, но это не точно...

Ruby GVL YJIT Ractors Fiber Scheduler CRuby