Migrating from Perl 5 to 6

400 views
326 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
400
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Migrating from Perl 5 to 6

  1. 1. s/5/6/
  2. 2. Perl 6
  3. 3. Perl 6 Дизайн
  4. 4. Perl 6 Дизайн Реализация
  5. 5. Apocalypses, Exegeses, Synopses
  6. 6. STD.pm
  7. 7. Pugs
  8. 8. svn co http://svn.pugscode.org/pugs cd pugs perl Makefile.PL make make test
  9. 9. svn co http://svn.pugscode.org/pugs cd pugs perl Makefile.PL make make test install GHC . . . . . .
  10. 10. Rakudo
  11. 11. svn co https://svn.perl.org/parrot/                         trunk parrot perl Configure.pl make cd languages/perl6/ make perl6
  12. 12. ./perl6 perl6.exe
  13. 13. Программа Компилятор Виртуальная машина Байт-код
  14. 14. Программа Компилятор Виртуальная машина Байт-код
  15. 15. Basic Forth Jako Lisp m4 Ook Perl 6 Perl 5 Python Ruby Scheme Tcl
  16. 16. Basic Forth Jako Lisp m4 Ook Perl 6 Perl 5 Python Ruby Scheme Tcl байт-код
  17. 17. Basic Forth Jako Lisp m4 Ook Perl 6 Perl 5 Python Ruby Scheme Tcl LOL-код
  18. 18. Хаффманизизация
  19. 19. print "Hello, World!";
  20. 20. say "は、ラクダの方法";
  21. 21. "は、ラクダの方法".say;
  22. 22. my $ναριαβλε =    "は、ラクダの方法";
  23. 23. $str.chars; $str.bytes; $str.glyphs;
  24. 24. my $lang = "Perl 5"; $lang++; say $lang;
  25. 25. my @arr = (0..5); say $arr[2];
  26. 26. my @arr = (0..5); say @arr[2];
  27. 27. my @arr = (0..5); say @arr[2, 3];
  28. 28. my @arr = (0..5); say @arr.elems;
  29. 29. my %hash = (     city => "Rostov‐on‐Don",     year => 2008 ); say $hash{city};
  30. 30. my %hash = (     city => "Rostov‐on‐Don",     year => 2008 ); say %hash<city>;
  31. 31. my %hash =      city => "Rostov‐on‐Don",     year => 2008 ; say %hash<city year>;
  32. 32. my %hash =      city => "Rostov‐on‐Don",     year => 2008 ; say %hash.kv;
  33. 33. if ($latitude > 47.2 &&     $latitude < 47.3) {     print "Rostov‐on‐Donn"; }
  34. 34. if 47.2 < $latitude < 47.3 {     say "Rostov‐on‐Don"; }
  35. 35. Контексты
  36. 36. my @array = (5..10); say ~@array;    5 6 7 8 9 10
  37. 37. my @array = (5..10); say +@array;    6
  38. 38. my @array = (5..10); say ~ hash @array;    5  6    7  8    9  10
  39. 39. my @array = (5..10); say ?+@array;
  40. 40. print      "Ростов"    . "‐на‐"    . "Дону";
  41. 41. print      "Ростов"    ~ "‐на‐"    ~ "Дону";
  42. 42. Функции
  43. 43. sub flight($from, $to) {    say "$from ‐‐> $to"; } flight("Москва",         "Ростов‐на‐Дону");
  44. 44. sub flight($from, $to) {    say "$from ‐‐> $to"; } flight "Москва",         "Ростов‐на‐Дону";
  45. 45. sub flight($from, $to) {    say "$from ‐‐> $to"; } flight    from => "Москва",     to   => "Ростов‐на‐Дону";
  46. 46. sub choose(@a, @b) {    return       any(@a) < all(@b) ??       1 !! 2; } say choose(     @SkyExpressPrices,     @AeroflotPrices );
  47. 47. Циклы
  48. 48. for @list {     say $_; }
  49. 49. for @list ‐> $x {     say $x; }
  50. 50. for @list ‐> $x, $y {     say $x + $y; }
  51. 51. for     @list,     sub($x, $y) {        . . .     }
  52. 52. loop(my $t = 300; $t; $t‐‐) {    sleep 1; }; say "cunt";
  53. 53. Гипероператоры
  54. 54. my @Flight = (...); my @Food = (...);
  55. 55. my @Flight = (...); my @Food = (...); my @FullPrice =     @Flight >>+<< @Food;
  56. 56. my @Flight = (...); my @Food = (...); my @FullPrice =     @Flight >>+<< @Food; @FullPrice >>+=<< $Fuel;
  57. 57. my @Flight = (...); my @Food = (...); my @FullPrice =     @Flight »+« @Food; @FullPrice »+=« $Fuel;
  58. 58. Объединения
  59. 59. Объединения (квантовые суперпозиции)
  60. 60. sub choose(@a, @b) {    return       any(@a) < all(@b) ??       1 !! 2; }
  61. 61. say 1      if 20 == 10 | 20 | 30;
  62. 62. say 1      if 20 == 10 | 20 | 30; say 1     if 20 == any(10, 20, 30);
  63. 63. say 1     if 20 == none(1, 2, 3);
  64. 64. Перегрузка операторов и функций
  65. 65. Перегрузка операторов и функций (множественная диспетчеризация)
  66. 66. 1 + 2 1.1 + 2.2
  67. 67. multi sub     elections($candidate); multi sub     elections(@candidates);
  68. 68. multi infix:<+> ($a, $b) {    return $a ‐ $b; } say 10 + 20;     ‐10
  69. 69. multi postfix:<!> ($n) {    return [*] 1..$n; } say 2008!;
  70. 70. multi postfix:<!> ($n) {    return [*] 1..$n; } say 2008!;
  71. 71. Perl 6 в Perl 5
  72. 72. Perl 6 в Perl 5 Perl 5.10
  73. 73. use feature qw(     say     switch     state );
  74. 74. > perl5.10 ‐e    "use feature qw(say); say $$;" > perl5.10 ‐E "say $$;"
  75. 75. // defined‐or
  76. 76. my $a; my $b = $a // 2; say $b;           2
  77. 77. my $c = 0; my $d = $c // 3; say $d;           0 my $e = 0; my $f = $e || 4; say $f;           4
  78. 78. ~~
  79. 79. ~~Смарт-матчинг (оператор сопоставления)
  80. 80. $a ~~ $b == $b ~~ $a
  81. 81. my $b; $b ~~ undef !defined $b
  82. 82. my $c = 'abc'; $c ~~ 'abc' $c eq 'abc'
  83. 83. my $c = 'abc'; $c ~~ /b/ $c =~ /b/
  84. 84. my @a = (1..3); my @b = (1..3); @a ~~ @b 1 == 1 && 2 == 2 && 3 == 3
  85. 85. my @a = (1..3); my @b = (1..3); my @c = (3..5); @a ~~ @c 1 == 3 && 2 == 4 && 3 == 5
  86. 86. my @d = (123, 'abc'); my @e = (qr/d/, qr/w/); @d ~~ @e 123 ~~ /d/ && 'abc' ~~ /w/
  87. 87. my @f = ('a'..'f'); @f ~~ 'd' grep {$_ eq 'd'} @f
  88. 88. my @g = (1..10); @g ~~ 7 grep {$_ == 7} @g
  89. 89. my @g = (1..10); @g ~~ 7.0 grep {$_ == 7.0} @g
  90. 90. my @g = (1..10); @g ~~ '7.0' grep {$_ eq '7.0'} @g
  91. 91. my @g = (1..10); @g ~~ /^d$/ grep {$_ =~ /^d$/} @g
  92. 92. sub subA {return 2} sub subB {return 2} subA ~~ subB subA() == subB()
  93. 93. my %h = (a => 'alpha',          b => 'beta'); %h ~~ 'a' exists $h{'a'}
  94. 94. my %h = (a => 'alpha',          b => 'beta'); %h ~~ /[A‐F]/i grep {/[A‐F]/i} keys %h
  95. 95. my %h = (a => 'alpha',          b => 'beta'); my %hh = (b => 1, a => 2); %h ~~ %hh [sort keys %h] ~~ [sort keys %hh]
  96. 96. В печати
  97. 97. Июнь 2003
  98. 98. Июнь 2004
  99. 99. Июнь 2004 2005
  100. 100. 2005
  101. 101. 2007?
  102. 102. real.perl6.ru
  103. 103. int main() {     char* argv[] = {         "parrot",          getenv ("PATH_TRANSLATED"),         NULL     };     execvp("/parrot‐0.1.0/parrot", argv);     return 0; }
  104. 104. my @keys = (     'SERVER_NAME',     'REMOTE_ADDR',     'HTTP_USER_AGENT' ); my $key; foreach $key (@keys){    print1 "$key=%ENV{$key}<br />"; }
  105. 105. my @keys = (     'SERVER_NAME',     'REMOTE_ADDR',     'HTTP_USER_AGENT' ); my $key; foreach $key (@keys){    print1 "$key=%ENV{$key}<br />"; }
  106. 106. sub params2hash(     %params,     @params_key,     @params_value){     for 0 .. @params_key ‐> $c {         %params{@params_key[$c]} =             @params_value[$c];     } }
  107. 107. .include "counter.imc" open     P0, "counter.txt" readline S0, P0 set      I0, S0 inc      I0 set      I2, 0 seek     P0, I2, I2 print    P0, I0 close    P0
  108. 108. November
  109. 109. yapc.tv/2008/ye/lt/lt2-01-masak-vilkund-november
  110. 110. yapc.tv/2008/fe/irhd-november
  111. 111. November november-wiki.org november.perl6.ru
  112. 112. $ git clone    git://github.com/viklund/november.git
  113. 113. $ cd p6w $ perl Makefile.PL $ make
  114. 114. /software/parrot/parrot /software/ parrot/languages/perl6/perl6.pbc ‐‐ target=pir Impatience.pm  >  Impatience.pir /software/parrot/parrot /software/ parrot/languages/perl6/perl6.pbc ‐‐ target=pir HTML/Template.pm  > HTML/ Template.pir
  115. 115. /software/parrot/parrot /software/ parrot/languages/perl6/perl6.pbc ‐‐ target=pir Impatience.pm  >  Impatience.pir /software/parrot/parrot /software/ parrot/languages/perl6/perl6.pbc ‐‐ target=pir HTML/Template.pm  > HTML/ Template.pir
  116. 116. #!perl6 use v6; use CGI; use Wiki; my Wiki $wiki = Wiki.new; $wiki.init(); my $cgi = CGI.new; $cgi.init(); $wiki.handle_request($cgi);
  117. 117. Классы и роли
  118. 118. class Wiki does Session {     my $.template_path       is rw;     my $.userfile_path       is rw;     has Storage $.storage    is rw;     has CGI     $.cgi        is rw;     . . . }
  119. 119. method handle_request(CGI $cgi) {     $.cgi = $cgi;     my $action = $cgi.param<action> // 'view';     given $action {         when 'view' {              self.view_page(); return;         }         when 'edit' {             self.edit_page(); return;         }         when 'log_in' {             self.log_in(); return;         }     }     self.not_found(); }
  120. 120. has Storage $.storage is rw; class Storage {     . . . } class Storage::File is Storage {     . . . } $.storage = Storage::File.new(); $.storage.init();
  121. 121. my $input = $*IN.slurp(); self.parse_params(%params, $input);
  122. 122. Грамматика
  123. 123. if $par ~~  Text::Markup::Wiki::Minimal::Syntax::paragraph {     . . . } else {    $result = '<p>Could not parse paragraph.</p>'; }
  124. 124. grammar Text::Markup::Wiki::Minimal::Syntax {     token paragraph { ^ [<heading> || <parchunk>+] $ };     token heading { '==' <parchunk>+ '==' };     token parchunk { <twext> || <wikimark> || <metachar> ||              <malformed> };     token twext { [ <.alnum> || <.otherchar> || <.whitespace> ]           + };     token otherchar { <[ !..% (../ : ; ? @  ^..` {..~ ]> };     token whitespace { ' ' | n };     token wikimark { '[[' <twext> ']]' };     token metachar { '<' || '>' || '&' || ' };     token malformed { '[' || ']' } }
  125. 125. grammar  Text::Markup::Wiki::Minimal::Syntax { }
  126. 126. token paragraph {     ^ [<heading> || <parchunk>+] $ };
  127. 127. token heading {     '==' <parchunk>+ '==' };
  128. 128. Highload
  129. 129. Что такое нагрузка?
  130. 130. Что такое нагрузка? От 1 000 000 посетитлей?
  131. 131. Что такое нагрузка? Или от одного компилятора?
  132. 132. Highload++ в реализации
  133. 133. Perl 6 не один Pugs Rakudo SMOP KindaPerl6 Elf
  134. 134. Не только script.pl Исходник .pl Ассемблер .pir Байт-код .pbc
  135. 135. Веб-серверов много Apache CGI mod_perl Ваш любимый сервер
  136. 136. Сколько способов оптимизации? (МНОГО)
  137. 137. Компиляция в байт-код
  138. 138. Компиляция в байт-код programme.pl programme.pbc Компилятор Виртуальная машина
  139. 139. Компиляция в байт-код programme.pl programme.pbc Компилятор Виртуальная машина + JIT
  140. 140. Прекомпилированные модули use Module; Module.pir Module.pm
  141. 141. Parrot::Embed (Байткод, исполняемый в Perl 5)
  142. 142. mod_parrot (Аналог mod_perl, но для байткода)
  143. 143. Nginx / 0W / mod_proxy (Абсолютно стандартно)
  144. 144. Компиляция в байт-код Nginx / 0W / mod_proxy Parrot::Embed mod_parrot Прекомпилированные модули
  145. 145. ++Highload в дизайне
  146. 146. Lazy lists Директива async Распараллеленные гипероператоры
  147. 147. Многое реализовано в самой виртуальной машине
  148. 148. $ time pugs ‐e'say "HL++"' real   0m0.382s user   0m0.348s sys    0m0.031s Hello, World++ (Pugs)
  149. 149. $ time perl6 ‐e'say "HL++"' real   0m0.389s user   0m0.307s sys    0m0.061s Hello, World++ (Rakudo)
  150. 150. (Одинаково медленно)
  151. 151. $ time wget http://real.perl6.ru real   0m0.034s user   0m0.003s sys    0m0.001s Пример с байткодом (VPS Apache CGI)
  152. 152. $ time wget http://november.perl6.ru real   0m0.027s user   0m0.003s sys    0m0.001s Пример с кешем (VPS Apache CGI)
  153. 153. (Одинаково быстро)
  154. 154. Перспективы Улучшенный синтаксический разбор Новый JIT-компилятор Новый сборщик мусора
  155. 155. dev.perl.org/perl6
  156. 156. rakudo.org
  157. 157. perl6.ru
  158. 158. __END__ Андрей Шитов http://shitov.ru | andy@shitov.ru

×