Вийшов 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
- Заміна Bison на генератор парсерів Lrama LALR [Feature #19637]
- Якщо зацікавлені, будь ласка, перегляньте Майбутнє бачення Ruby Parser
- Внутрішній парсер Lrama замінено на LR парсер, згенерований Racc для підтримуваності
- Підтримуються параметризуючі правила
(?, *, +), вони будуть використовуватися в Ruby parse.y
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нативних потоків.
- Оскільки лише один потік Ruby на Ractor може виконуватися одночасно, буде використовуватися кількість нативних потоків, яка є меншою з числа, вказаного в
Покращення продуктивності
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, сумісною з APIext/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 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