Вийшов Ruby 2.6.0-rc1

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

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

Ruby 2.6.0-rc1 - це перший release candidate Ruby 2.6.0. Він вводить деякі нові функції та покращення продуктивності, наприклад:

JIT

Ruby 2.6 вводить початкову реалізацію JIT (Just-in-time) компілятора.

JIT компілятор має на меті покращити продуктивність виконання будь-якої програми Ruby. На відміну від звичайних JIT компіляторів для інших мов, JIT компілятор Ruby робить JIT компіляцію унікальним способом, який виводить C код на диск та запускає загальний процес компілятора C для генерації нативного коду. Див. також: MJIT організація від Vladimir Makarov.

Як використовувати: Просто вкажіть --jit в командному рядку або змінній середовища $RUBYOPT. Вказівка --jit-verbose=1 дозволяє вивести базову інформацію про поточну JIT компіляцію. Див. ruby --help для інших опцій.

Основна мета цього JIT випуску - надати можливість перевірити, чи працює він на вашій платформі, та виявити ризики безпеки перед випуском 2.6. JIT компілятор підтримується коли Ruby зібрано GCC, Clang, або Microsoft VC++, який потребує бути доступним під час виконання. Інакше ви не можете використовувати його зараз.

Станом на Ruby 2.6.0-rc1, ми досягли продуктивності в 1.7 рази швидше, ніж Ruby 2.5 на CPU-інтенсивному нетривіальному бенчмарку навантаження, званому Optcarrot https://gist.github.com/k0kubun/d7f54d96f8e501bbbc78b927640f4208. Ми збираємося покращити продуктивність на пам’ятно-інтенсивному навантаженні, такому як додатки Rails, також.

Слідкуйте за новою ерою продуктивності Ruby.

RubyVM::AbstractSyntaxTree [Експериментально]

Ruby 2.6 вводить модуль RubyVM::AbstractSyntaxTree.

Цей модуль має метод parse, який парсить заданий код ruby рядка та повертає вузли AST (Abstract Syntax Tree), та метод parse_file, який парсить заданий файл коду ruby та повертає вузли AST. Також введено клас RubyVM::AbstractSyntaxTree::Node. Ви можете отримати інформацію про місце розташування та дочірні вузли з об’єктів Node. Ця функція є експериментальною. Сумісність структури вузлів AST не гарантується.

Нові функції

  • Додано новий аліас then до Kernel#yield_self. [Функція #14594]

  • else без rescue тепер спричиняє синтаксичну помилку. [ЕКСПЕРИМЕНТАЛЬНО]

  • імена констант можуть починатися з не-ASCII великої літери. [Функція #13770]

  • нескінченний діапазон [Функція #12912]

    Введено нескінченний діапазон, (1..). Він працює так, ніби не має кінця. Це показує типові випадки використання:

    ary[1..]                          # ідентично до ary[1..-1] без магічного -1
    (1..).each {|index| ... }         # нескінченний цикл з індексу 1
    ary.zip(1..) {|elem, index| ... } # ary.each.with_index(1) { ... }
    
  • Додано Binding#source_location. [Функція #14230]

    Цей метод повертає місце розташування джерела binding, масив з 2 елементів __FILE__ та __LINE__. Традиційно, таку саму інформацію можна було отримати через eval("[__FILE__, __LINE__]", binding), але ми плануємо змінити цю поведінку так, щоб Kernel#eval ігнорував місце розташування джерела binding [Помилка #4352]. Тому користувачі повинні використовувати цей нововведений метод замість Kernel#eval.

  • Додано опцію :exception до Kernel#system, щоб підняти помилку замість повернення false. [Функція #14386]

  • додано режим oneshot [Функція#15022]
    • Цей режим перевіряє “чи була виконана кожна лінія принаймні один раз чи ні”, замість “скільки разів була виконана кожна лінія”. Хук для кожної лінії спрацьовує максимум один раз, і після того як він спрацював, прапорець хука видаляється, тобто він працює з нульовими накладними витратами.
    • Додано ключовий аргумент :oneshot_lines до Coverage.start.
    • Додано ключові аргументи :stop та :clear до Coverage.result. Якщо clear є true, він очищає лічильники до нуля. Якщо stop є true, він вимикає вимірювання покриття.
    • Coverage.line_stub, яка є простою допоміжною функцією, яка створює “заглушку” покриття ліній з заданого вихідного коду.
  • FileUtils#cp_lr. [Функція #4189]

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

  • Прискорення Proc#call, оскільки нам більше не потрібно піклуватися про $SAFE. [Функція #14318]

    З бенчмарком lc_fizzbuzz, який використовує Proc#call так багато разів, ми можемо виміряти покращення x1.4 [Помилка #10212].

  • Прискорення block.call, де block є переданим параметром блоку. [Функція #14330]

    Ruby 2.5 покращує продуктивність передачі блоку. [Функція #14045] Додатково, Ruby 2.6 покращує продуктивність виклику переданого блоку. З мікро-бенчмарком ми можемо спостерігати покращення x2.6.

  • Введено Transient Heap (theap). [Помилка #14858] [Функція #14989] theap є керованою купою для короткоживучих об’єктів пам’яті, на які вказують специфічні класи (Array, Hash, Object, та Struct). Наприклад, створення малого та короткоживучого об’єкта Hash є x2 швидшим. З бенчмарком rdoc ми спостерігали покращення продуктивності на 6-7%.

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

  • $SAFE є глобальним станом процесу, і ми можемо встановити 0 знову. [Функція #14250]

  • Передача safe_level до ERB.new застаріла. Аргументи trim_mode та eoutvar змінено на ключові аргументи. [Функція #14256]

  • Підтримувана версія Unicode оновлена до 11. Планується оновити до 12 та 12.1 у майбутніх випусках TEENY Ruby 2.6.

  • Об’єднано RubyGems 3.0.0.beta3. Опції --ri та --rdoc були видалені. Будь ласка, використовуйте опції --document та --no-document замість них.

  • Об’єднано Bundler як Default gems.

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

З цими змінами, 6376 файлів змінено, 227364 додано(+), 51599 видалено(-) з Ruby 2.5.0!

Насолоджуйтеся програмуванням з Ruby 2.6.0-rc1!

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

  • https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0-rc1.tar.gz

    РОЗМІР:   16823448 байтів
    SHA1:   889db7731fd43f6dbf7f31ffdb0a29bba1a8d356
    SHA256: 6d6183639ed9c02320d7132e97c65489a39e24d8b55fc4ed35ac53d1189cb61d
    SHA512: ad101adee5c43f3645561e73970f15d4e9141f707da69a92e224575c665949e18ca53389e5315fca2ea3934d77967a59e304353cde4a915537e7c4e4ee20be73
    
  • https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0-rc1.zip

    РОЗМІР:   20737499 байтів
    SHA1:   457e39aee1978da5e42af42a6ad230421544aa07
    SHA256: 2bcdf468de499e4d6983d60d63dcc883f4c54fdc05a08a54eb93d315477bc4cc
    SHA512: 0842fae8a199f6c1e76f5d775edbf468e18a54f0419324eb73595e0268c728c71733371d71dc2fa342105dbc487987ca5556948a9ef067276a7b5f552462802a
    
  • https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0-rc1.tar.bz2

    РОЗМІР:   14607078 байтів
    SHA1:   269fe9d414d7731e4a63959fadffe5c50c08ce0e
    SHA256: b4e9c0e8801946e9f0baba30948955f4341e9e04f363c206b7bd774208053eb5
    SHA512: cbd6281b2aab6fbce3f699c1ab57e5423304dca7a547a0b3cd4e8e980326dc7b85b2ca2bfaf3f3a648d40f4222fdf1740d81d422790ee7ae1ba1ed33eb11e3e8
    
  • https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0-rc1.tar.xz

    РОЗМІР:   11851908 байтів
    SHA1:   3b93fdf1c5bd969ab4fe0a8176a6cf64e4597e6e
    SHA256: 21d9d54c20e45ccacecf8bea4dfccd05edc52479c776381ae98ef6a7b4afa739
    SHA512: 3d93d8d80e4900e8b3a27f904ed60581cebc6c55f4ab7acafc81e95001f92f3ea4ddec2da6169b1ed5e0146f7b7c35c1c13b3243955d5825c72170834fe933f3
    

Останні новини

Вийшов 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

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