Релиз языка программирования Perl 5.24.0

После года разработки состоялся релиз новой стабильной ветки языка программирования Perl — 5.24. При подготовке нового выпуска было изменено около 360 тыс. строк кода, изменения затронули 1800 файлов, в разработке приняли участие 77 разработчиков.

Ветка 5.24 выпущена в соответствии с утверждённым пять лет назад фиксированным графиком разработки, подразумевающим выпуск новых стабильных веток раз в год и корректирующих релизов — раз в три месяца. Примерно через месяц планируется выпустить первый корректирующий релиз Perl 5.24.1, в котором будут исправлены наиболее значительные ошибки, выявленные в процессе внедрения Perl 5.24.0. Одновременно с выходом Perl 5.24 прекращена поддержка ветки 5.20, для которой в будущем могут быть выпущены обновления только в случае выявления критических проблем с безопасностью. Также начался процесс разработки экспериментальной ветки 5.25, на базе которой в мае 2017 года будет сформирован стабильный релиз Perl 5.26.

Ключевые изменения:

  • В разряд стабильных возможностей переведена операция постфиксного разыменования (postderef), которая ранее поставлялась в числе экспериментальных функций и требовала активации специального флага «use feature postderef». Операция постфиксного разыменования »$sref→$*» эквивалентна »${ $sref }»,»$aref→@*» эквивалентна »@{ $aref }», а »$href→%{ … }» — »%$href{ … }»;
  • Добавлена поддержка Unicode 8.0;
  • Реализована генерация ошибки в случае неудачного закрытия выходного файла. Ранее сбой при закрытии выходного файла мог привести к проблемам, так как ошибка не фиксировалась, например, при выполнении операции фильтрации входного файла с его последующим удалением;
  • В регулярных выражениях появился новый оператор »\b{lb}», определяющий место в Unicode-строке, в котором последовательность символов может быть разорвана для того, чтобы вывод уместился в заданную ширину экрана. Ранее возможность поставлялась в виде модуля Unicode: LineBreak;
  • Скобки «qr/(?[ ])/» c расширенными условиями определения классов символов теперь применимы для включенных через «use locale» локалей UTF-8. Задаваемые в скобках шаблоны преобразуются в штатные правила Unicode;
  • Более явно определены операции сдвига целых чисел (»<<" и ">>»), которые теперь не зависят от поведения реализации на Си. Например, точно определено поведение при сдвиге отрицательных чисел и при переполнении числа. Сдвиг отрицательного числа определён как операция сдвига в обратную сторону (операция сдвига отрицательного числа влево приведёт к выполнению сдвига вправо и наоборот). Выходящие за границы сдвигаемые биты воспринимаются как ноль;
  • В printf и sprintf добавлена возможность применения обратного порядка указания аргументов настройки точности, например, вызов «sprintf '|%.*2$d|', 2, 3» вернёт »|002|»;
  • Расширено число полей, передаваемых в callback-обработчик sigaction, вызванный с флагом SA_SIGINFO. В число таких полей теперь входят errno, status, uid, pid, addr и band;
  • Расширены правила передачи скрипта в другой интерпретатор. Ранее передача осуществлялась если в заголовке скрипта отсутствовало слово «perl» (например,»#!/bin/sh»). Теперь проброс также осуществляется и при наличии слова perl6 для улучшения совместимости с Perl 6;
  • Несовместимые изменения:
    • Прекращена поддержка экспериментальных переменной «my $_» и функции авторазыменования (autoderef), которые признаны неудачными нововведениями. Переменная «my $_» была добавлена в Perl 5.10 и вызывала больше путаницы, чем пользы. Механизм autoderef позволяющий выполнить push/pop/… для каждого скалярного аргумента также не получил распространения;
    • Прекращена поддержка вложенных выражений определения переменных. Блоки my, our и state теперь не могут пересекаться, например, выражение «my ($x, my ($y))» является недопустимым;
    • Некоторые шаблоны регулярных выражении, приводящие к ошибкам во время выполнения, теперь приводят к выводу ошибки во время компиляции выражения (т.е. ошибка выводится сразу, а не через какое-то время работы программы). Например, добавлены предварительные проверки корректности использования шаблонов \p{} и \P{};
    • Ничего не делающее выражение «qr/\N{}/» (пустой »\N{}») теперь недопустимо в режиме «strict»;
    • Прекращена поддержка класса символов »/\C/», для оценки отдельных байтов строки UTF8 рекомендуется использовать utf8:: encode ();
    • Вызов chdir ('') теперь не приводит к смене текущего пути на домашнюю директорию, следует использовать chdir ();
    • Все ASCII-символы, используемые в именах переменных, должны быть видимыми;
    • В категорию устаревших возможностей переведено использование функций sysread (), syswrite (), recv () и send () с обработчиками : utf8;
  • Производительность:
    • Сокращены накладные расходы при входе и выходе из области видимости, что привело к ускорению вызова подпрограмм, циклов и базовых блоков. Например, вызов пустой функции «sub f{} f ()» теперь занимает на треть меньше времени;
    • На платформах с поддержкой оптимизированных реализаций memchr () в libc значительно ускорено выполнение операций с шаблонами, в которых используются фиксированные строки. Например, на системах с memchr () с оптимизациями для современных x86_64 CPU выражения $s = «a» x 1000 . «wxyz» и $s =~ /wxyz/ for 1…30000 выполняются в 7 раз быстрее, чем при использовании неоптимизированного варианта memchr (). Отмечаются и регрессии для достаточно нетипичных применений, например, «ab» x 1000 =~ /aa/ выполняется в 1.5 раза медленнее;
    • Ускорены операции сложения, деления и умножения 64-разрядных целых чисел за счёт оптимизации проверки пограничных условий;
    • Ускорены операции инкремента и декремента (++i, i++, --i, i--) ха счёт выноса обработчиков разных условий в разные функции;
    • Значительно ускорены операции присвоения списку единственного аргумента, например »($x) = (…)» или »(…) = ($x)»;
    • Снижено пиковое потребление памяти, наблюдаемое в моменты компиляции шаблонов регулярных выражений;
  • Безопасность:
    • Изменено поведение установки маски прав доступа при создании временных файлов. В 5.22 маска устанавливалась в 0600 до вызова mkstemp (3) и восстанавливалась после вызова, что приводило к появлению файлов с правами 0066 (доступ на запись и чтение) на системах с применяемой по умолчанию маской 0666. В новой версии в качестве значения umask используется 0177;
    • Решены проблемы (CVE-2015–8608) с доступом к областям вне границы буфера в коде обработки файловых путей на платформе Win32;
    • Уязвимость в XS File: Spec: canonpath (CVE-2015–8607);
    • Добавлены дополнительные проверки для защиты от обращения к неинициализированной памяти при вызове функции crypt () на платформе Win32. В том числе добавлена проверка на использование слишком коротких значений salt или указания некорректных символов в salt;
    • Обеспечено удаление дубликатов переменных окружения в хэше %ENV. Ранее сохранялся последний из дубликатов, в то время как getenv () возвращал первый, теперь поведение унифицировано. Дубликаты также удалены из environ[], что прикрыло возможные способы атаки (CVE-2016–2381);
  • Обновлены версии модулей, входящих в базовую поставку.
  • В состав возвращён порт для платформы AmigaOS. Во FreeBSD задействована функция fdclose (). Включена большая порция изменений, связанных поддержкой работы на платформе Win32;

© OpenNet