SlideShare ist ein Scribd-Unternehmen logo
1 von 65
Downloaden Sie, um offline zu lesen
Rakudo Perl 6


Сегодняшние
возможности
Perl 6
Что такое Perl 6?
     Возьмем лучшее из Perl…
          Практичность — акцент на решении задачи
          Мультипарадигменность — потому что не
           существует единственного подхода к решению
           всех задач
          Лингвистическое влияние — это же язык
           программирования
          Простые вещи просты, а сложные — возможны
Что такое Perl 6?
     Построим новый Perl-подобный язык, который…
          Более регулярен — меньше особых случаев
          Более читаем и более поддерживаем
          Более выразителен
          Более ОО, более функциональный, более
           декларативный, более параллельный…
          Простое — просто
          Сложное — еще более доступно
Одна спецификация, много реализаций
     В отличие от Perl 5, для Perl 6 написана спецификация
      языка
          Нет «официальной» реализации
     Как и в Perl 5, у Perl 6 есть набор тестов
          Правильная реализация должна проходить набор
           тестов
          Это некая «исполняемая спецификация»
          Сейчас около 40 000 тестов
Rakudo
Что такое Rakudo?
     Наиболее активно разрабатываемый компилятор Perl 6
     Реализует значительную часть спецификации Perl 6
      (хотя еще есть, над чем работать)
     Сегодня проходится более 30 000 тестов из набора
      тестов Perl 6 (правда набор тестов растет )
     Сейчас основан на виртуальной машине Parrot
     В этом году мы планируем как минимум еще одну
      платформу
Как работает Rakudo
     Написан на…
          NQP (минимальное подмножество Perl 6)
           Ядро компилятора (грамматика и построение AST), некоторые
           мета-модели, поиск и загрузка модулей)
          Perl 6
           Большинство встроенных функций и операторов
          Parrot Intermediate Language
           Некоторые низкоуровневые фукнции и «клей» (glue)
          C
           Диспетчеры, работа с сигнатурами, кастомизация VM и «клей»
Как работает Rakudo: парсинг
     Сначала Rakudo разбирает программу
     Парсер написан на регексах Perl 6
token statement_control:sym<if> {
    <sym> :s
    <xblock>
    [ 'elsif's <xblock> ]*
    [ 'else's <else=.pblock> ]?
}
     Может находить новые операторы во время разбора
     Должен сразу выполнять блоки BEGIN
Как работает Rakudo: построение AST
     Когда заканчивается разбор чего-либо (например,
      инструкции if), запускается action-метод
     Он строит абстрактное синтаксическое дерево (Abstract
      Syntax Tree, AST)
          Это представление программы в абстрактом —
           не зависимом от синтаксиса языка — виде
     Большинство action-методов строят сложное AST
      из маленьких фрагментов, которые уже разобраны
Как работает Rakudo: построение AST
            if $x == 42 { say "The answer!"; }
Как работает Rakudo: построение AST
                       if $x == 42 { say "The answer!"; }




 PAST::Var.new(
   :name('$x'),
   :scope('lexical')
 )
Как работает Rakudo: построение AST
                       if $x == 42 { say "The answer!"; }




 PAST::Var.new(               PAST::Val.new(
   :name('$x'),                 :value(42)
   :scope('lexical')          )
 )
Как работает Rakudo: построение AST
                       if $x == 42 { say "The answer!"; }



                PAST::Op.new(
                  :pasttype('call'),
                  :name('&infix:<==>'),
                  …
                )


 PAST::Var.new(                  PAST::Val.new(
   :name('$x'),                    :value(42)
   :scope('lexical')             )
 )
Как работает Rakudo: построение AST
                       if $x == 42 { say "The answer!"; }



                PAST::Op.new(
                  :pasttype('call'),
                  :name('&infix:<==>'),
                  …
                )


 PAST::Var.new(                  PAST::Val.new(
   :name('$x'),                    :value(42)
   :scope('lexical')             )
 )                                                PAST::Val.new(
                                                    :value('The Answer!')
                                                  )
Как работает Rakudo: построение AST
                       if $x == 42 { say "The answer!"; }



                PAST::Op.new(
                  :pasttype('call'),
                  :name('&infix:<==>'),
                  …                               PAST::Op.new(
                )                                   :pasttype('call'),
                                                    :name('&say'),
                                                    …
                                                  )
 PAST::Var.new(                  PAST::Val.new(
   :name('$x'),                    :value(42)
   :scope('lexical')             )
 )                                                PAST::Val.new(
                                                    :value('The Answer!')
                                                  )
Как работает Rakudo: построение AST
                       if $x == 42 { say "The answer!"; }



                PAST::Op.new(                     PAST::Block.new( … )
                  :pasttype('call'),
                  :name('&infix:<==>'),
                  …                               PAST::Op.new(
                )                                   :pasttype('call'),
                                                    :name('&say'),
                                                    …
                                                  )
 PAST::Var.new(                  PAST::Val.new(
   :name('$x'),                    :value(42)
   :scope('lexical')             )
 )                                                PAST::Val.new(
                                                    :value('The Answer!')
                                                  )
Как работает Rakudo: построение AST
                       if $x == 42 { say "The answer!"; }

                           PAST::Op.new( :pasttype('if'), … )

                PAST::Op.new(                                   PAST::Block.new( … )
                  :pasttype('call'),
                  :name('&infix:<==>'),
                  …                                             PAST::Op.new(
                )                                                 :pasttype('call'),
                                                                  :name('&say'),
                                                                  …
                                                                )
 PAST::Var.new(                  PAST::Val.new(
   :name('$x'),                    :value(42)
   :scope('lexical')             )
 )                                                              PAST::Val.new(
                                                                  :value('The Answer!')
                                                                )
Как работает Rakudo: построение AST
                       if $x == 42 { say "The answer!"; }

                           PAST::Op.new( :pasttype('if'), … )

                PAST::Op.new(                                   PAST::Block.new( … )
                  :pasttype('call'),
                  :name('&infix:<==>'),
                  …                                             PAST::Op.new(
                )                                                 :pasttype('call'),
                                                                  :name('&say'),
                                                                  …
                                                                )
 PAST::Var.new(                  PAST::Val.new(
   :name('$x'),                    :value(42)
   :scope('lexical')             )
 )                                                              PAST::Val.new(
                                                                  :value('The Answer!')
                                                                )
Как работает Rakudo: генерация кода
     Берем дерево AST и генерируем внутренний код под
      целевую платформу
     Сегодня на этом этапе мы делаем код только для
      виртуальной машины Parrot
     Акхитектура такова, что в будущем мы сможем
      добавить другие бекенды
     Кроме того, в этом месте последовательности
      компиляции возможно выполнять фазы оптимизации и
      анализа программы
Примеры:
сегодняшние
возможности
   Rakudo
Примеры
    Рассмотрим набор небольших, посведневных
     программистских задач и для каждой покажем…
         код на Perl 6, решающий задачу
         вывод после запуска
    Надеюсь, это хорошее начало для того, чтобы понять
     новый синтаксис и новые возможности
    Покажу крутые фичи Perl 6 
    Все показанные сегодня примеры работают в Rakudo
Задача
Напечатать «Hello, world!»
Решение
say "Hello, world!"

Вывод
Hello, world!
Задача
Прочитать строку с консоли
Решение
print "Enter your name: ";
my $name = $*IN.get;
say "Hi $name!";

Вывод
Enter your name: Jonathan
Hi Jonathan!
Задача
Проверить, находится ли значение в данном диапазоне
Решение 1
loop {
    print "Enter a number from 1 to 10: ";
    my $num = $*IN.get;
    unless 1 <= $num <= 10 { say "Fail!" }
}

Вывод
Enter a number between 1 and 10: 3
Enter a number between 1 and 10: 42
Fail!
Задача
Проверить, находится ли значение в данном диапазоне
Решение 2
loop {
    print "Enter a number from 1 to 10: ";
    my $num = $*IN.get;
    unless $num ~~ 1..10 { say "Fail!" }
}

Вывод
Enter a number between 1 and 10: 3
Enter a number between 1 and 10: 42
Fail!
Задача
Просуммировать список чисел
Решение
my @nums = 1, 5, 7, -2, 3, 9, 11, -6, 14;
say [+] @nums;

Вывод
42
Задача
Проверить, отсортирован ли список
Решение
my   @a =   1,   1, 2,   3, 5, 8;
my   @b =   9,   4, 1,   16, 36, 25;
if   [<=]   @a   { say   '@a is sorted' }
if   [<=]   @b   { say   '@b is sorted' }

Вывод
@a is sorted
Задача
Пройтись по списку
Решение
my @cities = <Moscow Kazan Vladivostok>;
for @cities -> $city {
    say "I've been to $city";
}

Вывод
I've been to Moscow
I've been to Kazan
I've been to Vladivostok
Задача
Пройтись по ключам и значениям хеша
Решение
my %distances = Bratislava => 1084, Stockholm   => 442;
for %distances.kv -> $city, $distance {
    say "$city is $distance km away";
}

Вывод
Bratislava is 1084 km away
Stockholm is 442 km away
Задача
Проверить, есть ли в списке результатов экзаменов хотя бы
один, превышающий порог
Решение
my   @a = 75, 47, 90, 22, 80;
my   @b = 61, 77, 94, 82, 60;
my   @c = 45, 59, 33, 11, 19;
if   any(@a) >= 60 { say "Some passes in A" }
if   any(@b) >= 60 { say "Some passes in B" }
if   any(@c) >= 60 { say "Some passes in C" }

Вывод
Some passes in A
Some passes in B
Задача
Проверить, все ли результаты экзаменов в списке
превышают порог
Решение
my   @a = 75, 47, 90, 22, 80;
my   @b = 61, 77, 94, 82, 60;
my   @c = 45, 59, 33, 11, 19;
if   all(@a) >= 60 { say "All passes in A" }
if   all(@b) >= 60 { say "All passes in B" }
if   all(@c) >= 60 { say "All passes in C" }

Вывод
All passes in B
Задача
Проверить, что ни один из результатов экзаменов в списке
не превышает порог
Решение
my   @a = 75,   47, 90,   22,   80;
my   @b = 61,   77, 94,   82,   60;
my   @c = 45,   59, 33,   11,   19;
if   none(@a)   >= 60 {   say   "No passes in A" }
if   none(@b)   >= 60 {   say   "No passes in B" }
if   none(@c)   >= 60 {   say   "No passes in C" }

Вывод
No passes in C
Задача
Выбрать из списка случайный элемент
Решение
my @drinks = <wine beer vodka>;
say "Tonight I'll drink { @drinks.pick }";

Вывод (результат дожен меняться ;-))
Tonight I'll drink vodka
Задача
Перемешать список в случайном порядке
Решение
my @competitors = <Tina Lena Owen Peter>;
my @order = @competitors.pick(*);
for @order { .say }

Вывод (результат дожен меняться ;-))
Peter
Lena
Owen
Tina
Задача
Написать и вызвать подпрограмму с параметрами
Решение
sub greet($greeting, $name) {
    say "$greeting, $name!";
}
greet("hello", "masak");

Вывод
hello, masak
Задача
Написать подпрограмму, принимающую только число
Решение
sub double(Num $n) { 2 * $n }
say double(21);
say double("oh no I'm not a number");

Вывод
42
Parameter type check failed; expected Num, but got Str
for $n in call to double
Задача
Вызвать нужную мульти-функцию в зависимости от типа
аргумента
Решение
multi double(Num $n) { 2 * $n }
multi double(Str $s) { $s x 2 }
say double(21);
say double("boo");

Вывод
42
booboo
Задача
Вычислить факториал (рекурсивно)

Решение
multi fact($n) { $n * fact($n - 1) }
multi fact(0) { 1 }
say fact(1);
say fact(10);

Вывод
1
3628800
Задача
Вычислить факториал (используя мета-оператор)

Решение
sub fact($n) { [*] 1..$n }
say fact(1);
say fact(10);

Вывод
1
3628800
Задача
Добавить новый оператор факториала (чтобы работало 10!)

Решение
sub postfix:<!>($n) { [*] 1..$n }
say 1!;
say 10!;

Вывод
1
3628800
Задача
Объявить класс с атрибутами и методами
Решение
class Product {
    has $.name;            # Атрибут + аксессор
    has $!price;           # Только атрибут
    has $.discount is rw; # Атрибут + lvalue-аксессор
    method get_price {
        return $!price - $!discount;
    }
}
Задача
Создать экземпляр класса и вызвать на нем метод
Решение
my $prod = Product.new(
    name      => "Beer",
    price     => 500,
    discount => 60
);
say $prod.get_price;

Вывод
440
Задача
Прочитать/записать атрибут через аксессор
Решение
say $prod.name;
$prod.discount = 40;
say $prod.get_price;
$prod.name = 'Wine';

Вывод
Beer
460
Cannot assign to readonly variable.
Задача
Вызвать метод на каждом объекте из списка
Решение
 my @products = Product.new(name => 'Beer', price => 500),
                Product.new(name => 'Wine', price => 450),
                Product.new(name => 'Vodka', price => 1600);
 my @uc_names = @products>>.name>>.uc;
 for @uc_names { .say }

Вывод
BEER
WINE
VODKA
Задача
Сделать интроспекцию, чтобы узнать методы класса
Решение
my @meths = Product.^methods(:local);
for @meths>>.name { .say }

Вывод
get_price
discount
name
Задача
Отсортировать список объектов с учетом вызова метода
Решение (пример 1)
my @products = Product.new(name => 'Beer', price => 500),
               Product.new(name => 'Wine', price => 450),
               Product.new(name => 'Vodka', price => 1600);
my @sorted = @products.sort(*.name);
for @sorted { .name.say }

Вывод (пример 1)
Beer
Vodka
Wine
Задача
Отсортировать список объектов с учетом вызова метода
Решение (пример 2)
my @products = Product.new(name => 'Beer', price => 500),
               Product.new(name => 'Wine', price => 450),
               Product.new(name => 'Vodka', price => 1600);
my @sorted = @products.sort(*.get_price);
for @sorted { .name.say }

Вывод (пример 2)
Wine
Beer
Vodka
Задача
Найти минимальное и максимальное значения в списке
Решение (пример 1)
my @temperatures = -3, 5, 7, 2, -1, -4, 0;
say "Minimum was " ~ @temperatures.min;
say "Maximum was " ~ @temperatures.max;

Вывод (решение 1)
Minimum was –4
Maximum was 7
Задача
Найти минимальное и максимальное значения в списке
Решение (пример 2)
my @products = Product.new(name => 'Beer', price => 500),
               Product.new(name => 'Wine', price => 450),
               Product.new(name => 'Vodka', price => 1600);
say "Cheapest: " ~ @products.min(*.get_price).name;
say "Costliest: " ~ @products.max(*.get_price).name;

Вывод (пример 2)
Cheapest: Wine
Costliest: Vodka
Задача
Реализовать игру «Камень, ножницы, бумага»
Решение (часть 1)
class   Paper { }
class   Scissor { }
class   Stone { }
multi   win(Paper,     Stone)     {   "Выиграл" }
multi   win(Scissor,   Paper)     {   "Выиграл" }
multi   win(Stone,     Scissor)   {   "Выиграл" }
multi   win(::T,       T)         {   "Ничья" }
multi   win(Any,       Any)       {   "Проиграл" }
Задача
Реализовать игру «Камень, ножницы, бумага»

Решение (часть 2)
say win(Paper, Paper);
say win(Scissor, Stone);
say win(Stone, Scissor);

Вывод
Ничья
Проиграл
Выиграл
Rakudo *
 [Ракудо стар]
Что такое Rakudo *?
     Заметный прогресс Rakudo
          Постоянно реализуются новые части спецификации
          Постоянно растет число пройденных тестов
          Исправляется много багов
          Растет число активных разработчиков
     До сих пор мы фокусировались на процессе создания
      Rakudo
     Rakudo * — релиз, где мы фокусируемся на том, что
      нужно первопроходцам
Что войдет в релиз?
     Мы делаем релиз компилятора каждый месяц;
      а Rakudo *, напротив, — дистрибутив, включающий:
          Компилятор Rakudo, конечно же 
          Инструмент для загрузки, установки и обновления
           модулей
          Набор модулей Perl 6 для решения типовых задач
           (например, HTTP-клиент и сервер, соединение с
           базой данных, что-нибудь для веба, YAML…)
Что войдет в релиз?
     Мы намереваемся включить пару других проектов…
          Zavolaj! — модуль, позволяющих писать на Perl 6
           обертки для библиотек C; на нем мы сделали
           клиент MySQL
          Blizkost — промежуточный слой Perl 5  Parrot,
           котоырй позволит из Perl 6 использовать модули
           Perl 5
Что Rakudo * будет делать хорошо
     Rakudo хорошо покрывает большую часть
      спецификации Perl 6…
          Широкий выбор встроенных операторов, типов и функций
          Подпрограммы, сигнатуры и множественная
           диспетчеризация
          ООП, включая классы, роли, интроспекцию и многое
           другое
          Perl 6 регексы и грамматики (именно ими мы делаем
           разбор Perl 6!)
Слабые места
     Rakudo * сможет многое предложить и окажется
      полезным для многих задач
     Однако, это не полный Perl 6, и, конечно, с
      недостатками, например:
          Отсутствие поддержки тредов
          Отсутсвие поддержки нативных типов
          Довольно медленный — еще не все оптимизировано,
           и отсутствует оптимизатор
Когда?
     Скоро 
Когда?
     Скоро 
     Или в конце мая, или в начале или середине июня
Когда?
     Скоро 
     Или в конце мая, или в начале или середине июня
     Да, в этом году
Вливайтесь!
Как узнать больше?
     Загрузите Rakudo Perl 6 с сайта
      http://www.rakudo.org/
     Много ссылок на ресурсы про Perl 6 собрано на сайте
      http://www.perl6.org/
     Присоединяйтесь к дружелюбному IRC-каналу
      #perl6 on irc.freenode.org
     Пишите модули, создавайте приложения,
      включайтесь в развите сообщества Perl 6 и делайте
      свой вклад в него 
Спасибо
Вопросы?

Weitere ähnliche Inhalte

Was ist angesagt?

PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокAndrey Karpov
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Контейнеры и хранение объектов в ООП
Контейнеры и хранение объектов в ООПКонтейнеры и хранение объектов в ООП
Контейнеры и хранение объектов в ООПitclub_kz
 
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev FedorProgramming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev FedorFedor Lavrentyev
 
[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)Evgeny Kaziak
 
Очень вкусный фрукт Guava
Очень вкусный фрукт GuavaОчень вкусный фрукт Guava
Очень вкусный фрукт GuavaEgor Chernyshev
 
Быть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря GroovyБыть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря GroovyEvgeny Kompaniyets
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному кодуVasiliy Deynega
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассовAndrey Zakharevich
 
Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Roman Brovko
 

Was ist angesagt? (12)

PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибок
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Контейнеры и хранение объектов в ООП
Контейнеры и хранение объектов в ООПКонтейнеры и хранение объектов в ООП
Контейнеры и хранение объектов в ООП
 
course js day 2
course js day 2course js day 2
course js day 2
 
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev FedorProgramming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
 
[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)
 
Очень вкусный фрукт Guava
Очень вкусный фрукт GuavaОчень вкусный фрукт Guava
Очень вкусный фрукт Guava
 
Быть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря GroovyБыть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря Groovy
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному коду
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассов
 
Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.
 

Ähnlich wie Andrew Shitov Rakudo Jonathan

Ähnlich wie Andrew Shitov Rakudo Jonathan (6)

Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Scala - my path
Scala - my pathScala - my path
Scala - my path
 
Vsevolod Rodionov "Neural networks in js"
Vsevolod Rodionov "Neural networks in js"Vsevolod Rodionov "Neural networks in js"
Vsevolod Rodionov "Neural networks in js"
 
Нейронные сети на JS
Нейронные сети на JSНейронные сети на JS
Нейронные сети на JS
 
Scala
ScalaScala
Scala
 
Scala for android
Scala for androidScala for android
Scala for android
 

Mehr von guest092df8

Artem Volftrub анатомия интернет банка
Artem Volftrub анатомия интернет банкаArtem Volftrub анатомия интернет банка
Artem Volftrub анатомия интернет банкаguest092df8
 
Eugene Lisitsky Web Sockets
Eugene Lisitsky Web SocketsEugene Lisitsky Web Sockets
Eugene Lisitsky Web Socketsguest092df8
 
Vladimir Bobrikov Rit2010 Reputation
Vladimir Bobrikov Rit2010 ReputationVladimir Bobrikov Rit2010 Reputation
Vladimir Bobrikov Rit2010 Reputationguest092df8
 
Serge P Nekoval Grails
Serge P  Nekoval  GrailsSerge P  Nekoval  Grails
Serge P Nekoval Grailsguest092df8
 
Max Lapshin Erlyvideo V1
Max Lapshin Erlyvideo V1Max Lapshin Erlyvideo V1
Max Lapshin Erlyvideo V1guest092df8
 
Denis Samoseev Risk Management
Denis Samoseev Risk ManagementDenis Samoseev Risk Management
Denis Samoseev Risk Managementguest092df8
 
Andrew Pantyukhin P Nf Sv4
Andrew Pantyukhin P Nf Sv4Andrew Pantyukhin P Nf Sv4
Andrew Pantyukhin P Nf Sv4guest092df8
 
Alexander Krizhanovsky Krizhanovsky Hpds
Alexander Krizhanovsky Krizhanovsky HpdsAlexander Krizhanovsky Krizhanovsky Hpds
Alexander Krizhanovsky Krizhanovsky Hpdsguest092df8
 
Alexander Shigin Slides
Alexander Shigin SlidesAlexander Shigin Slides
Alexander Shigin Slidesguest092df8
 
Alexandre Iline Rit 2010 Java Fxui
Alexandre Iline Rit 2010 Java FxuiAlexandre Iline Rit 2010 Java Fxui
Alexandre Iline Rit 2010 Java Fxuiguest092df8
 

Mehr von guest092df8 (10)

Artem Volftrub анатомия интернет банка
Artem Volftrub анатомия интернет банкаArtem Volftrub анатомия интернет банка
Artem Volftrub анатомия интернет банка
 
Eugene Lisitsky Web Sockets
Eugene Lisitsky Web SocketsEugene Lisitsky Web Sockets
Eugene Lisitsky Web Sockets
 
Vladimir Bobrikov Rit2010 Reputation
Vladimir Bobrikov Rit2010 ReputationVladimir Bobrikov Rit2010 Reputation
Vladimir Bobrikov Rit2010 Reputation
 
Serge P Nekoval Grails
Serge P  Nekoval  GrailsSerge P  Nekoval  Grails
Serge P Nekoval Grails
 
Max Lapshin Erlyvideo V1
Max Lapshin Erlyvideo V1Max Lapshin Erlyvideo V1
Max Lapshin Erlyvideo V1
 
Denis Samoseev Risk Management
Denis Samoseev Risk ManagementDenis Samoseev Risk Management
Denis Samoseev Risk Management
 
Andrew Pantyukhin P Nf Sv4
Andrew Pantyukhin P Nf Sv4Andrew Pantyukhin P Nf Sv4
Andrew Pantyukhin P Nf Sv4
 
Alexander Krizhanovsky Krizhanovsky Hpds
Alexander Krizhanovsky Krizhanovsky HpdsAlexander Krizhanovsky Krizhanovsky Hpds
Alexander Krizhanovsky Krizhanovsky Hpds
 
Alexander Shigin Slides
Alexander Shigin SlidesAlexander Shigin Slides
Alexander Shigin Slides
 
Alexandre Iline Rit 2010 Java Fxui
Alexandre Iline Rit 2010 Java FxuiAlexandre Iline Rit 2010 Java Fxui
Alexandre Iline Rit 2010 Java Fxui
 

Andrew Shitov Rakudo Jonathan

  • 3. Что такое Perl 6?  Возьмем лучшее из Perl…  Практичность — акцент на решении задачи  Мультипарадигменность — потому что не существует единственного подхода к решению всех задач  Лингвистическое влияние — это же язык программирования  Простые вещи просты, а сложные — возможны
  • 4. Что такое Perl 6?  Построим новый Perl-подобный язык, который…  Более регулярен — меньше особых случаев  Более читаем и более поддерживаем  Более выразителен  Более ОО, более функциональный, более декларативный, более параллельный…  Простое — просто  Сложное — еще более доступно
  • 5. Одна спецификация, много реализаций  В отличие от Perl 5, для Perl 6 написана спецификация языка  Нет «официальной» реализации  Как и в Perl 5, у Perl 6 есть набор тестов  Правильная реализация должна проходить набор тестов  Это некая «исполняемая спецификация»  Сейчас около 40 000 тестов
  • 7. Что такое Rakudo?  Наиболее активно разрабатываемый компилятор Perl 6  Реализует значительную часть спецификации Perl 6 (хотя еще есть, над чем работать)  Сегодня проходится более 30 000 тестов из набора тестов Perl 6 (правда набор тестов растет )  Сейчас основан на виртуальной машине Parrot  В этом году мы планируем как минимум еще одну платформу
  • 8. Как работает Rakudo  Написан на…  NQP (минимальное подмножество Perl 6) Ядро компилятора (грамматика и построение AST), некоторые мета-модели, поиск и загрузка модулей)  Perl 6 Большинство встроенных функций и операторов  Parrot Intermediate Language Некоторые низкоуровневые фукнции и «клей» (glue)  C Диспетчеры, работа с сигнатурами, кастомизация VM и «клей»
  • 9. Как работает Rakudo: парсинг  Сначала Rakudo разбирает программу  Парсер написан на регексах Perl 6 token statement_control:sym<if> { <sym> :s <xblock> [ 'elsif's <xblock> ]* [ 'else's <else=.pblock> ]? }  Может находить новые операторы во время разбора  Должен сразу выполнять блоки BEGIN
  • 10. Как работает Rakudo: построение AST  Когда заканчивается разбор чего-либо (например, инструкции if), запускается action-метод  Он строит абстрактное синтаксическое дерево (Abstract Syntax Tree, AST)  Это представление программы в абстрактом — не зависимом от синтаксиса языка — виде  Большинство action-методов строят сложное AST из маленьких фрагментов, которые уже разобраны
  • 11. Как работает Rakudo: построение AST if $x == 42 { say "The answer!"; }
  • 12. Как работает Rakudo: построение AST if $x == 42 { say "The answer!"; } PAST::Var.new( :name('$x'), :scope('lexical') )
  • 13. Как работает Rakudo: построение AST if $x == 42 { say "The answer!"; } PAST::Var.new( PAST::Val.new( :name('$x'), :value(42) :scope('lexical') ) )
  • 14. Как работает Rakudo: построение AST if $x == 42 { say "The answer!"; } PAST::Op.new( :pasttype('call'), :name('&infix:<==>'), … ) PAST::Var.new( PAST::Val.new( :name('$x'), :value(42) :scope('lexical') ) )
  • 15. Как работает Rakudo: построение AST if $x == 42 { say "The answer!"; } PAST::Op.new( :pasttype('call'), :name('&infix:<==>'), … ) PAST::Var.new( PAST::Val.new( :name('$x'), :value(42) :scope('lexical') ) ) PAST::Val.new( :value('The Answer!') )
  • 16. Как работает Rakudo: построение AST if $x == 42 { say "The answer!"; } PAST::Op.new( :pasttype('call'), :name('&infix:<==>'), … PAST::Op.new( ) :pasttype('call'), :name('&say'), … ) PAST::Var.new( PAST::Val.new( :name('$x'), :value(42) :scope('lexical') ) ) PAST::Val.new( :value('The Answer!') )
  • 17. Как работает Rakudo: построение AST if $x == 42 { say "The answer!"; } PAST::Op.new( PAST::Block.new( … ) :pasttype('call'), :name('&infix:<==>'), … PAST::Op.new( ) :pasttype('call'), :name('&say'), … ) PAST::Var.new( PAST::Val.new( :name('$x'), :value(42) :scope('lexical') ) ) PAST::Val.new( :value('The Answer!') )
  • 18. Как работает Rakudo: построение AST if $x == 42 { say "The answer!"; } PAST::Op.new( :pasttype('if'), … ) PAST::Op.new( PAST::Block.new( … ) :pasttype('call'), :name('&infix:<==>'), … PAST::Op.new( ) :pasttype('call'), :name('&say'), … ) PAST::Var.new( PAST::Val.new( :name('$x'), :value(42) :scope('lexical') ) ) PAST::Val.new( :value('The Answer!') )
  • 19. Как работает Rakudo: построение AST if $x == 42 { say "The answer!"; } PAST::Op.new( :pasttype('if'), … ) PAST::Op.new( PAST::Block.new( … ) :pasttype('call'), :name('&infix:<==>'), … PAST::Op.new( ) :pasttype('call'), :name('&say'), … ) PAST::Var.new( PAST::Val.new( :name('$x'), :value(42) :scope('lexical') ) ) PAST::Val.new( :value('The Answer!') )
  • 20. Как работает Rakudo: генерация кода  Берем дерево AST и генерируем внутренний код под целевую платформу  Сегодня на этом этапе мы делаем код только для виртуальной машины Parrot  Акхитектура такова, что в будущем мы сможем добавить другие бекенды  Кроме того, в этом месте последовательности компиляции возможно выполнять фазы оптимизации и анализа программы
  • 22. Примеры  Рассмотрим набор небольших, посведневных программистских задач и для каждой покажем…  код на Perl 6, решающий задачу  вывод после запуска  Надеюсь, это хорошее начало для того, чтобы понять новый синтаксис и новые возможности  Покажу крутые фичи Perl 6   Все показанные сегодня примеры работают в Rakudo
  • 24. Задача Прочитать строку с консоли Решение print "Enter your name: "; my $name = $*IN.get; say "Hi $name!"; Вывод Enter your name: Jonathan Hi Jonathan!
  • 25. Задача Проверить, находится ли значение в данном диапазоне Решение 1 loop { print "Enter a number from 1 to 10: "; my $num = $*IN.get; unless 1 <= $num <= 10 { say "Fail!" } } Вывод Enter a number between 1 and 10: 3 Enter a number between 1 and 10: 42 Fail!
  • 26. Задача Проверить, находится ли значение в данном диапазоне Решение 2 loop { print "Enter a number from 1 to 10: "; my $num = $*IN.get; unless $num ~~ 1..10 { say "Fail!" } } Вывод Enter a number between 1 and 10: 3 Enter a number between 1 and 10: 42 Fail!
  • 27. Задача Просуммировать список чисел Решение my @nums = 1, 5, 7, -2, 3, 9, 11, -6, 14; say [+] @nums; Вывод 42
  • 28. Задача Проверить, отсортирован ли список Решение my @a = 1, 1, 2, 3, 5, 8; my @b = 9, 4, 1, 16, 36, 25; if [<=] @a { say '@a is sorted' } if [<=] @b { say '@b is sorted' } Вывод @a is sorted
  • 29. Задача Пройтись по списку Решение my @cities = <Moscow Kazan Vladivostok>; for @cities -> $city { say "I've been to $city"; } Вывод I've been to Moscow I've been to Kazan I've been to Vladivostok
  • 30. Задача Пройтись по ключам и значениям хеша Решение my %distances = Bratislava => 1084, Stockholm => 442; for %distances.kv -> $city, $distance { say "$city is $distance km away"; } Вывод Bratislava is 1084 km away Stockholm is 442 km away
  • 31. Задача Проверить, есть ли в списке результатов экзаменов хотя бы один, превышающий порог Решение my @a = 75, 47, 90, 22, 80; my @b = 61, 77, 94, 82, 60; my @c = 45, 59, 33, 11, 19; if any(@a) >= 60 { say "Some passes in A" } if any(@b) >= 60 { say "Some passes in B" } if any(@c) >= 60 { say "Some passes in C" } Вывод Some passes in A Some passes in B
  • 32. Задача Проверить, все ли результаты экзаменов в списке превышают порог Решение my @a = 75, 47, 90, 22, 80; my @b = 61, 77, 94, 82, 60; my @c = 45, 59, 33, 11, 19; if all(@a) >= 60 { say "All passes in A" } if all(@b) >= 60 { say "All passes in B" } if all(@c) >= 60 { say "All passes in C" } Вывод All passes in B
  • 33. Задача Проверить, что ни один из результатов экзаменов в списке не превышает порог Решение my @a = 75, 47, 90, 22, 80; my @b = 61, 77, 94, 82, 60; my @c = 45, 59, 33, 11, 19; if none(@a) >= 60 { say "No passes in A" } if none(@b) >= 60 { say "No passes in B" } if none(@c) >= 60 { say "No passes in C" } Вывод No passes in C
  • 34. Задача Выбрать из списка случайный элемент Решение my @drinks = <wine beer vodka>; say "Tonight I'll drink { @drinks.pick }"; Вывод (результат дожен меняться ;-)) Tonight I'll drink vodka
  • 35. Задача Перемешать список в случайном порядке Решение my @competitors = <Tina Lena Owen Peter>; my @order = @competitors.pick(*); for @order { .say } Вывод (результат дожен меняться ;-)) Peter Lena Owen Tina
  • 36. Задача Написать и вызвать подпрограмму с параметрами Решение sub greet($greeting, $name) { say "$greeting, $name!"; } greet("hello", "masak"); Вывод hello, masak
  • 37. Задача Написать подпрограмму, принимающую только число Решение sub double(Num $n) { 2 * $n } say double(21); say double("oh no I'm not a number"); Вывод 42 Parameter type check failed; expected Num, but got Str for $n in call to double
  • 38. Задача Вызвать нужную мульти-функцию в зависимости от типа аргумента Решение multi double(Num $n) { 2 * $n } multi double(Str $s) { $s x 2 } say double(21); say double("boo"); Вывод 42 booboo
  • 39. Задача Вычислить факториал (рекурсивно) Решение multi fact($n) { $n * fact($n - 1) } multi fact(0) { 1 } say fact(1); say fact(10); Вывод 1 3628800
  • 40. Задача Вычислить факториал (используя мета-оператор) Решение sub fact($n) { [*] 1..$n } say fact(1); say fact(10); Вывод 1 3628800
  • 41. Задача Добавить новый оператор факториала (чтобы работало 10!) Решение sub postfix:<!>($n) { [*] 1..$n } say 1!; say 10!; Вывод 1 3628800
  • 42. Задача Объявить класс с атрибутами и методами Решение class Product { has $.name; # Атрибут + аксессор has $!price; # Только атрибут has $.discount is rw; # Атрибут + lvalue-аксессор method get_price { return $!price - $!discount; } }
  • 43. Задача Создать экземпляр класса и вызвать на нем метод Решение my $prod = Product.new( name => "Beer", price => 500, discount => 60 ); say $prod.get_price; Вывод 440
  • 44. Задача Прочитать/записать атрибут через аксессор Решение say $prod.name; $prod.discount = 40; say $prod.get_price; $prod.name = 'Wine'; Вывод Beer 460 Cannot assign to readonly variable.
  • 45. Задача Вызвать метод на каждом объекте из списка Решение my @products = Product.new(name => 'Beer', price => 500), Product.new(name => 'Wine', price => 450), Product.new(name => 'Vodka', price => 1600); my @uc_names = @products>>.name>>.uc; for @uc_names { .say } Вывод BEER WINE VODKA
  • 46. Задача Сделать интроспекцию, чтобы узнать методы класса Решение my @meths = Product.^methods(:local); for @meths>>.name { .say } Вывод get_price discount name
  • 47. Задача Отсортировать список объектов с учетом вызова метода Решение (пример 1) my @products = Product.new(name => 'Beer', price => 500), Product.new(name => 'Wine', price => 450), Product.new(name => 'Vodka', price => 1600); my @sorted = @products.sort(*.name); for @sorted { .name.say } Вывод (пример 1) Beer Vodka Wine
  • 48. Задача Отсортировать список объектов с учетом вызова метода Решение (пример 2) my @products = Product.new(name => 'Beer', price => 500), Product.new(name => 'Wine', price => 450), Product.new(name => 'Vodka', price => 1600); my @sorted = @products.sort(*.get_price); for @sorted { .name.say } Вывод (пример 2) Wine Beer Vodka
  • 49. Задача Найти минимальное и максимальное значения в списке Решение (пример 1) my @temperatures = -3, 5, 7, 2, -1, -4, 0; say "Minimum was " ~ @temperatures.min; say "Maximum was " ~ @temperatures.max; Вывод (решение 1) Minimum was –4 Maximum was 7
  • 50. Задача Найти минимальное и максимальное значения в списке Решение (пример 2) my @products = Product.new(name => 'Beer', price => 500), Product.new(name => 'Wine', price => 450), Product.new(name => 'Vodka', price => 1600); say "Cheapest: " ~ @products.min(*.get_price).name; say "Costliest: " ~ @products.max(*.get_price).name; Вывод (пример 2) Cheapest: Wine Costliest: Vodka
  • 51. Задача Реализовать игру «Камень, ножницы, бумага» Решение (часть 1) class Paper { } class Scissor { } class Stone { } multi win(Paper, Stone) { "Выиграл" } multi win(Scissor, Paper) { "Выиграл" } multi win(Stone, Scissor) { "Выиграл" } multi win(::T, T) { "Ничья" } multi win(Any, Any) { "Проиграл" }
  • 52. Задача Реализовать игру «Камень, ножницы, бумага» Решение (часть 2) say win(Paper, Paper); say win(Scissor, Stone); say win(Stone, Scissor); Вывод Ничья Проиграл Выиграл
  • 54. Что такое Rakudo *?  Заметный прогресс Rakudo  Постоянно реализуются новые части спецификации  Постоянно растет число пройденных тестов  Исправляется много багов  Растет число активных разработчиков  До сих пор мы фокусировались на процессе создания Rakudo  Rakudo * — релиз, где мы фокусируемся на том, что нужно первопроходцам
  • 55. Что войдет в релиз?  Мы делаем релиз компилятора каждый месяц; а Rakudo *, напротив, — дистрибутив, включающий:  Компилятор Rakudo, конечно же   Инструмент для загрузки, установки и обновления модулей  Набор модулей Perl 6 для решения типовых задач (например, HTTP-клиент и сервер, соединение с базой данных, что-нибудь для веба, YAML…)
  • 56. Что войдет в релиз?  Мы намереваемся включить пару других проектов…  Zavolaj! — модуль, позволяющих писать на Perl 6 обертки для библиотек C; на нем мы сделали клиент MySQL  Blizkost — промежуточный слой Perl 5  Parrot, котоырй позволит из Perl 6 использовать модули Perl 5
  • 57. Что Rakudo * будет делать хорошо  Rakudo хорошо покрывает большую часть спецификации Perl 6…  Широкий выбор встроенных операторов, типов и функций  Подпрограммы, сигнатуры и множественная диспетчеризация  ООП, включая классы, роли, интроспекцию и многое другое  Perl 6 регексы и грамматики (именно ими мы делаем разбор Perl 6!)
  • 58. Слабые места  Rakudo * сможет многое предложить и окажется полезным для многих задач  Однако, это не полный Perl 6, и, конечно, с недостатками, например:  Отсутствие поддержки тредов  Отсутсвие поддержки нативных типов  Довольно медленный — еще не все оптимизировано, и отсутствует оптимизатор
  • 59. Когда?  Скоро 
  • 60. Когда?  Скоро   Или в конце мая, или в начале или середине июня
  • 61. Когда?  Скоро   Или в конце мая, или в начале или середине июня  Да, в этом году
  • 63. Как узнать больше?  Загрузите Rakudo Perl 6 с сайта http://www.rakudo.org/  Много ссылок на ресурсы про Perl 6 собрано на сайте http://www.perl6.org/  Присоединяйтесь к дружелюбному IRC-каналу #perl6 on irc.freenode.org  Пишите модули, создавайте приложения, включайтесь в развите сообщества Perl 6 и делайте свой вклад в него 