Увидел свет компилятор Rakudo 2015.12 «коледа», который отмечен Ларри Уоллом (Larry Wall) как первый релиз языка программирования Perl 6. Rakudo является одним из компиляторов Perl 6, преобразующих программы в байткод, который затем выполняется в специальной виртуальной машине. По умолчанию предлагается виртуальная машина MoarVM, в качестве альтернативы может использоваться виртуальная машина JVM (также продолжает развитие проект Parrot, но он не поддерживается в Rakudo, разработка альтернативного компилятора Niecza давно заброшена).
В Rakudo 2015.12 полностью реализована поддержка спецификации v6.c «Christmas» для Perl 6 и успешно пройдены связанные с ней тесты (тестовый набор включает около 120 тысяч проверок). Спецификация v6.c объявлена стабильной — некоторое время язык будет находится в состоянии заморозки. В дальнейшем спецификация продолжит своё развитие и будет учитывать отзывы и пожелания сообщества, но общая совместимость будет сохраняться. Проект Rakudo как и раньше будет формировать ежемесячные выпуски, в которых основное внимание теперь будет уделено работе по увеличению производительности, переносимости и стабильности.
Perl 6 развивается более 15 лет, причём из них около 10 лет продолжалось ожидание финального релиза — на протяжении этих лет, на вопросы о дате релиза Ларри Уолл ежегодно отшучивался, что дата релиза давно известна – это канун Рождества, в тайне пока остается год этого события. Язык Perl 6 кардинально отличается от Perl 5 и может рассматриваться как созданный с нуля отдельный язык программирования, обладающий средствами метапрограммирования (возможность определения собственных синтаксических конструкций для расширения языка, в том числе создания новых инфиксных операторов) и встроенными объектно-ориентированными возможностями. Для обращения к коду на языках C/C++ в Perl 6 поддерживается интерфейс NativeCall, а для использования кода Perl 5 в программах на Perl 6 предоставляется прослойка Inline::Perl5 (для использования Perl 6 в программах на Perl 5 по аналогии предлагается модуль Inline::Perl6).
С особенностями Perl 6 можно познакомиться в обзорах Андрея Шитова. Ключевые отличия от Perl 5:
- Возможность определения типизированных переменных («my Int $i;» или «sub count(Int $i){«, если присвоить $i строковое значение будет выведена ошибка). Поддерживаются типы Bool, Int, Str, Array, Hash, Complex, Num, Pair;
- Полноценная система классов для объектно-ориентированного программирования (определение «class A {has $.i; method test($what)…}» и вызов «my $a = A.new(i = 1); say $a.i;»). Для наследования при объявлении класса следует указать родительский класс («class B is A {» или «class C is A is B {«).
- Упрощение определения переменных («my @list = 1, 2, 3;» или «my %hash = ‘test1’ = 1, ‘test2’ = 2;») и возможность использования Unicode в именах переменных («my $переменная = 1;»);
- Определение области видимости переменной и элементов классов при помощи «твиглов» (%*ENV, $?FILE, $!a, $.b);
- Возможность указания необязательных аргументов функции и значений по умолчанию («sub func(Int $i?)», «sub func(Int $i = 1)»);
- Поддержка передачи аргументов функции по именам (определение «sub power(:$base, :$exponent)», вызов «power(:base(2), :exponent(3))»);
- Возможность создания вложенных функций и определения нескольких функций с одним именем (разделение по типам аргументов);
- Методы параллельного программирования: каналы и механизмы синхронизации;
- Анонимные блоки-замыкания («my $cube = — $x {$x ** 3};») и динамические переменные («my $*var = ‘Alpha'»);
- Изменённый синтаксис регулярных выражений и возможность определения грамматик;
- Широкий набор метаоператоров;
- Метод «.WHAT» для быстрого определения типа переменной ($scalar.WHAT) и оператор «===» для сравнения объектов типов («if ($value.WHAT === Int)»);
- Переменная «$/» для записи результата сопоставления в регулярном выражении (совпавшую строку можно получить через $/.Str, для подстрок используется синтаксис $/[1] идентичный $1);
- Переменная «$!» для доступа к сообщению об ошибке.