[recovery mode] Вышел Perl 5.30
Вчера, 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?)" и "(?
- Максимальное значение спецификатора размера («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» также могут показывать увеличение производительности, но при определённых условиях).