Релиз языка программирования Perl 5.22.0
Ветка 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-форм в виде "0x1.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-сообщество скорбит в связи с потерей талантливого активиста.
Источник: http://www.opennet.ru/opennews/art.shtml?num=42349
|
0 | Tweet | Нравится |
|