Вийшов 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 як частину ParseResultPrism.dump(source), який повертає серіалізований AST як StringPrism.parse_comments(source), який повертає коментарі
- Ви можете створювати pull requests або issues безпосередньо в репозиторії Prism, якщо зацікавлені у внеску
Використання Lrama замість Bison
- Заміна Bison на генератор парсерів Lrama LALR Feature #19637
- Якщо зацікавлені, будь ласка, перегляньте Майбутнє бачення Ruby Parser
- Внутрішній парсер Lrama замінено на LR парсер, згенерований Racc для підтримуваності
- Підтримуються параметризуючі правила
(?, *, +), вони будуть використовуватися в Ruby parse.y
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нативних потоків.
- Оскільки лише один потік Ruby на Ractor може виконуватися одночасно, буде використовуватися кількість нативних потоків, яка є меншою з числа, вказаного в
Інші помітні нові можливості
Мова
Покращення продуктивності
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, сумісною з APIext/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 3.2.10
Вийшов Ruby 3.2.10.
Опублікував hsbt 14-01-2026
Вийшов Ruby 4.0.1
Вийшов Ruby 4.0.1.
Опублікував k0kubun 13-01-2026
Вийшов 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