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

После года разработки представлена новая стабильная ветка языка программирования — Perl 5.18. В рамках подготовки нового выпуска было изменено около 400 тыс. строк кода, изменения затронули 2100 файлов, в разработке приняли участие 113 разработчиков. Ветка 5.18 выпущена в соответствии с утверждённым три года назад фиксированным графиком разработки, подразумевающим выпуск новых стабильных веток раз в год и корректирующих релизов — раз в три месяца. 20 июня планируется выпустить первый корректирующий релиз Perl 5.18.1, в котором будут исправлены наиболее значительные ошибки, выявленные в процессе внедрения Perl 5.18.0. Одновременно с выходом Perl 5.18 прекращена поддержки ветки 5.14, для которой в будущем могут быть выпущены обновления только в случае выявления критических проблем с безопасностью. Также начался процесс разработки экспериментальной ветки 5.19, на базе которой в мае 2014 года будет сформирован стабильный релиз Perl 5.20.

Ключевые улучшения, добавленные в Perl 5.18:

Переработанная реализация хэшей. Одним из самых заметных изменений является обеспечение рандомизации в используемых хэш-функциях, что положительно влияет на безопасность (например, защитит от DoS-атак через манипуляции с коллизиями хэшей), но приводит к непредсказуемому порядку вывода элементов функциями keys (), values () и each (). Данное изменение может повлиять на работу приложений, пользующихся недокументированным свойством сохранения порядка записей в разных хэшах (в официальной документации хэши позиционируется как неупорядоченные структуры). Отныне порядок следования идентичных записей в разных хэшах и в одних и тех же хэшах при разных запусках скрипта будут отличаться. Уровень рандомизации может быть настроен через переменную окружения PERL_PERTURB_KEYS (при присвоении значения 0 рандомизация ключей отключается и поведение perl становится как в прошлых выпусках). Из других изменений можно отметить реализацию возможности использования альтернативных хэш-функций. В качестве алгоритма хэширования по умолчанию задействован SIPHASH. Кроме того, в состав включено несколько альтернативных алгоритмов, но они рекомендуются пока только для экспериментов, так как содержат определённые проблемы с безопасностью;

Новый механизм для активации экспериментальных возможностей и новая категория предупреждений «experimental», управляющая выводом уведомлений для тестовой функциональности. Например, для включения новых экспериментальных возможностей и скрытия связанных с ними предупреждений следует указывать директивы: no warnings «experimental: feature_name»; use feature «feature_name»; Поддержка экспериментального расширения в системе регулярных выражений, позволяющего осуществлять сопоставления с использованием расширенных правил пересечения, исключения и объединения множеств символов. Например, '[A-Z — W]' — символы от A до Z за исключением W. Более сложный пример формирования множества символов: '[\p{Latin} & \p{L&} — A-Z]'. Функциональность совпадает по возможностям с модулем Unicode: Regex: Set; Экспериментальная поддержка лексических подпрограмм («lexical_subs»), позволяющая определять при помощи выражения «state sub» подпрограммы, видимые только в области лексической видимости блока в котором подпрограмма была создана. В отличие от «my sub» процедуры «state sub» работают заметно быстрее, так как они не создаются при каждом входе в блок и совместно используются между вызовами других подпрограмм; Возможность использования в операторах next, last и redo динамически вычисляемых меток, формируемых в процессе выполнения скрипта на основе произвольного выражения. Ранее любые отличные от константы аргументы next, last и redo воспринимались как пустая строка; В непереопределяемое пространство имён «CORE::» включены функции defined, delete, exists, glob, pos, protoytpe, scalar, split, study и undef; Поддержка Unicode 6.2 и реализация возможности определения собственных имён символов для использования в \N{…}, charnames: vianame () и т.п. При задании имён могут быть задействованы знаки из диапазона Unicode, т.е. имена символов теперь можно определить не только на английском языке. Использование неизвестных имён символов в \N{…} теперь приводит к ошибке, вместо предупреждения. Указание $/ = \N для функции readline () теперь приводит к чтению N-символов, а не N-байт. Проведены заметные оптимизации скорости работы регулярных выражений в которых присутствуют Unicode символы, например, скорость выполнения операции \X увеличилась на 35–40%; Интеграция новых контрольных точек для использования в системе динамической отладки DTrace: op-entry, loading-file, loaded-file; Добавлена новая служебная переменная ${^LAST_FH} для доступа к последнему прочитанному файловому дескриптору; Вертикальная табуляция (\cK) теперь отнесена к множеству символов пробела (\s). Обновлены версии большого числа входящих в базовую поставку модулей; Объявлены устаревшими модули: encoding, Archive: Extract, B: Lint*, Devel: InnerPackage, Log: Message*, Module: Pluggable*, Object: Accessor, Pod: LaTeX, Term: UI*. Прекращена поддержка напрямую вызываемых из системной библиотеки функций для проверки класса символов, например, is_uni_alnum и т.п.; Прекращается поддержка платформ Windows CE, z/OS, DG/UX и NeXT; В документацию по использованию модуля Storable добавлен пункт, предупреждающий о недопустимости десериализации данных, полученных из недоверительных внешних источников, так как в процессе подобной обработки можно организовать выполнение perl-кода и загрузку модулей;

© OpenNet