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

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

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

  • В блоках do/end теперь допустимо напрямую использовать секции rescue, else и ensure;
  • Определён метод yield_self для выполнение операции yield с блоком в его контексте. В отличие от tap, метод возвращает результат выполнения блока;
  • Поддержка измерения покрытия (coverage) тестовым кодом веток и методов. Покрытие ветки показывает то, какие ветки были выполнены в процессе выполнения тестов, а какие нет. Покрытие метода показывает какие методы были вызваны, а какие нет;
  • Добавлены новые методы Hash#slice и Hash#transform_keys;
  • Конструктор Struct.new теперь может создавать классы, принимающие именованные аргументы (keyword arguments);
  • Перечисляемые предикаты последовательностей (#any?, #all?, #none? и #one?) теперь могут принимать аргументы в виде шаблона;
  • Прекращено использование констант верхнего уровня (top-level) с тем же именем, если поиск класса в указанной области видимости не увенчался успехом;
  • Включена автоматическая загрузка библиотеки pp.rb без необходимости указания в коде 'require «pp»';
  • Изменён на обратный порядок вывод трассировки (backtrace) и сообщения об ошибке (вначале идут вызовы, начиная со старых и заканчивая свежими, а в конце выводится сообщение об ошибке);
  • На 5–10% увеличена производительность за счёт удаления инструкций «trace» из байткода. При необходимости применения TracePoint теперь осуществляется динамическое изменение последовательностей инструкций (ISeqs). В итоге в обычных условиях, когда не используется TracePoint, устранены лишние накладные расходы, за счёт их существенного повышения на этапе включения трассировки;
  • Примерно в три раза ускорена передача блоков через параметры блока (например def foo (&b); bar (&b); end);
  • IO#write теперь может принимать несколько аргументов, компонуя выходные данные из нескольких буферов;
  • Переписана реализация мьютексов. Размер rb_mutex_t уменьшен со 160 до 80 байт;
  • ERB (Embedded RuBy) теперь генерирует код из шаблонов, который выполняется в два раза быстрее, по сравнению с Ruby 2.4;
  • Увеличена производительность некоторых встроенных методов, включая Array#concat, Enumerable#sort_by, String#concat, String#index и Time#+ ;
  • IO.copy_stream переведён на использование системного вызова copy_file_range, который позволяет ускорить выполнение операций копирования данных из одного файла в другой файл с выполнением операции только на стороне ядра, без предварительного чтения данных в память процесса в пространстве пользователя;
  • SecureRandom теперь использует предлагаемый операционной системой генератор псевдослучайных чисел (/dev/urandom) вместо OpenSSL RNG;
  • Библиотеки cmath, csv, date, dbm, etc, fcntl, fiddle, fileutils, gdbm, ipaddr, scanf, sdbm, stringio, strscan, webrick и zlib из стандартного набора библиотек переведены в категорию устанавливаемых по умолчанию gem-пакетов;
  • Обновлены версии Onigmo 6.1.3, Psych 3.0.2, RubyGems 2.7.3 и RDoc 6.0.1;
  • Добавлена поддержка спецификации Unicode 10.0.0;
  • По умолчанию включена настройка Thread.report_on_exception, упрощающая отладку многопоточных программ.

© OpenNet