Perl 6

Материал из ALT Linux Wiki


Perl 6

Perl 6 — это высокоуровневый мультипарадигменный язык программирования общего назначения. О планах создания Perl 6 впервые было объявлено ещё в 2000 году, предполагалось, что это будет полная переработка Perl 5, созданная с нуля. Разработка затянулась на долгие 15 лет и, наконец, как и было первоначально обещано, первая стабильная реализация Perl 6 появилась в канун католического рождества в 2015 году.

Perl 6 не является новой версией Perl 5, а является совершенно самостоятельным языком программирования. Оба языка разрабатываются и развиваются независимо. В отличии от Perl 5, язык Perl 6 определяется из набора спецификаций языка RFC, которых на данный момент уже 361 штука. Таким образом, любая программная реализация, которая соответствует данной спецификации, является реализацией языка Perl 6.

Исторически существовало несколько попыток реализацией языка Perl 6: Pugs, написанный на Haskell, Niezha, реализованная на C#. Вскоре пришли к идее о предварительной компиляции кода Perl 6 в низкоуровневый байткод, который затем может выполняться на какой-либо виртуальной машине. Так появился Rakudo — реализация компилятора Perl 6, которая использовала в качестве бэкенда виртуальную машину Parrot. Со временем стало понятно, что виртуальная машина Parrot не оправдывает надежд, проект перестал развиваться. Появился проект компилятора Rakudo, который использовал в качестве бэкенда виртуальную машину JVM. А чуть позже в обстановке полной секретности была создана виртуальная машина MoarVM, поддержка которой также была добавлена в Rakudo.

На конференции FOSDEM в феврале 2015 Ларри Уолл объявил, что в декабре 2015 будет выпущена первая стабильная реализация Perl 6, которая будет соответствовать спецификации и это будет компилятор Rakudo, на основе виртуальной машине MoarVM. В декабре вышла версия Rakudo 2015.12, которая получила кодовое имя «Коледа» или по-русски Коляда, т.е. Сочельник — праздник кануна Рождества. Эта версия и стала первым официальным релизом компилятора Perl 6.


Установка Perl 6

Для установки компилятора Perl 6 в p8/Sisyphus достаточно выполнить команду:

$ sudo apt-get install rakudo

В составе зависимостей Rakudo есть moarvm — виртуальная машина для выполнения байткода, а также пакет nqp (Not Quite Perl) — легковесная реализация Perl 6 с поддержкой объектной модели и регулярных выражений для виртуальных машин, который используется как высокоуровневый слой для реализации полноценного компилятора Perl 6.

Сразу после установки доступен компилятор Perl 6, исполняемый файл /usr/bin/perl6, который также является и простейшим REPL (read-eval-print loop — цикл чтение-выполнение-печать), т.е. консолью для ввода и выполнения выражений на языке Perl 6.

$ perl6
> 1+1
2

Документация по Perl 6

Для изучения языка Perl 6 можно обратиться к официальной документации Perl 6, доступной по ссылкам на https://perl6.org/documentation/ . В том числе, хороший вводный документ «Perl 6 Introduction»

Документация на русском языке присутствует в сети, но может быть неактуальна, т.к. язык успел существенно развиться. Можно отметить статьи Андрея Шитова в журнале Pragmatic Perl, начиная с вводной статьи «Perl 6 XXI века»

Модули Perl 6

Сам по себе язык немыслим без библиотеки модулей, предоставляющим различные функции и возможности. Пакет rakudo не предоставляет никаких базовых модулей, поэтому весьма актуальным становится установка модулей в систему. Как известно, для Perl 5 основной источник модулей это CPAN. Для Perl 6 также создан реестр доступных модулей — это modules.perl6.org. Он не является хранилищем модулей Perl 6, а ведёт на домашние страницы модулей, которые находятся на github.

Для установки модулей в Perl 5 используются утилиты cpan или cpanm, для Perl 6 также существует свой менеджер модулей — zef (раньше рекомендовался менеджер panda, но сейчас он больше не поддерживается). В pепозитории Sisyphus существует сборка менеджера zef, для его установки требуется выполнить команду:

$ sudo apt-get install perl6-Zef

По умолчанию основной репозиторий модулей помещается в домашний каталог пользователя в каталоге ~/.perl6, но возможна установка и в системные каталоги. Таким образом, с помощью zef можно искать и устанавливать Perl 6 модули:

$ zef search Readline
===> Found 1 results
-------------------------------------------------------------------------------
ID|From                            |Package                                |...
-------------------------------------------------------------------------------
1 |Zef::Repository::Ecosystems<p6c>|Readline:ver<0.0.2>:auth<github:drforr>|...
-------------------------------------------------------------------------------
$ zef install--force-test Readline
===> Searching for: Readline
===> Searching for missing dependencies: LibraryCheck
===> Testing: LibraryCheck:ver<0.0.6>:auth<github:jonathanstowe>
===> Testing [FAIL]: LibraryCheck:ver<0.0.6>:auth<github:jonathanstowe>
Failed to get passing tests, but continuing with --force-test
===> Testing: Readline:ver<0.0.2>:auth<github:drforr>
===> Testing [FAIL]: Readline:ver<0.0.2>:auth<github:drforr>
Failed to get passing tests, but continuing with --force-test
===> Installing: LibraryCheck:ver<0.0.6>:auth<github:jonathanstowe>
===> Installing: Readline:ver<0.0.2>:auth<github:drforr>

Производительность Rakudo

Вопреки расхожему мнению, что Perl 6 очень медленный, ситуация со скоростью работы существенно меняется. Появляются всё новые оптимизации, улучшается JIT в moarvm. Существуют бенчмарки для Perl 6 и можно наблюдать изменение в производительности компилятора:

Test-t-75.png

Запуск простого привет-мир занимает около 0.3 секунд, причём большее время тратиться на парсинг кода. Это даже быстрее, чем java.

$ perl6 --stagestats -e 'say "hello, world!"'
Stage start      :   0.000
Stage parse      :   0.251
Stage syntaxcheck:   0.000
Stage ast        :   0.000
Stage optimize   :   0.002
Stage mast       :   0.010
Stage mbc        :   0.000
Stage moar       :   0.000
hello, world!

В некоторых ситуациях Perl 6 умеет оптимизировать лучше чем Perl 5:

# сумма чисел от 1 до 10млн
$ time perl5 -e '$sum+=$_ for (1..10_000_000)'
1,30s user 0,01s system 99% cpu 1,309 total
# сумма чисел от 1 до 1млрд
$ time perl6 -e 'say [+] 1 .. 1_000_000_000;'
0,29s user 0,06s system 99% cpu 0,341 total