Вийшов Ruby 3.1.0 Preview 1

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

Ми раді оголосити випуск Ruby 3.1.0-preview1.

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. Вона також обмежена macOS & Linux на платформах x86-64 зараз.

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

Новий дебагер debug.gem включено. debug.gem - це швидка реалізація дебагера, і вона надає багато функцій, таких як віддалений дебагінг, кольоровий REPL, інтеграція IDE (VSCode) та інше. Він замінює стандартну бібліотеку lib/debug.rb.

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

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

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

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

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

Покращення Irb

Буде описано в наступному preview.

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

Мова

  • Значення в літералах 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]]

RBS

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

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

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

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

TypeProf

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

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

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

  • 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]

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

  • Деякі стандартні бібліотеки оновлено.
    • RubyGems
    • Bundler
    • RDoc 6.4.0
    • ReLine
    • JSON 2.6.0
    • Psych 4.0.2
    • FileUtils 1.6.0
    • Fiddle
    • StringIO 3.0.1
    • IO::Console 0.5.9
    • IO::Wait 0.2.0
    • CSV
    • Etc 1.3.0
    • Date 3.2.0
    • Zlib 2.1.1
    • StringScanner
    • IpAddr
    • Logger 1.4.4
    • OStruct 0.5.0
    • Irb
    • Racc 1.6.0
    • Delegate 0.2.0
    • Benchmark 0.2.0
    • CGI 0.3.0
    • Readline(C-ext) 0.1.3
    • Timeout 0.2.0
    • YAML 0.2.0
    • URI 0.11.0
    • OpenSSL
    • DidYouMean
    • Weakref 0.1.1
    • Tempfile 0.1.2
    • TmpDir 0.1.2
    • English 0.7.1
    • Net::Protocol 0.1.2
    • Net::Http 0.2.0
    • BigDecimal
    • OptionParser 0.2.0
    • Set
    • Find 0.1.1
    • Rinda 0.1.1
    • Erb
    • NKF 0.1.1
    • Base64 0.1.1
    • OpenUri 0.2.0
    • SecureRandom 0.1.1
    • Resolv 0.2.1
    • Resolv::Replace 0.1.0
    • Time 0.2.0
    • PP 0.2.1
    • Prettyprint 0.1.1
    • Drb 2.1.0
    • Pathname 0.2.0
    • Digest 3.1.0.pre2
    • Un 0.2.0
  • Наступні включені gems оновлено.
    • minitest 5.14.4
    • power_assert 2.0.1
    • rake 13.0.6
    • test-unit 3.5.0
    • rbs 1.6.2
    • typeprof 0.20.0
  • Наступні default gems тепер є bundled gems.
    • net-ftp
    • net-imap
    • net-pop
    • net-smtp
    • matrix
    • prime

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

З цими змінами, 2963 файлів змінено, 529321 додано(+), 92305 видалено(-) з Ruby 3.0.0!

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

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

    РОЗМІР: 20821221
    SHA1: 40dfd3db076a49fab9a0eee51e89d9b3d16a4e23
    SHA256: 540f49f4c3aceb1a5d7fb0b8522a04dd96bc4a22f9660a6b59629886c8e010d4
    SHA512: 63f528f20905827d03649ed9804e4a4e5c15078f9c6c8efcfb306baa7baafa17a406eb09a2c08b42e151e14af33b1aadbd9fb1cc84f9353d070b54bbf1ff950d
    
  • https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0-preview1.tar.xz

    РОЗМІР: 15742844
    SHA1: 22aa861b17031cd1b163b7443f5f2f5897c5895e
    SHA256: 86a836ad42f6a7a469fce71ffec48fd3184af55bf79e488b568a4f64adee551d
    SHA512: bdbd7c624197ca478658280d84123a8c12ae72425bc566dcc75989c5b5ef114dd57e64efc09e2413ed615d9b47621a70ace0f3612e8ca7ba853822ad9e88c0b0
    
  • https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0-preview1.zip

    РОЗМІР: 25019629
    SHA1: ef5fa22890e55935db4b96b3089a8aea1335bd85
    SHA256: 4e8d118b2365164873148ac545a8fa36c098b846a9b19ebb9037f8ee9adb4414
    SHA512: 917803aac0848e00871614a09740b5c9cca26f200d68580dde61666633f1b7fee506e25ea4ed0c38eb20149417bf9f1ed449a4d2aec5b726de670e7177e5c07a
    

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

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