Выпуск языка программирования 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