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. Главное — не запоминать термины, а понимать зачем они нужны.