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

После года разработки представлена новая стабильная ветка языка программирования — Perl 5.18. В рамках подготовки нового выпуска было изменено около 470 тыс. строк кода, изменения затронули 2900 файлов, в разработке приняли участие 124 разработчика. Ветка 5.20 выпущена в соответствии с утверждённым четыре года назад фиксированным графиком разработки, подразумевающим выпуск новых стабильных веток раз в год и корректирующих релизов — раз в три месяца. Примерно через месяц планируется выпустить первый корректирующий релиз Perl 5.20.1, в котором будут исправлены наиболее значительные ошибки, выявленные в процессе внедрения Perl 5.20.0. Одновременно с выходом Perl 5.20 прекращена поддержка ветки 5.16, для которой в будущем могут быть выпущены обновления только в случае выявления критических проблем с безопасностью. Также начался процесс разработки экспериментальной ветки 5.21, на базе которой в мае 2015 года будет сформирован стабильный релиз Perl 5.22.

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

Экспериментальная поддержка сигнатур функций, позволяющих явно определить перечень переменных, используемых в функции и автоматизировать операции проверки и присвоения значений из массива входящих параметров. Для активации поддержки сигнатур функций необходимо указать директиву «use feature 'signatures'»; Например, ранее используемый код: sub foo { die «Too many arguments for subroutine» unless @_ <= 2; die "Too few arguments for subroutine" unless @_ >= 2; my ($left, $right) = @_; return $left + $right; } при использовании сигнатур может быть заменён на:

sub foo ($left, $right) { return $left + $right; } При вызове foo с числом аргументов, отличным от двух, интерпретатор выведет ошибку. Синтаксис сигнатур также позволяет указывать необязательные аргументы и задавать значения, используемые по умолчанию в случае отсутствия аргумента. Например, указав «sub foo ($left, $right = 0)» второй аргумент становится необязательным. В операции присваивания можно указать произвольное выражения, в том числе с использованием других переменных из списка или глобальных переменных. Указание вместо переменной хэша или массива (например, «sub foo ($left, @right)») приведёт к возможности передачи одного и более аргументов.

В списке также поддерживается специальная переменная »$», которая позволяет игнорировать часть аргументов, например, «sub foo ($left, $, $right)» позволит выполнить копирование в переменные только первого и третьего аргумента, при этом в функцию необходимо передать ровно три аргумента. Возможность обращения к параметрам через массив »@_» сохраняется, поэтому второй аргумент можно получить как значение »$_[1]»;

Для определения прототипов функций, предоставляющих средства для проверки аргументов на этапе компиляции, а не в процессе выполнения, обеспечена поддержка атрибута »: prototype», например, теперь можно указать «sub foo: prototype ($$);» вместо «sub foo ($$);».»$$» подразумевает вызов с двумя аргументами. Для определения типа аргумента могут использоваться такие символы, как »$» (переменная),»@» (массив),»+» (ссылка на массив или хэш),»*» (файловый десктиптор). Для отделения обязательных аргументов от опциональных используется знак »;». Для прототипов функций допускается указание сигнатур, например, «sub foo: prototype ($$) ($left, $right)»; Функция rand () переведена на использование для всех платформ более качественного последовательного генератора псевдослучайных чисел drand48(). Ранее для 48-битовый генератор псевдослучайных чисел использовался только для POSIX-систем, таких как Linux, а в Windows применялась менее безопасная 15-битная реализация; Новый синтаксис для операции разделения хэшей и массивов (slice) — %hash{…} и %array[…], при использовании которого возвращается список из пар ключ/значение или номер/значение; Добавлена экспериментальная операция постфиксного разыменования (postderef). Например, операция »$sref→$*» эквивалентна »${ $sref }»,»$aref→@*» аналогична »@{ $aref }», а »$href→%{ … }» можно использовать вместо »%$href{ … }». Для активации поддержки необходимо указать директиву «use feature 'postderef_qq'»; Поддержка Unicode 6.3. Для регулярных выражений добавлена поддержка маски »\p{Unicode}», которая является синонимом »\p{Any}» и срабатывает для кодов символов в диапазоне 0 — 0×10FFFF. Директива «use locale» теперь может применяться с локалями UTF-8 (ранее поддерживались только однобайтные локали), а также на системах без локали. Обеспечена возможность отката на локаль «C» в случае возникновения проблем с инициализацией выбранной локали. Добавлена опция »-DL» для отслеживания настроек локали в процессе запуска интерпретатора; Специальные переменные $a и $b включены в список исключений при выводе предупреждений, что позволяет создавать функции, оперирующие переменными $a и $b, по аналогии с функцией sort. Улучшена работа на 64-разрядных платформах. Внутренние функции работы с массивами переведены на использование 64-разрядных смещений, что позволяет создавать массивы, содержащие более 2^31 элементов. Движок регулярных выражений теперь может работать со строками длиннее 2^31 символов. Функции PerlIO_get_bufsiz, PerlIO_get_cnt, PerlIO_set_cnt и PerlIO_set_ptrcnt переведены с типа int на тип SSize_t; Объявлены устаревшими и скоро будут исключены из базовой поставки модули CGI и Module: Build, а также связанные с ним модули иерархии CGI::* и Module: Build::*. Данные модули нужно будет устанавливать из архива CPAN. В будущем также ожидается удаление утилит find2perl, s2p и a2p; Активирован новый copy-on-write механизм копирования строк, при котором непосредственное копирование в новый буфер производится при попытке изменить строку, но не при назначении переменных, что заметно увеличивает эффективность работы со строками и избавляет от необходимости передачи строки в форме указателя. Добавлены дополнительные оптимизации в код сопоставления масок в движке регулярных выражений и реализацию массивов и хэшей; В поставку добавлен новый модуль IO: Socket: IP, предоставляющий универсальную поддержку сокетов, работа с которыми не отличается для IPv4 и IPv6.

© OpenNet