Вчера, 23 мая, состоялся релиз Perl 5.30.0. Новость была объявлена в Usenet-группе perl.perl5.porters одним из ключевых разработчиков Perl — Sawyer X.
По сравнению с предыдущим стабильным релизом, 5.28.0, вышедшим около 11 месяцев назад, было изменено около 620.000 строк кода, изменения затронули 1300 файлов, в разработке приняли участие 58 авторов. Изменения непосредственно исходного кода (только .pm, .t, .c и .h файлы) оцениваются в ~510.000 строк и 750 файлов.
Открыта разработка следующей ветки 5.31. Выпуск следующего стабильного релиза запланирован на май 2020 года.
Ключевые изменения:
- C-функции Perl API sv_utf8_downgrade и sv_utf8_decode более не считаются экспериментальными (experimental).
- Реализована экспериментальная поддержка lookbehind-выражений переменной длины, таких как например "(?<=foo?)" и "(?<!ba{1,9}r)" (ранее приводили к ошибке)
- Максимальное значение спецификатора размера ("n") в блоках "{m,n}" регулярных выражений увеличено с 32767 до 65534.
- Поддержка Unicode 12.1.
- Добавлена ограниченная поддержка масок (wildcards) в Unicode property value specifications (не знаю как перевести правильно). Например, выражение "qr! p{nv= /(?x) A [0-5] z / }!" позволяет выделить все Unicode-символы, определяющие цифры от 0 до 5, включая тайские или бенгальские варианты написания цифр.
- Реализована поддержка qr'N{name}' (именованных символов внутри регулярных выражений, ограниченных одинарными кавычками; ранее такой регексп приводил к ошибке).
- Теперь можно скомпилировать Perl с использованием только thread-safe операций с локалями (-Accflags='-DUSE_THREAD_SAFE_LOCALE').
- Сочетание флагов "-Dv" (расширенный отладочный вывод) и "-Dr" (отладка регулярных выражений) теперь приводит к включению всех возможных режимов отладки регулярных выражений.
- В pack() добавлена защита от возврата некорректных последовательностей Unicode.
Удаления фич и несовместимые изменения:
- Присвоение ненулевого значения спецпеременной $[ (индекс первого элемента массива) теперь приводит к фатальной ошибке.
- В качестве символов-разделителей строк и шаблонов теперь допускается использование только графем. (запрещены составные символы Unicode).
- Некоторые ранее устаревшие способы использования неэкранированной левой скобки «{» в шаблонах регулярных выражений теперь запрещены.
- Вызов sysread(), syswrite(), send() или recv() при обработке дескриптора :utf8 теперь является фатальной ошибкой.
- Запрещено использование "my" в тождественно ложных условных операторах (например, "my $x if 0").
- Удалена поддержка спецпеременной $* (многострочный поиск). Корректной альтернативой являются "/s" и "/m".
- Удалена поддержка спецпеременной $# (форматированный вывод чисел).
- Имя функции dump() теперь нужно явно квалифицировать (CORE::dump).
- Удалена функция File::Glob::glob (нужно использовать File::Glob::bsd_glob).
- Планировалось прекращение поддержки использования в коде XS (блоки на Си) макросов, выполняющих операции с UTF-8, но затем было решено это отложить до версии 5.32.
Улучшения производительности:
- Трансляция UTF-8 в code points (не знаю как перевести) теперь реализована в виде конечного автомата, что в том числе ведёт к повышению производительности — например, ord("x7fff") теперь требует на 12% меньше инструкций. Проверка корректности последовательностей символов UTF-8 также реализована в виде конечного автомата и происходит быстрее.
- Из finalize_op() убраны рекурсивные вызовы.
- Внесены небольшие оптимизации в код сворачивания идентичных символов и определения классов символов в регулярных выражениях.
- Оптимизированы преобразования знаковых определителей типа в беззнаковые (IV в UV).
- Ускорен алгоритм преобразования целых чисел в строку за счёт обработки разом двух цифр вместо одной.
- Внесены улучшения, подготовленные по результатам анализа компанией LGTM.
- Оптимизирован код в файлах regcomp.c, regcomp.h и regexec.c.
- Матчинг регулярных выражений вида "qr/[^a]/" значительно ускорен для случаев, когда "a" — ASCII символ (случаи не-ASCII "a" также могут показывать увеличение производительности, но при определённых условиях).
Автор: Oleg