Andrew Shitov Rakudo Jonathan

615 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
615
On SlideShare
0
From Embeds
0
Number of Embeds
31
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Andrew Shitov Rakudo Jonathan

  1. 1. Rakudo Perl 6 Сегодняшние возможности
  2. 2. Perl 6
  3. 3. Что такое Perl 6?  Возьмем лучшее из Perl…  Практичность — акцент на решении задачи  Мультипарадигменность — потому что не существует единственного подхода к решению всех задач  Лингвистическое влияние — это же язык программирования  Простые вещи просты, а сложные — возможны
  4. 4. Что такое Perl 6?  Построим новый Perl-подобный язык, который…  Более регулярен — меньше особых случаев  Более читаем и более поддерживаем  Более выразителен  Более ОО, более функциональный, более декларативный, более параллельный…  Простое — просто  Сложное — еще более доступно
  5. 5. Одна спецификация, много реализаций  В отличие от Perl 5, для Perl 6 написана спецификация языка  Нет «официальной» реализации  Как и в Perl 5, у Perl 6 есть набор тестов  Правильная реализация должна проходить набор тестов  Это некая «исполняемая спецификация»  Сейчас около 40 000 тестов
  6. 6. Rakudo
  7. 7. Что такое Rakudo?  Наиболее активно разрабатываемый компилятор Perl 6  Реализует значительную часть спецификации Perl 6 (хотя еще есть, над чем работать)  Сегодня проходится более 30 000 тестов из набора тестов Perl 6 (правда набор тестов растет )  Сейчас основан на виртуальной машине Parrot  В этом году мы планируем как минимум еще одну платформу
  8. 8. Как работает Rakudo  Написан на…  NQP (минимальное подмножество Perl 6) Ядро компилятора (грамматика и построение AST), некоторые мета-модели, поиск и загрузка модулей)  Perl 6 Большинство встроенных функций и операторов  Parrot Intermediate Language Некоторые низкоуровневые фукнции и «клей» (glue)  C Диспетчеры, работа с сигнатурами, кастомизация VM и «клей»
  9. 9. Как работает Rakudo: парсинг  Сначала Rakudo разбирает программу  Парсер написан на регексах Perl 6 token statement_control:sym<if> { <sym> :s <xblock> [ 'elsif's <xblock> ]* [ 'else's <else=.pblock> ]? }  Может находить новые операторы во время разбора  Должен сразу выполнять блоки BEGIN
  10. 10. Как работает Rakudo: построение AST  Когда заканчивается разбор чего-либо (например, инструкции if), запускается action-метод  Он строит абстрактное синтаксическое дерево (Abstract Syntax Tree, AST)  Это представление программы в абстрактом — не зависимом от синтаксиса языка — виде  Большинство action-методов строят сложное AST из маленьких фрагментов, которые уже разобраны
  11. 11. Как работает Rakudo: построение AST if $x == 42 { say "The answer!"; }
  12. 12. Как работает Rakudo: построение AST if $x == 42 { say "The answer!"; } PAST::Var.new( :name('$x'), :scope('lexical') )
  13. 13. Как работает Rakudo: построение AST if $x == 42 { say "The answer!"; } PAST::Var.new( PAST::Val.new( :name('$x'), :value(42) :scope('lexical') ) )
  14. 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. 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. 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. 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. 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. 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. 20. Как работает Rakudo: генерация кода  Берем дерево AST и генерируем внутренний код под целевую платформу  Сегодня на этом этапе мы делаем код только для виртуальной машины Parrot  Акхитектура такова, что в будущем мы сможем добавить другие бекенды  Кроме того, в этом месте последовательности компиляции возможно выполнять фазы оптимизации и анализа программы
  21. 21. Примеры: сегодняшние возможности Rakudo
  22. 22. Примеры  Рассмотрим набор небольших, посведневных программистских задач и для каждой покажем…  код на Perl 6, решающий задачу  вывод после запуска  Надеюсь, это хорошее начало для того, чтобы понять новый синтаксис и новые возможности  Покажу крутые фичи Perl 6   Все показанные сегодня примеры работают в Rakudo
  23. 23. Задача Напечатать «Hello, world!» Решение say "Hello, world!" Вывод Hello, world!
  24. 24. Задача Прочитать строку с консоли Решение print "Enter your name: "; my $name = $*IN.get; say "Hi $name!"; Вывод Enter your name: Jonathan Hi Jonathan!
  25. 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. 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. 27. Задача Просуммировать список чисел Решение my @nums = 1, 5, 7, -2, 3, 9, 11, -6, 14; say [+] @nums; Вывод 42
  28. 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. 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. 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. 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. 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. 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. 34. Задача Выбрать из списка случайный элемент Решение my @drinks = <wine beer vodka>; say "Tonight I'll drink { @drinks.pick }"; Вывод (результат дожен меняться ;-)) Tonight I'll drink vodka
  35. 35. Задача Перемешать список в случайном порядке Решение my @competitors = <Tina Lena Owen Peter>; my @order = @competitors.pick(*); for @order { .say } Вывод (результат дожен меняться ;-)) Peter Lena Owen Tina
  36. 36. Задача Написать и вызвать подпрограмму с параметрами Решение sub greet($greeting, $name) { say "$greeting, $name!"; } greet("hello", "masak"); Вывод hello, masak
  37. 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. 38. Задача Вызвать нужную мульти-функцию в зависимости от типа аргумента Решение multi double(Num $n) { 2 * $n } multi double(Str $s) { $s x 2 } say double(21); say double("boo"); Вывод 42 booboo
  39. 39. Задача Вычислить факториал (рекурсивно) Решение multi fact($n) { $n * fact($n - 1) } multi fact(0) { 1 } say fact(1); say fact(10); Вывод 1 3628800
  40. 40. Задача Вычислить факториал (используя мета-оператор) Решение sub fact($n) { [*] 1..$n } say fact(1); say fact(10); Вывод 1 3628800
  41. 41. Задача Добавить новый оператор факториала (чтобы работало 10!) Решение sub postfix:<!>($n) { [*] 1..$n } say 1!; say 10!; Вывод 1 3628800
  42. 42. Задача Объявить класс с атрибутами и методами Решение class Product { has $.name; # Атрибут + аксессор has $!price; # Только атрибут has $.discount is rw; # Атрибут + lvalue-аксессор method get_price { return $!price - $!discount; } }
  43. 43. Задача Создать экземпляр класса и вызвать на нем метод Решение my $prod = Product.new( name => "Beer", price => 500, discount => 60 ); say $prod.get_price; Вывод 440
  44. 44. Задача Прочитать/записать атрибут через аксессор Решение say $prod.name; $prod.discount = 40; say $prod.get_price; $prod.name = 'Wine'; Вывод Beer 460 Cannot assign to readonly variable.
  45. 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. 46. Задача Сделать интроспекцию, чтобы узнать методы класса Решение my @meths = Product.^methods(:local); for @meths>>.name { .say } Вывод get_price discount name
  47. 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. 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. 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. 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. 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. 52. Задача Реализовать игру «Камень, ножницы, бумага» Решение (часть 2) say win(Paper, Paper); say win(Scissor, Stone); say win(Stone, Scissor); Вывод Ничья Проиграл Выиграл
  53. 53. Rakudo * [Ракудо стар]
  54. 54. Что такое Rakudo *?  Заметный прогресс Rakudo  Постоянно реализуются новые части спецификации  Постоянно растет число пройденных тестов  Исправляется много багов  Растет число активных разработчиков  До сих пор мы фокусировались на процессе создания Rakudo  Rakudo * — релиз, где мы фокусируемся на том, что нужно первопроходцам
  55. 55. Что войдет в релиз?  Мы делаем релиз компилятора каждый месяц; а Rakudo *, напротив, — дистрибутив, включающий:  Компилятор Rakudo, конечно же   Инструмент для загрузки, установки и обновления модулей  Набор модулей Perl 6 для решения типовых задач (например, HTTP-клиент и сервер, соединение с базой данных, что-нибудь для веба, YAML…)
  56. 56. Что войдет в релиз?  Мы намереваемся включить пару других проектов…  Zavolaj! — модуль, позволяющих писать на Perl 6 обертки для библиотек C; на нем мы сделали клиент MySQL  Blizkost — промежуточный слой Perl 5  Parrot, котоырй позволит из Perl 6 использовать модули Perl 5
  57. 57. Что Rakudo * будет делать хорошо  Rakudo хорошо покрывает большую часть спецификации Perl 6…  Широкий выбор встроенных операторов, типов и функций  Подпрограммы, сигнатуры и множественная диспетчеризация  ООП, включая классы, роли, интроспекцию и многое другое  Perl 6 регексы и грамматики (именно ими мы делаем разбор Perl 6!)
  58. 58. Слабые места  Rakudo * сможет многое предложить и окажется полезным для многих задач  Однако, это не полный Perl 6, и, конечно, с недостатками, например:  Отсутствие поддержки тредов  Отсутсвие поддержки нативных типов  Довольно медленный — еще не все оптимизировано, и отсутствует оптимизатор
  59. 59. Когда?  Скоро 
  60. 60. Когда?  Скоро   Или в конце мая, или в начале или середине июня
  61. 61. Когда?  Скоро   Или в конце мая, или в начале или середине июня  Да, в этом году
  62. 62. Вливайтесь!
  63. 63. Как узнать больше?  Загрузите Rakudo Perl 6 с сайта http://www.rakudo.org/  Много ссылок на ресурсы про Perl 6 собрано на сайте http://www.perl6.org/  Присоединяйтесь к дружелюбному IRC-каналу #perl6 on irc.freenode.org  Пишите модули, создавайте приложения, включайтесь в развите сообщества Perl 6 и делайте свой вклад в него 
  64. 64. Спасибо
  65. 65. Вопросы?

×