Випуск мови програмування Ruby 2.7.0

Після року розробки опубліковано реліз Ruby 2.7.0, динамічної об'єктно-орієнтованої мови програмування, що відрізняється високою ефективністю розробки програм і увібрала в себе кращі риси Perl, Java, Python, Smalltalk, Eiffel, Ada і Lisp. Код проекту розповсюджується під ліцензіями BSD («2-clause BSDL») та «Ruby», яка посилається на останній варіант ліцензії GPL та повністю сумісна з GPLv3. Ruby 2.7 є сьомим значним випуском, підготовленим у рамках планового процесу розробки, що передбачає відведення року на підготовку функціональних покращень та формування кожні 2-3 місяці коригувальних випусків.

Основні поліпшення:

  • Експериментальна підтримка зіставлень із зразком (Узгодження шаблону), що дозволяють перебрати заданий об'єкт і призначити значення, якщо є збіг із зразком.

    case [0, [1, 2, 3]] in [a, [b, *c]] pa #=> 0
    pb #=> 1
    pc #=> [2, 3] end

    case {a: 0, b: 1}
    in {a: 0, x: 1}
    :unreachable
    in {a: 0, b: var}
    p var #=> 1
    кінець

  • В оболонці інтерактивних обчислень irb (REPL, Read-Eval-Print-Loop) з'явилася можливість багаторядкового редагування, реалізована за допомогою readline-сумісної бібліотеки перекластинаписана на мові Ruby. Інтегрована підтримка rdoc, що дозволяє переглядати в irb довідкову інформацію за заданими класами, модулями та методами. Забезпечено кольорове підсвічування рядків з кодом, що показуються через Binding#irb та результатів інспектування об'єктів базових класів.

    Випуск мови програмування Ruby 2.7.0

  • Доданий ущільнюючий збирач сміття (Compaction GC), який може виконувати дефрагментацію області пам'яті, вирішуючи проблеми зниження продуктивності та підвищення споживання пам'яті через фрагментацію пам'яті, що виникає в процесі роботи деяких багатопоточних Ruby-додатків. Для пакування об'єктів у купі запропонований метод GC.compact, що дозволяє знизити кількість використовуваних сторінок пам'яті та оптимізувати купу для операцій
    CoW (copy-on-write).

  • Проведено підготовка до поділу аргументів, що визначаються на основі позиції у списку («def foo(a, b, c)») та ключових слів («def foo(key: val)»). Автоматичне перетворення аргументів на основі ключових слів та позиції оголошено застарілим і не підтримуватиметься у гілці Ruby 3.0. Зокрема, оголошено застарілим використання останнього аргументу як параметрів ключового слова, передачу аргументів на основі ключових слів як останнього параметра хешу та поділ останнього аргументу на позиційні та ключові параметри.

    def foo (key: 42); end; foo({key: 42}) # warned
    def foo(**kw); end; foo({key: 42}) # warned
    def foo (key: 42); end; foo(**{key: 42}) # OK
    def foo(**kw); end; foo(**{key: 42}) # OK

    def foo(h, **kw); end; foo(key: 42) # warned
    def foo(h, key: 42); end; foo(key: 42) # warned
    def foo(h, **kw); end; foo({key: 42}) # OK
    def foo(h, key: 42); end; foo({key: 42}) # OK

    def foo(h={}, key: 42); end; foo(«key» => 43, key: 42) # warned
    def foo(h={}, key: 42); end; foo({«key» => 43, key: 42}) # warned
    def foo(h={}, key: 42); end; foo({«key» => 43}, key: 42) # OK

    def foo (opt = {}); end; foo (key: 42) # OK

    def foo(h, **nil); end; foo(key: 1) # ArgumentError
    def foo(h, **nil); end; foo(**{key: 1}) # ArgumentError
    def foo(h, **nil); end; foo(«str» => 1) # ArgumentError
    def foo(h, **nil); end; foo({key: 1}) # OK
    def foo(h, **nil); end; foo({«str» => 1}) # OK

    h = {}; def foo(*a) a end; foo(**h) # [] h = {}; def foo(a) a end; foo(**h) # {} and warning
    h = {}; def foo(*a) a end; foo(h) # [{}] h = {}; def foo(a) a end; foo(h) # {}

  • Можливість використання нумерованих імен змінних за промовчанням для параметрів блоку.

    [1, 2, 3].each { puts @1} # як аналог [1, 2, 3].each { |i| puts i }

  • Експериментальна підтримка діапазонів без початкового значення.

    ary[..3] # аналогічно ary[0..3] rel.where(sales: ..100)

  • Доданий метод Enumerable#tally, який підраховує скільки разів зустрічається кожен елемент.

    [«a», «b», «c», «b»].
    #=> {«a»=>1, «b»=>2, «c»=>1}

  • Дозволено виклик приватного методу з літералом «self»

    def foo
    кінець
    private :foo
    self.foo

  • Доданий метод Enumerator::Lazy#eager для генерації звичайного перерахування з лінивого (Enumerator::Lazy) перерахування.

    a = % w (foo bar baz)
    e = a.lazy.map {|x| x.upcase }.map {|x| x + "!" }.eager
    p e.class #=> Enumerator
    p e.map {|x| x + «?» } #=> [«FOO!?», «BAR!?», «BAZ!?»]

  • Продовжено розвиток експериментального JIT-компілятора, що дозволяє відчутно підняти продуктивність додатків мовою Ruby. Запропонований у Ruby JIT-компілятор спочатку записує на диск код мовою Сі, після чого викликає зовнішній Си-компілятор для генерації машинних інструкцій (підтримується виклик GCC, Clang та Microsoft VC++). У новій версії реалізовано метод для inline-розгортання при необхідності, забезпечено вибіркове застосування режимів оптимізації при компіляції, значення за умовчанням «jit-min-calls» збільшено з 5 до 10000, а «jit-max-cache» з 1000 до 100 .
  • Підвищено продуктивність CGI.escapeHTML, Monitor та MonitorMixin.
  • У Module#name, true.to_s, false.to_s та nil.to_s забезпечено повернення рядка, незмінного для зазначеного об'єкта.
  • Скорочено розмір бінарних файлів, що генеруються методом RubyVM::InstructionSequence#to_binary;
  • Оновлено версії вбудованих компонентів, включаючи
    Bundler 2.1.2, RubyGems 3.1.2,
    Racc 1.4.15,
    CSV 3.1.2, REXML 3.2.3,
    RSS 0.2.8,
    StringScanner 1.0.3;

  • З базового постачання у зовнішні gem-пакети винесено бібліотеки
    CMath (cmath gem),
    Scanf (scanf gem),
    Shell (shell gem),
    Synchronizer (sync gem),
    ThreadsWait (thwait gem),
    E2MM (e2mmap gem).

  • На rubygems.org опубліковані модулі stdlib, що поставляються за умовчанням:
    контрольний показник,
    cgi,
    делегат,
    getoptlong,
    net-pop,
    net-smtp,
    open3,
    pstore,
    singleton. Не перенесені до rubygems.org модулі monitor
    observer,
    timeout,
    слідодавець,
    урі,
    yaml, які постачаються лише у ruby-core.

  • Для складання Ruby тепер потрібен Сі-компілятр, який підтримує стандарт C99.

Джерело: opennet.ru

Додати коментар або відгук