Вийшов 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 3.2.11

Вийшов Ruby 3.2.11. Цей реліз містить оновлення gem zlib, яке усуває CVE-2026-27820.

Опублікував hsbt 27-03-2026

Більше новин...