Релиз языка программирования Perl 5.24.0
10 мая 2016 года
После года разработки состоялся релиз новой стабильной ветки языка программирования 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"). Для улучшения совместимости с Perl 6 теперь проброс также осуществляется и при наличии слова perl6;
- Несовместимые изменения:
- Прекращена поддержка экспериментальной переменной "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.
Источники
править- Главная ссылка к новости (http://perlnews.org/2016/05/pe...) (Архивная копия от 24 ноября 2016 на Wayback Machine)
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.