Вийшов Ruby 3.3.0

Опублікував naruse 25-12-2023
Переклав: Andrii Furmanets

Раді повідомити про вихід Ruby 3.3.0. Ruby 3.3 додає новий парсер під назвою Prism, використовує Lrama як генератор парсерів, додає новий чистий Ruby JIT компілятор під назвою RJIT та багато покращень продуктивності, особливо YJIT.

Prism

  • Впроваджено парсер Prism як gem за замовчуванням
    • Prism — це портативний, стійкий до помилок та підтримуваний рекурсивний нисхідний парсер для мови Ruby
  • Prism готовий до виробництва та активно підтримується, ви можете використовувати його замість Ripper
    • Є детальна документація про те, як використовувати Prism
    • Prism є одночасно бібліотекою C, яка буде використовуватися внутрішньо CRuby, та Ruby gem, який може використовуватися будь-яким інструментом, що потребує парсингу коду Ruby
    • Помітні методи в API Prism:
      • Prism.parse(source), який повертає AST як частину об’єкта результату парсингу
      • Prism.parse_comments(source), який повертає коментарі
      • Prism.parse_success?(source), який повертає true, якщо немає помилок
  • Ви можете створювати pull requests або issues безпосередньо в репозиторії Prism, якщо зацікавлені у внеску
  • Тепер ви можете використовувати ruby --parser=prism або RUBYOPT="--parser=prism" для експериментів з компілятором Prism. Зверніть увагу, що цей прапорець призначений лише для налагодження.

Використання Lrama замість Bison

YJIT

  • Значні покращення продуктивності порівняно з Ruby 3.2
    • Підтримка splat та rest аргументів покращена.
    • Регістри виділяються для операцій стеку віртуальної машини.
    • Більше викликів з опціональними аргументами компілюється. Обробники винятків також компілюються.
    • Непідтримувані типи викликів та мегаморфні місця викликів більше не виходять до інтерпретатора.
    • Базові методи, такі як Rails #blank? та спеціалізований #present?, інлайняться.
    • Integer#*, Integer#!=, String#!=, String#getbyte, Kernel#block_given?, Kernel#is_a?, Kernel#instance_of? та Module#=== спеціально оптимізовані.
    • Швидкість компіляції тепер трохи швидша, ніж у Ruby 3.2.
    • Тепер більш ніж у 3 рази швидше за інтерпретатор на Optcarrot!
  • Значно покращене використання пам’яті порівняно з Ruby 3.2
    • Метадані для скомпільованого коду використовують набагато менше пам’яті.
    • --yjit-call-threshold автоматично підвищується з 30 до 120 коли застосунок має більше 40,000 ISEQs.
    • Додано --yjit-cold-threshold для пропуску компіляції холодних ISEQs.
    • Генерується більш компактний код на Arm64.
  • Code GC тепер вимкнено за замовчуванням
    • --yjit-exec-mem-size розглядається як жорстка межа, де компіляція нового коду зупиняється.
    • Немає раптових падінь продуктивності через code GC. Краща поведінка copy-on-write на серверах, що перефорковуються з Pitchfork.
    • Ви все ще можете увімкнути code GC, якщо потрібно, за допомогою --yjit-code-gc
  • Додано RubyVM::YJIT.enable, який може увімкнути YJIT під час виконання
    • Ви можете запустити YJIT без зміни аргументів командного рядка або змінних середовища. Rails 7.2 увімкне YJIT за замовчуванням використовуючи цей метод.
    • Це також може використовуватися для увімкнення YJIT лише після того, як ваш застосунок завершить завантаження. --yjit-disable може використовуватися, якщо ви хочете використовувати інші опції YJIT, вимикаючи YJIT під час завантаження.
  • Більше статистики YJIT доступно за замовчуванням
    • yjit_alloc_size та кілька інших статистик, пов’язаних з метаданими, тепер доступні за замовчуванням.
    • Статистика ratio_in_yjit, створена --yjit-stats, тепер доступна в release збірках, більше не потрібна спеціальна stats або dev збірка для доступу до більшості статистик.
  • Додано більше можливостей профілювання
    • --yjit-perf додано для полегшення профілювання з Linux perf.
    • --yjit-trace-exits тепер підтримує вибірку з --yjit-trace-exits-sample-rate=N
  • Більш ретельне тестування та кілька виправлень помилок

RJIT

  • Впроваджено чистий Ruby JIT компілятор RJIT та замінено MJIT.
    • RJIT підтримує лише архітектуру x86-64 на платформах Unix.
    • На відміну від MJIT, він не потребує компілятора C під час виконання.
  • RJIT існує лише для експериментальних цілей.
    • Ви повинні продовжувати використовувати YJIT у виробництві.
  • Якщо зацікавлені у розробці JIT для Ruby, будь ласка, перегляньте презентацію k0kubun на День 3 RubyKaigi.

Планувальник потоків M:N

  • Впроваджено планувальник потоків M:N. [Feature #19842]
    • M потоків Ruby керуються N нативними потоками (потоками ОС), тому витрати на створення та керування потоками зменшуються.
    • Це може порушити сумісність C-розширень, тому планувальник потоків M:N вимкнено на основному Ractor за замовчуванням.
      • Змінна середовища RUBY_MN_THREADS=1 увімкнює потоки M:N на основному Ractor.
      • Потоки M:N завжди увімкнені на неосновних Ractors.
    • Змінна середовища RUBY_MAX_CPU=n встановлює максимальну кількість N (максимальна кількість нативних потоків). Типове значення — 8.
      • Оскільки лише один потік Ruby на Ractor може виконуватися одночасно, буде використовуватися кількість нативних потоків, яка є меншою з числа, вказаного в RUBY_MAX_CPU, та кількості запущених Ractors. Тому застосунки з одним Ractor (більшість застосунків) використовуватимуть лише 1 нативний потік.
      • Для підтримки блокуючих операцій може використовуватися більше ніж N нативних потоків.

Покращення продуктивності

  • defined?(@ivar) оптимізовано з Object Shapes.
  • Розв’язання імен, таке як Socket.getaddrinfo, тепер може бути перервано (у середовищах, де доступні pthreads). [Feature #19965]
  • Кілька покращень продуктивності збирача сміття
    • Молоді об’єкти, на які посилаються старі об’єкти, більше не одразу підвищуються до старого покоління. Це значно зменшує частоту великих зборів GC. [Feature #19678]
    • Введено нову змінну налаштування REMEMBERED_WB_UNPROTECTED_OBJECTS_LIMIT_RATIO для контролю кількості незахищених об’єктів, що викликають великий збір GC. Типове значення встановлено на 0.01 (1%). Це значно зменшує частоту великих зборів GC. [Feature #19571]
    • Write Barriers реалізовано для багатьох основних типів, яким їх не вистачало, зокрема Time, Enumerator, MatchData, Method, File::Stat, BigDecimal та кілька інших. Це значно зменшує час малих зборів GC та частоту великих зборів GC.
    • Більшість основних класів тепер використовують Variable Width Allocation, зокрема Hash, Time, Thread::Backtrace, Thread::Backtrace::Location, File::Stat, Method. Це робить ці класи швидшими для виділення та звільнення, використовують менше пам’яті та зменшують фрагментацію купи.
    • Додано підтримку слабких посилань до збирача сміття. [Feature #19783]

Інші помітні зміни з версії 3.2

IRB

IRB отримав кілька покращень, включаючи, але не обмежуючись:

  • Розширена інтеграція irb:rdbg, яка забезпечує еквівалентний досвід налагодження до pry-byebug (doc).
  • Підтримка пейджера для команд ls, show_source та show_cmds.
  • Більш точна та корисна інформація, надана командами ls та show_source.
  • Експериментальне автодоповнення з використанням аналізу типів (doc).
  • Тепер можна змінити колір шрифту та стиль шрифту в діалозі доповнення за допомогою нового класу Reline::Face (doc)

Крім того, IRB також пройшов значний рефакторинг та отримав десятки виправлень помилок для полегшення майбутніх покращень.

Для більш детальних оновлень, будь ласка, зверніться до Розкриття великого стрибка в IRB Ruby 3.3.

Проблеми сумісності

Примітка: Виключаючи виправлення помилок функцій.

  • Виклики it без аргументів у блоці без звичайних параметрів застарілі. it буде посиланням на перший параметр блоку в Ruby 3.4. [Feature #18980]

  • Regexp::new тепер приймає лише до 2 аргументів замість 3. Це було застарілим у Ruby 3.2. [Bug #18797]

Видалені змінні середовища

Наступні застарілі методи видалено.

  • Змінна середовища RUBY_GC_HEAP_INIT_SLOTS застаріла та не працює. Будь ласка, використовуйте змінні середовища RUBY_GC_HEAP_{0,1,2,3,4}_INIT_SLOTS замість цього. [Feature #19785]

Проблеми сумісності стандартної бібліотеки

ext/readline виведено з експлуатації

  • У нас є reline, яка є чистою реалізацією Ruby, сумісною з API ext/readline. Ми покладаємося на reline у майбутньому. Якщо вам потрібно використовувати ext/readline, ви можете встановити ext/readline через rubygems.org за допомогою gem install readline-ext.
  • Нам більше не потрібно встановлювати бібліотеки, такі як libreadline або libedit.

Оновлення стандартної бібліотеки

RubyGems та Bundler попереджають, якщо користувачі роблять require наступних gems без додавання їх до Gemfile або gemspec. Це тому, що вони стануть bundled gems у майбутній версії Ruby.

Це попередження пригнічується, якщо ви використовуєте gem bootsnap. Ми рекомендуємо запускати ваш застосунок зі змінною середовища DISABLE_BOOTSNAP=1 принаймні один раз. Це обмеження цієї версії.

Цільові бібліотеки:

  • abbrev
  • base64
  • bigdecimal
  • csv
  • drb
  • getoptlong
  • mutex_m
  • nkf
  • observer
  • racc
  • resolv-replace
  • rinda
  • syslog

Додано наступний default gem.

  • prism 0.19.0

Оновлено наступні default gems.

  • RubyGems 3.5.3
  • abbrev 0.1.2
  • base64 0.2.0
  • benchmark 0.3.0
  • bigdecimal 3.1.5
  • bundler 2.5.3
  • cgi 0.4.1
  • csv 3.2.8
  • date 3.3.4
  • delegate 0.3.1
  • drb 2.2.0
  • english 0.8.0
  • erb 4.0.3
  • error_highlight 0.6.0
  • etc 1.4.3
  • fcntl 1.1.0
  • fiddle 1.1.2
  • fileutils 1.7.2
  • find 0.2.0
  • getoptlong 0.2.1
  • io-console 0.7.1
  • io-nonblock 0.3.0
  • io-wait 0.3.1
  • ipaddr 1.2.6
  • irb 1.11.0
  • json 2.7.1
  • logger 1.6.0
  • mutex_m 0.2.0
  • net-http 0.4.0
  • net-protocol 0.2.2
  • nkf 0.1.3
  • observer 0.1.2
  • open-uri 0.4.1
  • open3 0.2.1
  • openssl 3.2.0
  • optparse 0.4.0
  • ostruct 0.6.0
  • pathname 0.3.0
  • pp 0.5.0
  • prettyprint 0.2.0
  • pstore 0.1.3
  • psych 5.1.2
  • rdoc 6.6.2
  • readline 0.0.4
  • reline 0.4.1
  • resolv 0.3.0
  • rinda 0.2.0
  • securerandom 0.3.1
  • set 1.1.0
  • shellwords 0.2.0
  • singleton 0.2.0
  • stringio 3.1.0
  • strscan 3.0.7
  • syntax_suggest 2.0.0
  • syslog 0.1.2
  • tempfile 0.2.1
  • time 0.3.0
  • timeout 0.4.1
  • tmpdir 0.2.0
  • tsort 0.2.0
  • un 0.3.0
  • uri 0.13.0
  • weakref 0.1.3
  • win32ole 1.8.10
  • yaml 0.3.0
  • zlib 3.1.0

Наступний bundled gem підвищено зі статусу default gems.

  • racc 1.7.3

Оновлено наступні bundled gems.

  • minitest 5.20.0
  • rake 13.1.0
  • test-unit 3.6.1
  • rexml 3.2.6
  • rss 0.3.0
  • net-ftp 0.3.3
  • net-imap 0.4.9
  • net-smtp 0.4.0
  • rbs 3.4.0
  • typeprof 0.21.9
  • debug 1.9.1

Див. GitHub releases, такі як Logger, або changelog для деталей default gems або bundled gems.

Див. NEWS або журнали комітів для подробиць.

Унаслідок цих змін 5532 файлів змінено, 326851 вставок(+), 185793 видалень(-) з часу Ruby 3.2.0!

З Різдвом, зі святами, і приємного програмування з Ruby 3.3!

Завантаження

  • https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0.tar.gz

    SIZE: 22065999
    SHA1: 1a7e56851bf29bda1183aca99b3b323c58e0187b
    SHA256: 96518814d9832bece92a85415a819d4893b307db5921ae1f0f751a9a89a56b7d
    SHA512: 26074009b501fc793d71a74e419f34a6033c9353433919ca74ba2d24a3de432dbb11fd92c2bc285f0e4d951a6d6c74bf5b69a2ab36200c8c26e871746d6e0fc6
    
  • https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0.tar.xz

    SIZE: 16345456
    SHA1: c8f68e1b0a114b90460a0b44165a3b2f540fa5b6
    SHA256: 676b65a36e637e90f982b57b059189b3276b9045034dcd186a7e9078847b975b
    SHA512: 7959c5753bfa0bfc4d6d74060869aabbe9815c1c97930659da11b917ee0803ddbbd80e869e00c48b8694b4ba48709c3b6493fd045568e36e902616c35ababf01
    
  • https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0.zip

    SIZE: 26935108
    SHA1: a433eef1d7f96daeaf3b4cb842d0ed2dd82e7dc1
    SHA256: 0e6563f679dd3694732eb3addf9de681c67b584602ac574376b60e7a509d2cd8
    SHA512: a94a85937a14b217c1f4b90d24185289ed4aee79239c4f3eecf8034d3fd34e65ee8d66869473857ed153067188adc9b70c0471e4ebe842c9f98ef60c34090450
    

Що таке Ruby

Ruby уперше розробив Matz (Yukihiro Matsumoto) у 1993 році, і зараз вона розвивається як Open Source. Вона працює на багатьох платформах і використовується по всьому світу, особливо для веброзробки.

Останні новини

Вийшов Ruby 4.0.0

Ми раді повідомити про випуск Ruby 4.0.0. Ruby 4.0 представляє “Ruby Box” та “ZJIT”, а також додає багато покращень.

Опублікував naruse 25-12-2025

Новий вигляд документації Ruby

Слідом за ре-дизайном ruby-lang.org, ми маємо більше новин, щоб відсвяткувати 30-річчя Ruby: docs.ruby-lang.org має повністю новий вигляд завдяки Aliki — новій темі за замовчуванням для...

Опублікував Stan Lo 23-12-2025

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