Your SlideShare is downloading. ×
0
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Andrew Shitov Rakudo Jonathan

442

Published on

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

  • Be the first to like this

No Downloads
Views
Total Views
442
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Rakudo Perl 6 Сегодняшние возможности
  • 2. Perl 6
  • 3. Что такое Perl 6?  Возьмем лучшее из Perl…  Практичность — акцент на решении задачи  Мультипарадигменность — потому что не существует единственного подхода к решению всех задач  Лингвистическое влияние — это же язык программирования  Простые вещи просты, а сложные — возможны
  • 4. Что такое Perl 6?  Построим новый Perl-подобный язык, который…  Более регулярен — меньше особых случаев  Более читаем и более поддерживаем  Более выразителен  Более ОО, более функциональный, более декларативный, более параллельный…  Простое — просто  Сложное — еще более доступно
  • 5. Одна спецификация, много реализаций  В отличие от Perl 5, для Perl 6 написана спецификация языка  Нет «официальной» реализации  Как и в Perl 5, у Perl 6 есть набор тестов  Правильная реализация должна проходить набор тестов  Это некая «исполняемая спецификация»  Сейчас около 40 000 тестов
  • 6. Rakudo
  • 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  Акхитектура такова, что в будущем мы сможем добавить другие бекенды  Кроме того, в этом месте последовательности компиляции возможно выполнять фазы оптимизации и анализа программы
  • 21. Примеры: сегодняшние возможности Rakudo
  • 22. Примеры  Рассмотрим набор небольших, посведневных программистских задач и для каждой покажем…  код на Perl 6, решающий задачу  вывод после запуска  Надеюсь, это хорошее начало для того, чтобы понять новый синтаксис и новые возможности  Покажу крутые фичи Perl 6   Все показанные сегодня примеры работают в Rakudo
  • 23. Задача Напечатать «Hello, world!» Решение say "Hello, world!" Вывод Hello, world!
  • 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); Вывод Ничья Проиграл Выиграл
  • 53. Rakudo * [Ракудо стар]
  • 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. Когда?  Скоро   Или в конце мая, или в начале или середине июня  Да, в этом году
  • 62. Вливайтесь!
  • 63. Как узнать больше?  Загрузите Rakudo Perl 6 с сайта http://www.rakudo.org/  Много ссылок на ресурсы про Perl 6 собрано на сайте http://www.perl6.org/  Присоединяйтесь к дружелюбному IRC-каналу #perl6 on irc.freenode.org  Пишите модули, создавайте приложения, включайтесь в развите сообщества Perl 6 и делайте свой вклад в него 
  • 64. Спасибо
  • 65. Вопросы?

×