Perl 6

От Perl 5 к Perl 6 — введение

Введение

Мориц Ленц (Moritz Lenz), перевод Анатолия Шарифулина.
Оригинальный текст: http://perlgeek.de/blog-en/perl-5-to-6/00-intro.html.

 

Perl 6 еще недостаточно документирован. Не удивительно, потому что (в отличие от спецификации) написание компилятора для Perl 6 представляется гораздо более приоритетной задачей, чем написание документации, ориентированной на пользователя.

К сожалению, это означает, что научиться Perl 6 не просто, и нужно быть сильно увлеченным Perl 6, чтобы найти причины изучить его, пользуясь спецификацией, IRC-каналами и набором тестов.

Проект, который я предварительно назвал «От Perl 5 к Perl 6» (из-за отсутствия лучшего названия), — попытка заполнить этот пробел циклом коротких статей.

В каждом уроке охвачена довольно ограниченная тема и объясняются два или три наиболее важных момента с помощью очень коротких примеров. Кроме того, я пытаюсь объяснить, почему что-то меняется от Perl 5 к Perl 6, и почему это важно. Я также надеюсь, что знания, которые вы получите от прочтения этих уроков, будут достаточными для базового понимания Synopsis — канонического источника всей мудрости Perl 6.

Чтобы упростить чтение, каждый урок не будет превышать 200 строк или 1000 слов (но это не жесткое ограничение).

Возможно уроки окажутся слишком короткими для изучения по ним языка программирования, но я надеюсь, что они продемонстрируют дизайн языка, что позволит вам увидеть его красоту без необходимости изучать сам язык.

Это не руководство по трансформированию программ Perl 5 в программы на Perl 6. Также это не исчерпывающий список отличий. Если вы ищите именно это, посмотрите http://svn.pugscode.org/pugs/docs/Perl6/Perl5/Differences.pod.

Состояние реализации

Perl 6 — это спецификация языка, и существуют несколько компиляторов, которые пишут для того, чтобы воплотить Perl 6. Частично это уже удалось.

Pugs

Pugs — компилятор Perl 6, написанный на языке Haskell. Проект начат Одри Танг, и она почти довела его до завершения. Если считать число реализованных моментов, то это определенно наиболее полная реализация на сентябрь 2008.

Чтобы собрать и протестировать pugs, необходимо вначале установить компилятор GHC 6.8, а затем выполнить

svn co http://svn.pugscode.org/pugs
cd pugs
perl Makefile.PL
make
make test

Это установит локально некоторые зависимости, необходимые Haskell, а затем соберет pugs. Для запуска make test возможно потребуется установить некоторые модули Perl 5, это можно сделать с помощью вызова cpan Task::Smoke.

Pugs не развивался в течение последнего года, но Одри анонсировала, что она продолжит разработку после выхода GHC 6.10, и уже заметно привела в порядок процедуру установки.

Pugs может разобрать многие общие конструкции, поддерживает объекты, простые регулярные выражение, многие управляющие структуры, основные пользовательских операторов и макросов, многие встроенные функции, контексты (кроме контекста среза), объединения, основы множественной диспетчеризации и метаоператор редуцирования. Он проходит около 16 000 тестов из тестового набора Perl 6.

Rakudo

Rakudo — компилятор Perl 6, основанный на Parrot. Основной архитектор — Патрик Мишо (Patrick Michaud), многие возможности реализованы Джонатаном Вортингтоном (Jonathan Worthington).

Rakudo находится в svn-репозитории Parrot, для сборки необходимо выполнить следующее:

svn co https://svn.perl.org/parrot/trunk parrot
perl Configure.pl && make
cd languages/perl6/
make perl6

Процесс разработки очень Rakudo очень активен. Во время написания статьи он проходит около 2300 тестов из официального набора тестов. За прогрессом выполненных тестов можно наблюдать на сайте http://rakudo.de/.

Rakudo реализует большинство управляющих структур, большую часть синтаксиса для числовых литералов, интерполяции скаляров и замыканий, цепочечных операторов, блоков BEGIN и END, pointy-подпрограмм, именованных, необязательных и «заглатывающих» (slurpy) аргументов, основы объединений и грамматик.

Elf

Митчел Чарити (Mitchell Charity) начала проект elf, это компилятор, написанный на Perl 6 с помощью грамматик, написанных на Ruby. Сейчас он имеет бекенд Perl 5, планируются и другие.

Он находится в репозитории Pugs, если вы уже его загрузили, то перейдите в каталог misc/elf/ и выполните ./elf_f $filename. Потребуется ruby-1.9 и некоторые модули Perl, о которых elf сообщит, если их не обнаружит.

Разработка elf идет с пиками активности, за которыми следуют недели низкой активности, или вообще тишины.

Он разбирает более 70% тестового набора, но реализует в основном особенности, которые легко эмулировать с помощью Perl 5, и проходит около 700 тестов из набора.

KindaPerl6

Флавио Глок (Flavio Glock) начал проект KindaPerl6 (сокращенно kp6). Этот компилятор сейчас ожидает, когда появится более быстрый бекенд, сейчас он слишком медленный для того, чтобы пробовать применять kp6.

В kp6 реализованы объекты, грамматики, и некоторые отдельные вещи типа «ленивого» gather/take. Реализован и блок C<BEGIN>, что было одной из задач дизайна.

v6.pm

v6 — это фильтр исходных кодов на Perl 5. Он был написан Флавио Глоком, и поддерживает основы Perl 6 и грамматики. Он весьма стабилен и быстрый, и время от времени дорабатывается. Находится на CPAN и в каталоге perl5/*/ в репозитории Pugs.

SMOP

SMOP обозначает простое мета-объектное программирование (Simple Meta Object Programming) и не подразумевает реализацию Perl 6 целиком, а задуман как бекенд (несколько напоминая Parrot, то сильно отличаясь от него по дизайну и функционалу). В отличие от других реализаций, главная цель здесь — реализовать мощные возможности Perl 6 по части возможностей мета-объектного программирования, то есть возможности подключать разные объектные системы.

SMOP реализован на C и на нескольких специфичных языках. Он был разработан и реализован Даниэлем Русо (Daniel Ruoso) при помощи Юваля Когмана (Yuval Kogman), отвечающего за дизайн, и Павла Муриаса (Pavel Murias), делавшего реализацию и DSL. Разработку поддерживал грант Perl Foundation.

Затем SMOP будет использоваться как бекенд или для elf, или для kp6, и возможно также для Pugs.

STD.pm

Ларри Уолл написал грамматику для Perl 6 на Perl 6. Он написал и скрипт gimme5, который транслирует эту грамматику в Perl 5. Скрипт способен разобрать почти все, что является валидным Perl 6, включая полный набор тестов (за небольшими исключением, когда Ларри время от времени случайно что-то ломает).

STD.pm находится в репозитории Pugs, и может быть запущен и протестирован с помощью perl-5.10.0, установленном в /usr/local/bin/perl и некоторым числом Perl-модулей (таких как YAML::XS и Moose):

cd src/perl6/
make
make testt
      # предупреждение: занимает около 80 минут,
                # и генерирует 3 ГБ файлов в
lex/
./tryfile $your_file
perl STD5_dump_match $your_file

STD.pm корректно разбирает пользовательские операторы и жалуется на пропущенные объявления переменных и несуществующие подпрограммы.

Причины

Многие спрашивают, зачем нам нужно так много разных реализаций, не будет ли лучше вместо этого сфокусироваться на одной.

Есть как минимум три ответа на этот вопрос.

Во-первых, свободные программисты так не работают. Люди иногда хотят или начать что-то с теми инструментами, которые им нравятся, либо им хочется думать, что какой-то аспект Perl 6 недостаточно следует дизайну в существующих реализаций. Они начинают новый проект.

Второй возможный ответ - проекты охватывают разные области разностороннего языка Perl 6: SMOP занимается мета-объектным программированием, Rakudo и Parrot заботятся об эффективной взаимной совместимости языков и платформо-независимости, kp6 интересует блок BEGIN, а Pugs был первой реализацией, с помощью которой можно было поисследовать синтаксис и многие свойства языка.

Третий ответ состоит в том, что мы не хотим, чтобы один проект оказался в то же время и единственной неудачей. Если существует несколько реализаций, и в одна из них оказывается проблемной по непредсказуемым причинам (техническим, правовым, личным и другим), у нас будет запасной аэродром.

Ссылки по теме

Pugs: http://www.pugscode.org/, http://pugs.blogs.com/pugs/2008/07/pugshs-is-back.html, http://pugs.blogspot.com, исходный код: http://svn.pugscode.org/pugs.

Rakudo: http://www.parrotcode.org/, http://www.rakudo.org/, исходный код: https://svn.perl.org/parrot/trunk.

Исходные коды остальных проектов находятся в каталогах репозитория Pugs. Elf: misc/elf/. KindaPerl6: v6/v6-KindaPerl6. v6.pm: perl5/. STD.pm: src/perl6/.

intro — 24 ноября 2008