Выпуск языка программирования Ruby 2.6.0

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

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

  • Добавлена экспериментальная реализация JIT-компилятора, который позволяет ощутимо поднять производительность приложений на языке Ruby. В отличие от традиционных JIT, генерирующих на лету машинные инструкции, преложенный в Ruby JIT-компилятор вначале записывает на диск код на языке Си, после чего вызывает внешний Си-компилятор для генерации машинных инструкций (поддерживается вызов GCC, Clang и Microsoft VC++). Для активации JIT необходимо указать при запуске ruby опцию »--jit» или установить данную опцию в переменной окружения RUBYOPT. По сравнению с Ruby 2.5 включение JIT в среднем в 1.7 раза увеличивает производительность приложений, интенсивно использующих CPU. При этом разработка пока экспериментальная и плохо адаптирована для нагрузок, связанных с интенсивной работой с памятью;
  • Добавлен экспериментальный модуль RubyVM: AbstractSyntaxTree, предоставляющий метод парсинга, обрабатывающий передаваемые строки как код на языке Ruby и возвращающий абстрактное синтаксическое дерево (AST, Abstract Syntax Tree) для этого кода;
  • Для обращения к методу «Kernel#yield_self» теперь можно использовать псевдоним »#then». Для методов «Array#|» и «Array#-» предложены более читаемые псевдонимы «Array#union» и «Array#difference»;
  • Имена констант теперь могут начинаться с заглавных букв не из набора ASCII (например, сейчас можно писать «class Σ♥²; end »);
  • Добавлена поддержка не заканчивающихся диапазонов, например, «ary[1…]» или »(1…).each {…}»;
  • Добавлен класс Enumerator: Chain и реализованные в нём методы «Enumerable#chain» и «Enumerator#+» для создания цепочек перечисляемых значений;
  • В модули Proc и Method добавлена поддержка операторов »<<" и ">>», например, конструкция »(f << g).call(3)" идентична "f(g(3))";
  • Добавлен метод «Binding#source_location», который возвращает местоположение файла с кодом и номер строки привязанного объекта;
  • В метод «Kernel#system» добавлена опция «exception:» для генерации исключения при сбое вместо возвращения «false»;
  • В модуль Coverage добавлен режим «oneshot», который проверяет, запущенна ли каждая строка как минимум один раз;
  • В методе «Hash#merge» обеспечена возможность слияния более двух хэшей;
  • Добавлен метод «FileUtils#cp_lr», который работает по аналогии с «FileUtils#cp_r», но вместо копирования создаёт ссылку;
  • Ускорена работа метода «Proc#call», благодаря исключению временного сохранения содержимого $SAFE. При выполнении теста lc_fizzbuzz наблюдается увеличение производительности в 1.4 раза;
  • Ускорена работа block.call в случае передачи «block» как параметра блока. Судя по проведённым тестам данное изменение позволило в 2.6 раз увеличить скорость расчёта блоков;
  • Представлена поддержка временной кучи (Transient Heap, theap), предназначенной для объектов с коротким временем жизни, использующих специфичные классы (Array, Hash, Object, Struct). Например, благодаря theap создание мелких и недолго существующих хэшей теперь выполняется в два раза быстрее. Тест rdoc показал увеличение производительности на 6–7%;
  • Для увеличения производительности переключений контекста предложены нативные реализации сопрограмм для архитектур arm32, arm64, ppc64le, win32, win64, x86 и amd64. «Fiber.yield» и «Fiber#resume» на 64-разрядных системах Linux теперь выполняются почти в 5 раз быстрее. В целом интенсивно использующие Fiber программы показывают прирост производительности на уровне 5%;
  • Обновлена версия RubyGems 3.0.1, в которой прекращена поддержка опций »--ri» и »--rdoc», вместо которых следует использовать »--document» и »--no-document».
  • Bundler теперь устанавливается по умолчанию для управления зависимостями gem.

© OpenNet