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

После года разработки представлена новая стабильная ветка языка программирования Perl — 5.22. При подготовке нового выпуска было изменено около 590 тыс. строк кода, изменения затронули 2400 файлов, в разработке приняли участие 94 разработчика. Ветка 5.22 выпущена в соответствии с утверждённым четыре года назад фиксированным графиком разработки, подразумевающим выпуск новых стабильных веток раз в год и корректирующих релизов — раз в три месяца. Примерно через месяц планируется выпустить первый корректирующий релиз Perl 5.22.1, в котором будут исправлены наиболее значительные ошибки, выявленные в процессе внедрения Perl 5.22.0. Одновременно с выходом Perl 5.22 прекращена поддержка ветки 5.18, для которой в будущем могут быть выпущены обновления только в случае выявления критических проблем с безопасностью. Также начался процесс разработки экспериментальной ветки 5.23, на базе которой в мае 2016 года будет сформирован стабильный релиз Perl 5.24.

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

Модули CGI и Module: Build исключены из стандартной поставки и более не поставляются вместе с интерпретатором perl в базовой стандартной сборке. Они могут быть установлены из CPAN в случае необходимости. Новый двойной ромбовидный оператор:»<<>>», работает как »<>» с той лишь разницей, что использует трёхаргументный вызов функции open () для открытия файлов из массива @ARGV, т.е. не обрабатывает спецсимволы в именах файлов. Новый оператор позволят блокировать возможные атаки, связанные с обработкой спецсимволов в именах файлах, например, указание »|foo» не приведёт к открытию неименованного потока и запуску программы «foo»; Новая экспериментальная возможность задания алиасов для переменных и подпрограмм через указатели указателей: \$c = \$d и \&x = \&y. В том числе можно сразу создать алиас в цикле foreach, например, после указания «foreach \%hash (@array_of_hash_refs){» хэши можно перебирать через «foreach my $key (keys %hash)». Варианты использования и детали в perlref, секция «Assigning to References». Новый модификатор регулярного выражения »/n» отключает переопределение и заполнение позиционных скаляров $1, $2 и т.п., но при этом сохраняет возможность отрицания на групповой оператор, и сохраняется именованное заполнение. Например, указание »/(hi|hello)/n» не приведёт к заполнению $1. Детали о модификаторе »/n» в perlre. Введен обсуждаемый ранее новый атрибут »: const», который может быть применен к анонимным функциям, что приведёт к немедленному выполнению подпрограммы в месте её определения с последующей подстановкой сохранённого результата в моменты обращений к ней в коде. Атрибут имеет экспериментальный статус. Детали perlsub, секция «Constant Functions». Схема с оператором повторения «x» (»(…) x …») может быть использована в присвоениях к списку. Например, конструкция »(undef, undef,$foo) = that_function ()» теперь может быть задана в форме »((undef)x2, $foo) = that_function ()». Особенно полезно использование данной возможности при заполнении переменныз оператором split, например, вместо серии undef можно написать «my (undef, $card_num, (undef)x3, $count) = split /:/;» Новые экспериментальные битовые операторы для работы со строками по аналогии работы с числами:»&.» »|.» »^.» »~.» »&=» »|=» »^=» »&.=» »|.=» »^.=». Детали доступны в документации perlop секции «Bitwise String Operators»; Новые операторы »\b» регулярных выражений: «qr/\b{gcb}/» , «qr/\b{wb}/» , «qr/\b{sb}/», определяющие границу между последовательностями символов (которые выглядят как один символ), словами (например, содержащими апостроф) и предложениями. Детали доступны в описании регулярных масок »\b{}»,»\b»,»\B{}»,»\B» в perlrebackslash. Новая директива «use re 'strict'», которая применяет более строгие правила для компиляции регулярного выражения в текущей области видимости. Поддержка Unicode 7.0. Директиве «use locale» теперь можно передать параметр для выборочного задания категорий локализации, на которые будут отражаться свойства локали. Детали в perllocale. В возвращаемых значениях вызова POSIX: localeconv () появились новые поля int_p_cs_precedes, int_p_sep_by_space, int_n_cs_precedes, int_n_sep_by_space, int_p_sign_posn, int_n_sign_posn, реализованные в соответствии с POSIX.1–2008; Улучшен эвристический анализатор для обнаружения UTF-8 в текущей локали. Эвристика работает на платформах, которые не реализуют ни один из стандартов (С99 и/или POSIX 2001). Закрыта проблема, связанная с вызовом prototype () без параметра. Теперь используется скалаяр $_; Вызов fileno () теперь работает с дескрипторами директорий. Поведение filen на дескрипторе директории зависит от операционной системы. Детали доступны в описании вызова по perldoc -f fileno. Для платформы Win32 завершена реализация формы организации неименованного канала через вызовы open my $fh,»-|», «program», @arguments'. Дробные числа теперь могут хранить специальные значения неопределенностей: бесконечность, отрицательную бесконечность и значение «не число» NaN. Детали в perldata. Доработаны вывод и разбор дробных чисел. Добавлена поддержка hex-форм в виде »0×1.23p-4» и введен формат »%a» для printf. Подробности в perldata, секция «Scalar value constructors». Упаковка беконечностей (Inf) и «не чисел» (NaN) в символ (вызовами pack, «chr» и printf »%c») теперь завершается ошибкой. Появилась новая опция сборки usecbacktrace (./Configure -Dusecbacktrace) которая позволяет из perl-кода выполнить трассировку стека и получить си-фреймы из perl-кода, путем использования API уровня Си-кода. Работает на платформах Linux и OS X, возможна работа на *BSD. Детали в perlhacktips, секция «C backtrace». Безопасность: Perl по умолчанию собирается с -fstack-protector-strong если это возможно. Модуль Safe обновлен до версии 2.38, которая закрывает критическую уязвимость, позволяющую заменить внешнее пространство имен. Perl по умолчанию собирается с -D_FORTIFY_SOURCE=2 если это возможно. Несовместимые изменения: Изменен позиционный порядок введенной в v5.20 экспериментальной возможности определения сигнатуры подпрограммы. Теперь сигнатура может быть задана до атрибутов (в v5.20 сигнатуры можно определить лишь после атрибутов). Прототипы »&» и »\&» теперь принимают только анонимные функции (sub {…}). По уровню действия директива «use encoding» теперь является лексической. Срез списка теперь может вернуть пустой список только в случае если исходный список был пустым; Ранее объявленная устаревшей (в v5.18) форма записи »\N{}» с последовательностью из множества пробелов теперь приводит к ошибке:»\N{TOO MANY SPACES}» or »\N{TRAILING SPACE}. Ранее объявленная устаревшей (в v5.12) возможность импорта функции через use UNIVERSAL '…' теперь приводит к ошибке. Форма поведения «use UNIVERSAL» без аргументов осталась неизменной. Символы «X» в двойных кавычках в форме »\cX» теперь должны быть печатными ASCII-символами (printable ASCII character). Ранее допускались непечатаемые символы, но с выводом предупреждения. Ранее объявленная устаревшей (в v5.18) возможность разделения управляющих конструкции »(?» и »(*» регулярного выражения теперь приводит к фатальной ошибке. Под модификатором »/x» в регулярном выражении в комментариях теперь игнорируются все Unicode-побелы, включая U+0085, U+200E, U+200F, U+2028 и U+2029. !!! Начиная с v5.18 данное поведение было объявлено устаревшим, и задание в регулярном выражении этих символов без экранирования вне квадратных скобок приводило к выводу предупреждения. Изменение поведения введенной в v5.18 экспериментальной формы »(?[…])» которая позволяет задать форматирование в регулярном выражении (сходно с действием модификатора »/x»). Теперь конец строки коментария (»#-строка») определяется исключительно по символу »\n» (ранее qr[\R]). В введенной в v5.18 экспериментальной форме регулярного выражения »(?[…])», которая позволяет записать выражение для выполнения операции над множествами (бинарные &,+,|,-,^ и унарный !), изменен приоритет операторов, и теперь он следует совпадает с системой приоритетов принятой в perl (man perlop). Детали в секции «Extended Bracketed Character Classes» в документации perlrecharclass. Ранее объявленное устаревшим (в v5.000, 1994 год) поведение, позволявшее пропускать спецификаторы »%» в именах хэшей и »@» в именах массивов, в некоторых случаях более не допускается. Текст переменной »$!» теперь сохраняется на английском языке если в текущей области видимости не задействована директива «use local». Отказ от ранее принятой более сложная эвристической схемы произошел из-за того что в некоторых случах пользователь могу получить нечитаемый текста. Строки »$!» и $^E теперь будут содержать установленный флаг UTF-8 в случаях когда текст не является ASCII UTF-8 [perl #112208]. Ранее объявленная устаревшей (в v5.14.0) альтернативная форма конструкции «m? PATTERN?» в виде »? PATTERN?» теперь приводит к синтаксической ошибке. Ранее объявленные устаревшей (в v5.6.1, 2000 год) конструкции «defined (@array)» and «defined (%hash)» теперь также приводит к ошибке; Ранее объявленные устаревшими (в v5.8, 2002 год) формы косвенной адресации через хэши и массивы (например %foo→{«bar»}) теперь приводят к ошибке компиляции. Изменение поведения »*» в прототипе функции когда присутствует неоднозначность: форма вызова с функцией теперь является более приоритетной, в остальных случаях прежнее поведение сохраняется. Устаревшие и нежелательные формы использования и конструкции (deprecations): Использование введенной в v5.8.2 переменной »${^ENCODING}». Использование непечатаемых (non-graphic, invisible) символов в именах переменных длиной в один символ. Инлайнинг (inlining) переменных анонимных функции, имеющих пустой прототип («sub ()») в замыканиях. Конструкция при которой происходит встраивание (inlining) переменной, которая является потенциально изменяемой, приводит к выводу предупреждения. Множественное задание модификатора »/x» в регулярном выражении (qr/foo/xx, use re qw (/amxx), …). Использование «NO-BREAK SPACE» в форме »\N{…}». Анонсированное в v5.16 литеральное использование »{» в регулярном выражении теперь следует либо записывать в экранированной форме »\\{», либо заключить в квадратные скобки »[{]», либо использовать в теле оператора экранирования »\\Q» нелитеральных символов. В противном случае будет выдано предупреждение. Не рекомендуется к использованию форма «use warnings FATAL => ''all''». Производительность: Известные имена классов и методы на фазе компиляции приводят к более быстрому исполнению кода. Составные формы вызова, такие как SUPER: new, аналогичным образом обрабатываются на фазе компиляции если это возможно. Значительное ускорение обращения к массивам и хэшам (особенно к вложенным формам) в случаях когда в качестве ключа используется простая переменная или константа. Конструкции »(…)x1»,»(«constant»)x0» и »($scalar)x0 оптимизированы для исполнения в списочном контексте. Оптимизация 4-х аргументной (с присвоением) формы вызова «substr». Ускорение исполнения »\\L…»,»\\Q…», и т.п. (the extra «stringify» op) Присвоение на пустой список теперь может завершиться быстрее в некоторых случаях. Повышение производительности до 20% на вызовах «length» в некоторых случаях при обращении к связанным (tied) переменным. Уменьшение потребления памяти скаляра на хранение 64-битных чисел в вещественной форме. Оптимизировано исполнение »@array = split». Вызов «join» может быть оптимизирован (свернут, folding) за счет вычисления на фазе компиляции. Реализована возможность ускоренния исполнения конструкции «qq (@array)». Выражения «our $var» и «our ($s,@a,%h)» более не обрабатываются на фазе исполнения. Аналогичным образотм пропускается обработка последовательностей «our $foo». Оптимизация также применена и по отношению к статическим (state) переменным. Многие внутренние функции переработаны с целью улучшения производительности и уменьшения потребления памяти. Ускорена работа файлтест-вызовов »-T» и »-B» на пустом файле. Реализована более быстрая схема поиска в хэше если в качестве ключа используется константа. Функции с пустым прототипом и телом, содержащим лишь «undef», теперь могут быть свернуты. Оптимизировано потребление памяти на содержание функции в его скомпилированной форме. Оптимизация исполнения utf8:: native_to_unicode () и utf8:: unicode_to_native () (модуль utf8) на ASCII-платформах. Win32 perl теперь использует на 8KB меньше памяти на процесс за счет маппинга данных с дисковой памяти двоичного exe-образа perl на оперативную с ее последующим разделением (sharing) между процессами. Обновление модулей и директив. Полный список обновленных модулей и их актуальные версии поставляемые вместе с perl обновленные с версии v5.20.0 к выпуску версии v5.22.0 можно получить, выполнив команду «corelist --diff 5.20.0 5.22.0» Модуль attributes обновлён до версии 0.27. Закрыты проблемы с использованием memEQs в XS-подсистеме и возможностью чтения данных за границей буфера. Обновлен бэкенд компилятора perl — модуль B до версии 1.58 и связанные с ним модули: B: Concise => 0.996, B: Deparse => 1.35, добавлен B: Op_private. Исправлено множество ошибок в модуле B: Deparse. Модуль constant обновлён до версии 1.33. Начиная с версии 1.32 при объявлении констант можно задавать полностью квалифицированное имя константы, что позволяет оперировать константами вне текущего пакета. Кроме того, имена констант начинающиеся с двойных символов подчеркивания заявлены как зарезервированные и не рекомендуются к использованию. Объявление таких констант приведет к выводу предупреждения на фазе компиляции если установлен соответствующий режим исполнения. Data: Dumper обновлён до версии 2.158. Закрыта уязвимость CVE-2014–4330. Модуль Fcntl обновлён до версии 1.13. Реализована возможность взаимодействия с каналами в Linux (операции над pipe, команды F_SETPIPE_SZ и F_GETPIPE_SZ). HTTP: Tiny обновлен до версии 0.054. Использование keep_alive теперь безопасно для работы с fork и потоками (fork-safe, thread-safe). Коллекция модулей libnet обновлена до версии 3.05. Поддержаны IPv6 и SSL для «Net: FTP», «Net: NNTP», «Net: POP3» and «Net: SMTP». Усовершенствована «Net: SMTP» аутентификация. Модуль POSIX обновлен до версии 1.53. Поддержаны математические функции и константы стандарта С99 (такие как «acosh», «isinf», «isnan», «round», «trunc»; «M_E», «M_SQRT2», «M_PI»). Вызов POSIX: tmpnam () теперь выводит предупреждение о том что его использование объявлено устеревшей (deprecation warning). Обновлен модуль Win32. Вызов GetOSName () теперь поддерживает Windows 8.1. Обеспечена возможность сборки модуля в режиме C++. Модуль Win32API: File обновлен до версии 0.1202. Обеспечена возможность сборки модуля в режиме C++. XSLoader обновлен до версии 0.20. Появилась возможность загрузки модулей из разных пространств имён. Изменения утилит perl: Исключение директории «x2p/» из perl привело к удалению утилит find2perl, s2p and a2p. Данные утилиты теперь развиваются как отдельные приложения доступные из CPAN «App: find2perl», «App: s2p», «App: a2p». Утилита h2ph теперь может обрабатывать hex-константы в макросах, задаваемых компилятору Утилита encguess более не зависит от модулей не входящих в стандартную поставку perl (non-core) Поддержка платформ: Восстановлена работоспособность perl в ОС IRIX, Tru64 и z/OS. Прекращена поддержка unix-подобной платформы NeXTSTEP/OPENSTEP в связи с их историчностью (последний выпуск NeXTSTEP был в 1995 году) Cущественные улучшение процесса сборки на платформах: EBCDIC, HP-UX, Android (кросс-сборка), VMS, Win32, OpenBSD и Solaris. Обновлена и дополнена pod-документация, система диагностики (директива diagnostics) и система предупреждении (warnings). Добавлены новые опции для конфигурирования и сборки perl, доработана и дополнена система тестирования. Известно, что выход perl v5.22.0 привел к тому, что сборка некоторых модулей стала невозможной из-за ошибок на этапе тестирования. В связи с этим ожидается обновление следующих модулей: B: Generate => 1.50 B: Utils => 0.25 Coro => 6.42 Dancer => 1.3130 Data: Alias => 1.18 Data: Dump: Streamer => 2.38 Data: Util => 0.63 Devel: Spy => 0.07 invoker => 0.34 Lexical: Var => 0.009 LWP: ConsoleLogger => 0.000018 Mason => 2.22 NgxQueue => 0.02 Padre => 1.00 Parse: Keyword 0.08 Некролог. 8 мая 2015 года сообщество perl лишилось одного из активных участников Brian McCauley. Он был одним из активных публицистов в Usenet, Perl Monks и других тематических форумах, посвященных языку программирования perl. Он опубликовал ряд своих работ под псеводнимом NOBULL в хранилище CPAN, принял участие в развитии Perl FAQ. Он посещал большинства конференции YAPC: Europe, и помог в организации YAPC: Europe 2006 и QA Hackathon 2009. Perl-сообщество скорбит в связи с потерей талантливого активиста.

© OpenNet