Опубликован язык программирования Ruby 4.0

Состоялся релиз Ruby 4.0.0, динамического объектно-ориентированного языка программирования, сосредоточенного на высокой эффективности разработки программ и вобравшего в себя лучшие черты Perl, Java, Python, Smalltalk, Eiffel, Ada и Lisp. Код проекта распространяется под лицензиями BSD («2-clause BSDL») и «Ruby», которая ссылается на последний вариант лицензии GPL и совместима с GPLv3.

Основные улучшения:

  • В состав включён новый JIT-компилятор ZJIT, позиционируемый как следующее поколение Ruby JIT. По умолчанию продолжает использоваться JIT-компилятор YJIT, а ZJIT включён в качестве опции (активируется флагом «—zjit»). Как и YJIT новый JIT-компилятор написан на языке Rust командой разработчиков из компании Shopify в рамках инициативы по увеличению производительности Ruby-программ, использующих фреймворк Rails и вызывающих очень много методов. На текущем этапе развития ZJIT быстрее интерпретатора, но пока отстаёт по производительности от YJIT (ожидается, что в Ruby 4.1 ZJIT будет стабилизирован и обгонит по производительности YJIT).

    В отличие от YJIT новый JIT-компилятор транслирует байткод виртуальной машины YARV не в низкоуровневое промежуточное представление, близкое к машинному коду, а в высокоуровневое промежуточное представление SSA (Static Single Assignment), позволяющее выполнять дополнительные фазы оптимизации и проводить оптимизацию крупных блоков кода, а не только текущих операций. Для привлечения к работе новых участников ZJIT реализует классическую архитектуру JIT, использующую накопленные интерпретатором исторические данные о типах, вместо применённой в YJIT усложнённой техники версионирования базовых блоков (LBBV — Lazy Basic Block Versioning).

  • Добавлен экспериментальный класс Ruby::Box с реализацией механизма изоляции, позволяющего разделить выполнение в одном процессе классов, модулей и monkey-патчей (подменённых методов и атрибутов классов). При помощи Ruby::Box также можно отделить выполнение кода приложения от Ruby-библиотек, обеспечить изоляцию тестов и организовать параллельное выполнение web-обработчиков в одном процессе сервера приложений (например, для постепенной замены одной версии кода на другую или обновления зависимостей). Для активации Ruby::Box следует выставить переменную окружения «RUBY_BOX=1».
    
       # foo.rb
       class String
         def self.foo = "foo"
       end
    
       # main.rb
       box = Ruby::Box.new
       box.require('foo')
    
  • Модернизирована реализация модели акторов Ractor, предоставляющая абстракцию в стиле «акторов» (ruby actor) для обеспечения потокобезопасного параллельного выполнения программы с взаимодействием между потоками через передачу сообщений. Добавлен класс Ractor::Port, решающий проблемы, связанные с отправкой и приёмом сообщений. Добавлен метод Ractor.shareable_proc для упрощения совместного доступа к объектам Proc из разных акторов. Проведена оптимизация структур данных, нацеленная на сокращение конфликтов при выставлении глобальных блокировок и повышения эффективности использования кэша CPU.
    В следующем году Ractor планируют перевести в разряд стабильных возможностей.

    
      port1 = Ractor::Port.new
      port2 = Ractor::Port.new
      Ractor.new port1, port2 do |port1, port2|
        port1 ‹‹ 1
        port2 ‹‹ 11
        port1 ‹‹ 2
        port2 ‹‹ 12
      end
      2.times{ p port1.receive } #=› 1, 2
      2.times{ p port2.receive } #=› 11, 12
    
  • Оператор «*nil» теперь сразу возвращает пустой массив («[]») без промежуточного вызова метода «nil.to_a», по аналогии с тем как «**nil» сразу возвращает пустой хэш, не вызывая «nil.to_hash».
  • Разрешено разбивать строки с логическими операторами «||», «&&», «and» и «or» таким образом, что следующая строка начинается с оператора.
    
      if condition1
         && condition2
        ...
      end
    
  • Добавлены методы Array#find и «Array#rfind» для более эффективного поиска элементов в массиве, работающие быстрее, чем «array.reverse_each.find» и «Enumerable#find».
  • В число встроенных классов переведены классы Set и Pathname.
  • Расширены возможности многих базовых классов, таких как Binding, Enumerator, ErrorHighlight, Fiber, File, IO, Kernel, Math, Proc, Range, Socket, String, Thread.
  • Обновлены версии встроенных и входящих в стандартную библиотеку gem-модулей.

Источник: http://www.opennet.ru/opennews/art.shtml?num=64494