Вийшов Ruby 3.1.0

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

Ми раді оголосити випуск Ruby 3.1.0. Ruby 3.1 зберігає сумісність з Ruby 3.0 та також додає багато функцій.

YJIT: Новий експериментальний in-process JIT компілятор

Ruby 3.1 об’єднує YJIT, новий in-process JIT компілятор, розроблений Shopify.

З того часу, як Ruby 2.6 ввів MJIT у 2018, його продуктивність значно покращилася, і нарешті ми досягли Ruby3x3 минулого року. Але навіть незважаючи на те, що бенчмарк Optcarrot показав вражаючі прискорення, JIT не приніс користі реальним бізнес-додаткам.

Недавно Shopify внесли багато покращень Ruby для прискорення їхнього Rails додатку. YJIT - це важливий внесок, і має на меті покращити продуктивність Rails додатків.

Поки MJIT є метод-орієнтованим JIT компілятором і використовує зовнішній C компілятор, YJIT використовує Basic Block Versioning та включає JIT компілятор всередині себе. З Lazy Basic Block Versioning (LBBV) він спочатку компілює початок методу, та інкрементально компілює решту, коли тип аргументів та змінних динамічно визначається. Див. YJIT: a basic block versioning JIT compiler for CRuby для детального вступу.

З цією технологією YJIT досягає як швидкого часу прогріву, так і покращень продуктивності на більшості реального програмного забезпечення, до 22% на railsbench, 39% на liquid-render.

YJIT все ще є експериментальною функцією, і як така, вона вимкнена за замовчуванням. Якщо ви хочете використати це, вкажіть опцію командного рядка --yjit, щоб увімкнути YJIT. Вона також обмежена Unix-подібними платформами x86-64 зараз.

debug gem: Новий дебагер

Повністю переписаний дебагер debug.gem включено. debug.gem має наступні функції:

  • Покращити продуктивність дебагінгу (він не сповільнює додаток навіть з дебагером).
  • Підтримка віддаленого дебагінгу.
  • Підтримка багатого фронтенду дебагінгу (VS Code та Chrome браузер підтримуються зараз).
  • Підтримка багатопроцесного/багатопотокового дебагінгу.
  • Кольоровий REPL.
  • Та інші корисні функції, такі як функція запису та відтворення, функція трасування тощо.

Ruby мав включений lib/debug.rb, але він не був добре підтриманий і мав проблеми з продуктивністю та функціями. debug.gem повністю замінює lib/debug.rb.

error_highlight: Детальне розташування помилки в backtrace

Вбудований gem, error_highlight, введено. Він включає детальне розташування помилки в backtraces:

$ ruby test.rb
test.rb:1:in `<main>': undefined method `time' for 1:Integer (NoMethodError)

1.time {}
 ^^^^^
Did you mean?  times

Зараз підтримується лише NameError.

Цей gem увімкнено за замовчуванням. Ви можете вимкнути його, використовуючи опцію командного рядка --disable-error_highlight. Див. репозиторій error_highlight для деталей.

IRB Автодоповнення та Відображення Документації

IRB тепер має функцію автодоповнення, де ви можете просто ввести код, і діалог кандидатів доповнення з’явиться. Ви можете використовувати Tab та Shift+Tab для переміщення вгору та вниз.

Якщо документація встановлена, коли ви вибираєте кандидата доповнення, діалог документації з’явиться поруч з діалогом кандидатів доповнення, показуючи частину вмісту. Ви можете прочитати повну документацію, натиснувши Alt+d.

Інші помітні нові функції

Мова

  • Значення в літералах Hash та ключових аргументах можуть бути пропущені. [Функція #14579]
    • {x:, y:} є синтаксичним цукром для {x: x, y: y}.
    • foo(x:, y:) є синтаксичним цукром для foo(x: x, y: y).
  • Оператор pin (^) в pattern matching тепер приймає вираз. [Функція #17411]

    Prime.each_cons(2).lazy.find_all{_1 in [n, ^(n + 2)]}.take(3).to_a
    #=> [[3, 5], [5, 7], [11, 13]]
    
  • Дужки можуть бути пропущені в однолінійному pattern matching. [Функція #16182]

    [0, 1] => _, x
    {y: 2} => y:
    x #=> 1
    y #=> 2
    

RBS

RBS - це мова для опису структури програм Ruby. Див. репозиторій RBS для деталей.

Оновлення з Ruby 3.0.0:

  • Параметри дженеричних типів можуть бути обмежені. (PR)
  • Дженеричні псевдоніми типів підтримуються. (PR)
  • rbs collection введено для управління RBS gems. (doc)
  • Багато підписів для вбудованих та стандартних бібліотек було додано/оновлено.
  • Він також включає багато виправлень помилок та покращень продуктивності.

Див. RBS changelog для більше інформації.

TypeProf

TypeProf - це статичний аналізатор типів для Ruby. Він генерує прототип RBS з коду Ruby без анотацій типів. Див. документацію для деталей.

Головне оновлення з Ruby 3.0.0 - це експериментальна підтримка IDE, звана “TypeProf for IDE”.

Demo of TypeProf for IDE

Розширення VS Code показує вгаданий (або явно написаний у файлі RBS) підпис методу над кожним визначенням методу, малює червоне підкреслення під кодом, який може спричинити помилку імені або типу, та доповнює імена методів (тобто показує кандидатів методів). Див. документацію для деталей.

Також випуск включає багато виправлень помилок та покращень продуктивності.

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

  • MJIT
    • Для навантажень, таких як Rails, значення за замовчуванням --jit-max-cache змінено з 100 на 10000. JIT компілятор більше не пропускає компіляцію методів довших за 1000 інструкцій.
    • Для підтримки Zeitwerk з Rails, JIT-компільований код більше не скасовується коли TracePoint для подій класу увімкнено.

Інші помітні зміни з 3.0

  • Однолінійний pattern matching, наприклад, ary => [x, y, z], більше не є експериментальним.
  • Порядок оцінки множинного присвоєння змінено трохи. [Помилка #4443]
    • foo[0], bar[0] = baz, qux оцінювався в порядку baz, qux, foo, а потім bar в Ruby 3.0. В Ruby 3.1, він оцінюється в порядку foo, bar, baz, а потім qux.
  • Variable Width Allocation: Strings (експериментально). [Помилка #18239]

  • Psych 4.0 змінює Psych.load використовувати safe_load за замовчуванням. Вам може знадобитися використати Psych 3.3.2 для міграції до цієї поведінки. [Помилка #17866]

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

  • Наступні default gems оновлено.
    • RubyGems 3.3.3
    • base64 0.1.1
    • benchmark 0.2.0
    • bigdecimal 3.1.1
    • bundler 2.3.3
    • cgi 0.3.1
    • csv 3.2.2
    • date 3.2.2
    • did_you_mean 1.6.1
    • digest 3.1.0
    • drb 2.1.0
    • erb 2.2.3
    • error_highlight 0.3.0
    • etc 1.3.0
    • fcntl 1.0.1
    • fiddle 1.1.0
    • fileutils 1.6.0
    • find 0.1.1
    • io-console 0.5.10
    • io-wait 0.2.1
    • ipaddr 1.2.3
    • irb 1.4.1
    • json 2.6.1
    • logger 1.5.0
    • net-http 0.2.0
    • net-protocol 0.1.2
    • nkf 0.1.1
    • open-uri 0.2.0
    • openssl 3.0.0
    • optparse 0.2.0
    • ostruct 0.5.2
    • pathname 0.2.0
    • pp 0.3.0
    • prettyprint 0.1.1
    • psych 4.0.3
    • racc 1.6.0
    • rdoc 6.4.0
    • readline 0.0.3
    • readline-ext 0.1.4
    • reline 0.3.0
    • resolv 0.2.1
    • rinda 0.1.1
    • ruby2_keywords 0.0.5
    • securerandom 0.1.1
    • set 1.0.2
    • stringio 3.0.1
    • strscan 3.0.1
    • tempfile 0.1.2
    • time 0.2.0
    • timeout 0.2.0
    • tmpdir 0.1.2
    • un 0.2.0
    • uri 0.11.0
    • yaml 0.2.0
    • zlib 2.1.1
  • Наступні включені gems оновлено.
    • minitest 5.15.0
    • power_assert 2.0.1
    • rake 13.0.6
    • test-unit 3.5.3
    • rexml 3.2.5
    • rbs 2.0.0
    • typeprof 0.21.1
  • Наступні default gems тепер є bundled gems. Вам потрібно додати наступні бібліотеки до Gemfile в середовищі bundler.
    • net-ftp 0.1.3
    • net-imap 0.2.2
    • net-pop 0.1.1
    • net-smtp 0.3.1
    • matrix 0.4.2
    • prime 0.1.2
    • debug 1.4.0

Див. NEWS або логи комітів для більше деталей.

З цими змінами, 3124 файлів змінено, 551760 додано(+), 99167 видалено(-) з Ruby 3.0.0!

Веселих свят, щасливих святкових днів, та насолоджуйтеся програмуванням з Ruby 3.1!

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

  • https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0.tar.gz

    РОЗМІР: 20103517
    SHA1: e4e8c20dd2a1fdef4d3e5bd5a3461000dd17f226
    SHA256: 50a0504c6edcb4d61ce6b8cfdbddaa95707195fab0ecd7b5e92654b2a9412854
    SHA512: 76009d325e961e601d9a287e36490cbc1f3b5dbf4878fa6eab2c4daa5ff2fed78cbc7525cd87b09828f97cbe2beb30f528928bcc5647af745d03dffe7c5baaa9
    
  • https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0.tar.xz

    РОЗМІР: 14709096
    SHA1: 92b603c2a69fb25d66c337a63e94280984edea11
    SHA256: 1a0e0b69b9b062b6299ff1f6c6d77b66aff3995f63d1d8b8771e7a113ec472e2
    SHA512: a2bb6b5e62d5fa06dd9c30cf84ddcb2c27cb87fbaaffd2309a44391a6b110e1dde6b7b0d8c659b56387ee3c9b4264003f3532d5a374123a7c187ebba9293f320
    
  • https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0.zip

    РОЗМІР: 24388179
    SHA1: e37435956d6f840a0e8758d7374bc7e0e346105f
    SHA256: a3bfcd486d09c065d46421da0ff3d430ce4423fefd80cea63c6595d83ae4af0e
    SHA512: 67db71144e06da2c1c25eaf413d1417c99a4b18738a573f9e3371c11ea242eee9dcbdc3de17336f25ab5060039fe034e57298943d344be9cd9eb33bb56e2e1c6
    

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

Вийшов Ruby 4.0.0 preview3

Раді повідомити про вихід Ruby 4.0.0-preview3. Ruby 4.0 вводить Ruby::Box і “ZJIT” та додає багато покращень.

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

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