Вчера, 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" также могут показывать увеличение производительности, но при определённых условиях).

Комментарии (6)


  1. berez
    24.05.2019 16:14

    Как там шестая-то версия поживает? Вроде уже давно стандартизировали и выпустили.


    1. Eldhenn
      24.05.2019 16:16

      Это не шестая версия, а отдельный язык — Perl6. Как и прочие экзотические языки, перебивается с хлеба на квас.


    1. JerleShannara
      24.05.2019 17:29

      Поставьте rakudo, посмотрите.


      1. berez
        24.05.2019 17:42

        Меня больше интересовали не тактильные ощущения, а распространенность и практическое применение.
        Но ракудо, пожалуй, поставлю — посмотрю. Любопытно.


  1. 0xd34df00d
    24.05.2019 23:30
    +1

    Запрещено использование "my" в тождественно ложных условных операторах (например, "my $x if 0")

    Они решили halting problem?


    1. Cheater Автор
      27.05.2019 09:36

      :) В парсер Perl официально входит чёрная магия «smoke and mirrors», так что вполне могли.

      На самом деле конечно нет, имелся в виду вот этот фикс, а он относится просто к ложному if, не к тождественно ложному. Я неточно перевёл