Вийшов Ruby 3.4.0 rc1
Опублікував naruse 12-12-2024
Переклав: Andrii Furmanets
Раді повідомити про вихід Ruby 3.4.0-rc1.
Prism
Перемкнуто парсер за замовчуванням з parse.y на Prism. [Feature #20564]
Модульний GC
-
Альтернативні реалізації збирача сміття (GC) можуть завантажуватися динамічно через функцію модульного GC. Щоб увімкнути цю функцію, сконфігуруйте Ruby з
--with-modular-gcпід час збірки. Бібліотеки GC можна завантажувати під час виконання, використовуючи змінну середовищаRUBY_GC_LIBRARY. [Feature #20351] -
Вбудований збирач сміття Ruby винесено в окремий файл
gc/default/default.cі він взаємодіє з Ruby через API, визначений уgc/gc_impl.h. Вбудований збирач сміття тепер також можна зібрати як бібліотеку, використовуючиmake modular-gc MODULAR_GC=default, і увімкнути через змінну середовищаRUBY_GC_LIBRARY=default. [Feature #20470] -
Експериментальна бібліотека GC на основі MMTk. Цю бібліотеку GC можна зібрати командою
make modular-gc MODULAR_GC=mmtkі увімкнути через змінну середовищаRUBY_GC_LIBRARY=mmtk. Для цього потрібен інструментарій Rust на машині збірки. [Feature #20860]
Зміни мови
-
Рядкові літерали у файлах без коментаря
frozen_string_literalтепер видають попередження про застаріле використання при їх зміні. Ці попередження можна увімкнути за допомогою-W:deprecatedабо встановившиWarning[:deprecated] = true. Щоб вимкнути цю зміну, можна запустити Ruby з параметром командного рядка--disable-frozen-string-literal. [Feature #20205] -
Додано
itдля посилання на параметр блоку. [Feature #18980] -
Тепер підтримується розпаковування ключових аргументів з
nilпід час виклику методів.**nilобробляється подібно до**{}, не передаючи ключових аргументів і не викликаючи жодних методів перетворення. [Bug #20064] -
Передавання блоку більше не дозволено в операції індексації. [Bug #19918]
-
Ключові аргументи більше не дозволені в операції індексації. [Bug #20218]
YJIT
TL;DR:
- Краща продуктивність у більшості бенчмарків на платформах x86-64 та arm64.
- Зменшене використання пам’яті метаданих компіляції
- Кілька виправлень помилок. YJIT став ще надійнішим і краще протестованим.
Нові можливості:
- Додано єдину межу пам’яті через параметр командного рядка
--yjit-mem-size(типово 128MiB) який відстежує загальне використання пам’яті YJIT і є більш інтуїтивним, ніж старий--yjit-exec-mem-size. - Більше статистики тепер завжди доступно через
RubyVM::YJIT.runtime_stats - Додано журнал компіляції для відстеження того, що компілюється, через
--yjit-log- Хвіст журналу також доступний під час виконання через
RubyVM::YJIT.log
- Хвіст журналу також доступний під час виконання через
- Додано підтримку розділюваних констант у режимі multi-ractor
- Тепер можна відстежувати підраховані виходи з
--yjit-trace-exits=COUNTER
Нові оптимізації:
- Стиснений контекст зменшує пам’ять, потрібну для зберігання метаданих YJIT
- Покращений алокатор з можливістю виділення регістрів для локальних змінних
- Коли YJIT увімкнено, більше базових примітивів реалізовано на Ruby:
Array#each,Array#select,Array#mapпереписано на Ruby для кращої продуктивності [Feature #20182].
- Можливість інлайнити невеликі або тривіальні методи, такі як:
- Порожні методи
- Методи, що повертають константу
- Методи, що повертають
self - Методи, що безпосередньо повертають аргумент
- Спеціалізована генерація коду для значно більшої кількості методів часу виконання
- Оптимізація
String#getbyte,String#setbyteта інших рядкових методів - Оптимізація бітових операцій для прискорення низькорівневих маніпуляцій з бітами/байтами
- Різні інші інкрементальні оптимізації
Оновлення основних класів
Примітка: наведено лише помітні оновлення класів.
-
Exception
Exception#set_backtraceтепер приймає масивThread::Backtrace::Location.Kernel#raise,Thread#raiseтаFiber#raiseтакож приймають цей новий формат. [Feature #13557]
-
Range
Range#sizeтепер викликаєTypeError, якщо діапазон не є ітерованим. [Misc #18984]
Проблеми сумісності
Примітка: Виключаючи виправлення помилок функцій.
- Змінено повідомлення про помилки та відображення стеків викликів.
- Як початкову лапку використовують одинарну лапку замість зворотної. [Feature #16495]
- Перед назвою методу відображають назву класу (лише коли клас має постійну назву). [Feature #19117]
- Методи
Kernel#caller,Thread::Backtrace::Locationтощо також змінено відповідно.
Old: test.rb:1:in `foo': undefined method `time' for an instance of Integer from test.rb:2:in `<main>' New: test.rb:1:in 'Object#foo': undefined method 'time' for an instance of Integer from test.rb:2:in '<main>'
Оновлення C API
rb_newobjтаrb_newobj_of(і відповідні макросиRB_NEWOBJ,RB_NEWOBJ_OF,NEWOBJ,NEWOBJ_OF) вилучено. [Feature #20265]- Вилучено застарілу функцію
rb_gc_force_recycle. [Feature #18290]
Інші зміни
-
Передавання блоку в метод, який не використовує переданий блок, показуватиме попередження в режимі verbose (
-w). [Feature #15554] -
Перевизначення деяких базових методів, які спеціально оптимізовані інтерпретатором та JIT, таких як
String.freezeабоInteger#+, тепер видає попередження про клас продуктивності (-W:performanceабоWarning[:performance] = true). [Feature #20429]
Див. GitHub releases, такі як Logger, або changelog для деталей default gems або bundled gems.
Див. NEWS або журнали комітів для подробиць.
Унаслідок цих змін 4820 файлів змінено, 196907 вставок(+), 253488 видалень(-) з часу Ruby 3.3.0!
Завантаження
-
https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0-rc1.tar.gz
SIZE: 23055998 SHA1: 216e3085ab8b886b9f74943ee5b62bd2e3d86671 SHA256: 1f3187d3366e90af6d760994f8bfe1fe8999a8ba3553ea4dcfae63e548236e2a SHA512: 0b0420a39c0bf3b38600d4e28805a581c4b5a6cf2abe41be8c8164276a8044a19e676de74eea5dd5b4d7d667d821a6144119795fea510fd4ba6e34865a2ae172 -
https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0-rc1.tar.xz
SIZE: 17116016 SHA1: 1424671cdc9c4bfe3778ac159d917c8bfe6107bd SHA256: 9c54225747f7a786727aa6213503083d5d8ff7097505d4b7456ff60880ee4a17 SHA512: 5b92a2b5829ab23735617945839e45df984b319b8932e790a8e0c6f681b9bd74249511a76345516cc216c002ed7887bdd27151501491d5ecedc20acd3fb57cc5 -
https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0-rc1.zip
SIZE: 28323595 SHA1: 4ae8ce4b15ccc3f0c6f42e408c44aa287a1ccc14 SHA256: 653162a2db627e8e5feee22a00b20acf215509d88b06ffb281bc8788ed12c74c SHA512: c6c6b9a0e61308e3f3303cd148613feabb2ee12d8e2fefc1f4aa1403237310f7c9be5e2031248ea89ff01cdc0bca1a66ff60f9f1f19ed9c9fccef3d7a3bbebb8
Що таке Ruby
Ruby уперше розробив Matz (Yukihiro Matsumoto) у 1993 році, і зараз вона розвивається як Open Source. Вона працює на багатьох платформах і використовується по всьому світу, особливо для веброзробки.
Останні новини
Вийшов Ruby 4.0.5
Вийшов Ruby 4.0.5.
Опублікував k0kubun 20-05-2026
Вийшов Ruby 4.0.4
Вийшов Ruby 4.0.4.
Опублікував k0kubun 11-05-2026
Вийшов Ruby 4.0.3
Вийшов Ruby 4.0.3.
Опублікував k0kubun 21-04-2026
Вийшов Ruby 3.2.11
Вийшов Ruby 3.2.11. Цей реліз містить оновлення gem zlib, яке усуває CVE-2026-27820.
Опублікував hsbt 27-03-2026