Вийшов Ruby 3.3.0-preview3

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

Раді повідомити про вихід Ruby 3.3.0-preview3. 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 як частину 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 та форкінг
  • Статистика 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 рази в наших експериментах). Ми не очікуємо, що накладні витрати на розв’язання імен будуть проблемою для більшості застосунків, але якщо ви спостерігаєте таке, або якщо бачите неочікувані ефекти, які, на вашу думку, пов’язані з цією зміною, будь ласка, повідомте про них.
  • Змінна середовища RUBY_GC_HEAP_REMEMBERED_WB_UNPROTECTED_OBJECTS_LIMIT_RATIO додано. Feature #19571
  • Діти старих об’єктів більше не одразу підвищуються до старого покоління в збирачі сміття. Feature #19678
  • Додано підтримку слабких посилань до збирача сміття. Feature #19783

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

IRB

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

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

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

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

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

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

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

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

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

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

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

  • Змінна середовища 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 або журнали комітів для подробиць.

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

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

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

    SIZE: 21550473
    SHA1: 2811f191d66dffee0206771873bd990857ae4ed6
    SHA256: 0969141be92e67e0edb84a8fb354acc98f01bd78e602a23a0f136045c82f4809
    SHA512: 94db07a6958c09809b2e5b597fa55a121074e8bacb3bf588c83cf0d35b07a8b070172035a49d1abf0d8ee364a9ace824f34e677f7327ffe1acdbab0938ac49c4
    
  • https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0-preview3.tar.xz

    SIZE: 15970144
    SHA1: 496600612605f8ebeb955255e98bac73a4cbc045
    SHA256: f79afcf122dc7d04fe26cfa4436b9c488b21766fc54b0d2dfb2ba41cd0cdd355
    SHA512: d7ab0d703e7884efd31045933409cd68fac1d9941963537ccc8e309ca7c8bee8500a68182135acba22cbdbf4a8ae99f39bf7f0925273eb4fbc3728c0c1ba0c19
    
  • https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0-preview3.zip

    SIZE: 26618303
    SHA1: 6a13e08c7e484d42037c1e2c87c5d0e220f893a0
    SHA256: c35bf637a647c2f60148368ffb374db5c258570911794f46b6dfdb98ebfe95d9
    SHA512: c4ef2cdcdadeb85ad1d42aedc97f9f3d609b3b01eea2319451cf92c81bd31ae8129b7c91fc68571469dd888c01ea0f48f73234b965db17f6a87404ca382f7794
    

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

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