Вийшов Ruby 3.3.0-rc1

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

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

Після випуску RC1 ми уникатимемо впровадження несумісностей ABI, де це можливо. Якщо нам потрібно це зробити, ми оголосимо про це в примітках до релізу.

Prism

  • Впроваджено парсер Prism як gem за замовчуванням
    • Prism — це портативний, стійкий до помилок та підтримуваний рекурсивний нисхідний парсер для мови Ruby
  • Prism готовий до виробництва та активно підтримується, ви можете використовувати його замість Ripper
    • Є детальна документація про те, як використовувати Prism
    • Prism є одночасно бібліотекою C, яка буде використовуватися внутрішньо CRuby, та Ruby gem, який може використовуватися будь-яким інструментом, що потребує парсингу коду Ruby
    • Помітні методи в API Prism:
      • Prism.parse(source), який повертає AST як частину ParseResult
      • Prism.dump(source), який повертає серіалізований AST як String
      • Prism.parse_comments(source), який повертає коментарі
  • Ви можете створювати pull requests або issues безпосередньо в репозиторії Prism, якщо зацікавлені у внеску

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

RJIT

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

YJIT

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

Планувальник потоків 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
    • Для цієї мети тепер створюється pthread щоразу, коли викликається getaddrinfo або getnameinfo. Це спричиняє деякі накладні витрати в розв’язанні імен (приблизно в 2.5 рази в наших експериментах). Ми не очікуємо, що накладні витрати на розв’язання імен будуть проблемою для більшості застосунків, але якщо ви спостерігаєте таке, або якщо бачите неочікувані ефекти, які, на вашу думку, пов’язані з цією зміною, будь ласка, повідомте про них.
  • Кілька покращень продуктивності збирача сміття
    • Молоді об’єкти, на які посилаються старі об’єкти, більше не одразу підвищуються до старого покоління. Це значно зменшує частоту великих зборів 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 також пройшов значний рефакторинг та отримав десятки виправлень помилок для полегшення майбутніх покращень.

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

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

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

Видалені константи

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

Видалені методи

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

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

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

  • Змінна середовища 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.

Оновлення C API

Оновлені C API

Наступні API оновлено.

Видалені C API

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

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

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

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

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

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

  • prism 0.15.1

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

  • RubyGems 3.5.0.dev
  • base64 0.2.0
  • benchmark 0.3.0
  • bigdecimal 3.1.5
  • bundler 2.5.0.dev
  • cgi 0.4.0
  • csv 3.2.8
  • date 3.3.4
  • delegate 0.3.1
  • drb 2.2.0
  • english 0.8.0
  • erb 4.0.3
  • etc 1.4.3.dev.1
  • fcntl 1.1.0
  • fiddle 1.1.2
  • fileutils 1.7.2
  • find 0.2.0
  • getoptlong 0.2.1
  • io-console 0.6.1.dev
  • irb 1.8.3
  • 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.0
  • open3 0.2.0
  • 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.1.1
  • rdoc 6.6.0
  • reline 0.3.9
  • rinda 0.2.0
  • securerandom 0.3.0
  • shellwords 0.2.0
  • singleton 0.2.0
  • stringio 3.0.9
  • strscan 3.0.7
  • syntax_suggest 1.1.0
  • tempfile 0.2.0
  • 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-imap 0.4.4
  • net-smtp 0.4.0
  • rbs 3.2.2
  • typeprof 0.21.8
  • debug 1.8.0

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

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

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

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

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

    SIZE: 21783575
    SHA1: c75a860e06f27b7f69b874757417277c21d1d3f4
    SHA256: c4ff82395a90ef76c7f906b7687026e0ab96b094dcf3a532d9ab97784a073222
    SHA512: 265fb2ffe55af47d8349edffcebe749cc170291227cef55529fe4e67363e4e84b88daa34ffb5364a99c8a0e32110266a34c9a11d62f3bd6f6d47fa76eca641f4
    
  • https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0-rc1.tar.xz

    SIZE: 16163884
    SHA1: 26503f9bdc7d0a05aaa9836f54d3aa9e74a9ead9
    SHA256: 051815637f1fa75a1edf2c54b66d5d5b69563daad777da8dc39543b7754b5290
    SHA512: 82f4acfaad1dc47db27ee3eb952481a95b3474a98059e9e9f5ceb035b690d1faabe99f2ec52371c4089ed1615eb10c395f029088418fec4d26399b65b4f259b9
    
  • https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0-rc1.zip

    SIZE: 26735443
    SHA1: 35583453a7734216b08829ef0ec9ea1bc0d4ae7f
    SHA256: 56dd82e1dd714f2889ca975ae7befbe005675de08839c2cc4a484de2ae65201c
    SHA512: 7fbe414c230aedc9f364512bcbc213038f8f6e4268929a559d2527e2f3e32a140b394e37098ab7e59161236eca8b89cc9e52d73a3be8d7bd44faa91681483f5d
    

Що таке 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

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