Введение
Язык программирования, произошедший от Perl.
Raku входит в семейство языков программирования Perl. Ранее известный как Perl 6, он был переименован в октябре 2019 года. Raku включает в себя элементы многих современных и исторических языков программирования. Совместимость с Perl не ставилась целью, хотя режим совместимости входит в спецификацию. Проектирование Raku началось в 2000 году.
История
Процесс разработки Raku был впервые объявлен 19 июля 2000 года, в четвертый день конференции Perl того же года, Ларри Уоллом в его выступлении State of the Onion 2000. В то время основными целями были удаление "исторических недостатков" из языка; "простые вещи должны оставаться простыми, сложные – становиться проще, а невозможные – оставаться сложными"; общая очистка внутренней структуры и API. Процесс начался с серии запросов на комментарии, или "RFC". Этот процесс был открыт для всех разработчиков и не оставлял ни одной части языка закрытой для изменений. После завершения процесса RFC, Уолл рассмотрел и классифицировал каждый из 361 полученного запроса. Затем он приступил к написанию нескольких "Апокалипсисов", используя первоначальное значение этого термина – "откровение". Хотя первоначальной целью было написать один Апокалипсис для каждой главы книги "Programming Perl", стало очевидно, что по мере написания каждого Апокалипсиса, предыдущие становились недействительными из-за последующих изменений. По этой причине был опубликован набор "Синопсисов", каждый из которых описывал содержание Апокалипсиса, но с учетом последующих изменений, отраженных в обновлениях. Сегодня спецификация Raku поддерживается посредством набора тестов "roast", а "Синопсисы" хранятся как историческая справка. Также существует серия "Экзегезисов", написанных Дэмианом Конвеем, которые объясняют содержание каждого Апокалипсиса с точки зрения практического применения. Каждый "Экзегез" состоит из примеров кода и обсуждения их использования и последствий. В настоящее время для разработки Raku используются три основных канала связи. Первый – канал raku в IRC на Libera Chat. Второй – набор списков рассылки. Третий – репозиторий исходного кода Git, размещенный на GitHub.
Первоначальные цели и последствия
Основной целью, которую Уолл обозначил в своей первоначальной речи, было устранение исторических недостатков. К ним относилась путаница, связанная с использованием сигилов для контейнеров, неоднозначность функций `select` и синтаксическое влияние файловых дескрипторов, представленных в виде "bareword". В своей речи Уолл также явно затронул множество других проблем, которые программисты Perl обсуждали годами и хотели исправить. Следствием этих целей стало отсутствие обратной совместимости Perl 6 с существующим кодом Perl. Это означало, что некоторые программы, корректно интерпретируемые компилятором Perl 5, не будут приняты компилятором Perl 6. Поскольку обратная совместимость обычно является важной целью при развитии программного обеспечения, о существенных изменениях в Perl 6 необходимо было заявить прямо. Различия между Perl 5 и Perl 6 оказались настолько значительными, что в конечном итоге Perl 6 был переименован в Raku.
Талисман
Маскотом языка является "Камелия, жук Раку". Ее имя – отсылка к верблюду, талисману Perl, а ее облик, в духе любви к каламбурам, свойственной сообществу Perl, является игрой слов на "программной ошибке". Спиральные узоры, вплетенные в ее крылья, похожие на крылья бабочки, напоминают символы "P6" – популярное прозвище Perl 6, а намеренно смещенное расположение глаз – это каламбур на выражение "косоглазый". Одной из целей яркого и красочного дизайна логотипа было противодействие мизогинии в сообществе и предоставление возможности тем, кто придерживается "мужских" взглядов, проявить свою чуткость.
Реализация
По состоянию на 2017 год только реализация Rakudo находится в активной разработке. Ни одна реализация не будет признана официальной реализацией Raku; вместо этого, "Raku – это всё, что проходит официальный набор тестов". Raku ориентирован на ряд виртуальных машин, таких как MoarVM, Java Virtual Machine и JavaScript. MoarVM – это виртуальная машина, разработанная специально для Rakudo и инструментария компилятора NQP. Между Raku и виртуальными машинами существует слой под названием Not Quite Perl 6, или NQP, который реализует правила Raku для разбора Raku, а также формирует абстрактное синтаксическое дерево и генерирует код, специфичный для конкретной платформы. Значительная часть Rakudo написана на самом Raku или на его подмножестве NQP. Rakudo не является полностью самодостаточной реализацией, и в настоящее время нет конкретных планов по превращению Rakudo в загрузочный компилятор.
Исторические реализации
Pugs был первоначальной реализацией Perl 6, написанной на Haskell. Pugs когда-то была самой продвинутой реализацией Perl 6, но с середины 2007 года находится в основном в состоянии заброшенности (с обновлениями, вносимыми лишь для отслеживания текущей версии GHC). По состоянию на ноябрь 2014 года Pugs активно не поддерживался. В 2007 году были созданы MiniPerl6 ("mp6") и её переработка, v6 KindaPerl6 ("kp6"), как средство для начальной загрузки стандарта Perl 6.0.0 STD, используя Perl 5. STD – это полная грамматика для Perl 6, написанная на Perl 6. Теоретически, любая система, способная разбирать STD и генерировать исполняемый код, подходит для начальной загрузки Perl 6. В настоящее время kp6 компилируется mp6 и может работать с различными бэкендами. mp6 и kp6 не являются полноценными реализациями Perl 6 и предназначены только для реализации минимального набора функций, необходимого для загрузки полноценного компилятора Perl 6. Yapsi был компилятором и средой выполнения Perl 6, написанными на самом Perl 6. Следовательно, для запуска ему требовался существующий интерпретатор Perl 6, например, один из релизов Rakudo Star. Niecza, ещё одна крупная попытка реализации Perl 6, была сосредоточена на оптимизации и исследованиях эффективной реализации. Она ориентирована на Common Language Infrastructure.
Модульная система
Спецификация Raku требует, чтобы модули идентифицировались по имени, версии и поставщику. Возможно загрузить только конкретную версию модуля или даже два модуля с одинаковым именем, различающиеся по версии или поставщику. Для удобства предусмотрены короткие имена (алиасы). CPAN, система распространения модулей Perl, пока не поддерживает модули Raku. Вместо этого используется прототип системы модулей.
Основные изменения в Perl
Perl и Raku принципиально различаются, хотя общая цель заключалась в том, чтобы "сохранить дух Perl" в Raku, чтобы Raku однозначно являлся "языком программирования Perl". Большинство изменений направлены на нормализацию языка, чтобы сделать его более понятным как начинающим, так и опытным программистам, и чтобы "упростить простое и сделать сложное возможным".
Спецификация
Основное нетехническое различие между Perl и Raku заключается в том, что Raku изначально разрабатывался как спецификация. Это означает, что Raku можно перереализовать при необходимости, а также что программистам не требуется изучать исходный код, чтобы получить окончательный ответ о работе той или иной функции. В отличие от этого, в Perl официальная документация не считается определяющей и лишь неформально описывает поведение интерпретатора Perl. Любые несоответствия между документацией и реализацией могут привести к изменению либо документации, либо реализации, чтобы привести их в соответствие, что является движущей силой постоянной разработки и улучшения версий Perl.
Регулярные выражения
Регулярные выражения и поддержка обработки строк всегда были одной из определяющих особенностей Perl. Поскольку возможности сопоставления с образцом в Perl уже давно превзошли возможности формальных регулярных выражений, документация Raku единообразно использует термин "регексы", чтобы отделить его от формального определения. Raku предоставляет расширенный набор функций Perl в отношении регексов, объединяя их в более широкую структуру, называемую "правилами", которые обеспечивают возможности контекстно-зависимых формализмов разбора (таких как синтаксические предикаты грамматик разбора выражений и ANTLR), а также действуют как замыкание относительно своей лексической области видимости. Правила вводятся с помощью ключевого слова `rule`, которое используется аналогично определению подпрограммы. Анонимные правила также могут быть введены с помощью ключевого слова `regex` (или `rx`), либо могут использоваться непосредственно, как это делалось в Perl с помощью операторов `m` (сопоставление) или `s` (замена). В "Апокалипсисе 5" Ларри Уолл перечислил 20 проблем с "современной культурой регулярных выражений". Среди них были то, что регексы Perl были "слишком компактными и изящными", имели "чрезмерную зависимость от небольшого количества метасимволов", "недостаточную поддержку именованных захватов", "недостаточную поддержку грамматик" и "плохую интеграцию с "настоящим" языком".
Синтаксическое упрощение
Некоторые конструкции Perl были изменены в Raku и оптимизированы для использования иных синтаксических подсказок в наиболее распространенных случаях. Например, круглые скобки, обязательные в управляющих конструкциях Perl, теперь необязательны:
@integers = 0 .. Inf; # целые числа от 0 до бесконечности
Приведенный выше код не вызовет ошибку при попытке присвоить массиву @integers список бесконечного размера, и не будет бесконечно пытаться расширить список, даже если поиск ограничен определенным количеством элементов. Это упрощает многие распространенные задачи в Raku, включая операции ввода-вывода, преобразование списков и передачу параметров.
@integers = 0 Inf; # integers from 0 to infinity
The code above will not crash by attempting to assign a list of infinite size to the array @integers, nor will it hang indefinitely in attempting to expand the list if a limited number of slots are searched. This simplifies many common tasks in Raku including input/output operations, list transformations, and parameter passing.
Идентификаторы
В Perl имена идентификаторов могут использовать буквенно-цифровые символы ASCII и символы подчеркивания, которые также доступны в других языках. В Raku буквенно-цифровые символы могут включать большинство символов Unicode. Кроме того, можно использовать дефисы и апострофы (с некоторыми ограничениями, например, они не должны следовать за цифрой). Использование дефисов вместо символов подчеркивания для разделения слов в имени приводит к стилю именования, называемому "kebab-case".
Книги, опубликованные до Perl 6 версии 1.0 (известная как версия 6.c)
Также в 2009 году вышла книга, посвященная одной из первых виртуальных машин Perl 6 — Parrot.