160
s/5/6/

Migrating from Perl 5 to 6

  • Upload
    andysh

  • View
    901

  • Download
    2

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Migrating from Perl 5 to 6

s/5/6/

Page 2: Migrating from Perl 5 to 6

Perl 6

Page 3: Migrating from Perl 5 to 6

Perl 6Дизайн

Page 4: Migrating from Perl 5 to 6

Perl 6Дизайн Реализация

Page 5: Migrating from Perl 5 to 6

Apocalypses, Exegeses, Synopses

Page 6: Migrating from Perl 5 to 6

STD.pm

Page 7: Migrating from Perl 5 to 6

Pugs

Page 8: Migrating from Perl 5 to 6

svn co http://svn.pugscode.org/pugs

cd pugs

perl Makefile.PL

make

make test

Page 9: Migrating from Perl 5 to 6

svn co http://svn.pugscode.org/pugs

cd pugs

perl Makefile.PL

make

make test

install GHC

. . .

. . .

Page 10: Migrating from Perl 5 to 6

Rakudo

Page 11: Migrating from Perl 5 to 6

svn co https://svn.perl.org/parrot/

                        trunk parrot

perl Configure.pl

make

cd languages/perl6/

make perl6

Page 12: Migrating from Perl 5 to 6

./perl6

perl6.exe

Page 13: Migrating from Perl 5 to 6

Программа

Компилятор

Виртуальная машина

Байт-код

Page 14: Migrating from Perl 5 to 6

Программа

Компилятор

Виртуальная машина

Байт-код

Page 15: Migrating from Perl 5 to 6

BasicForthJakoLispm4OokPerl 6Perl 5PythonRubySchemeTcl

Page 16: Migrating from Perl 5 to 6

BasicForthJakoLispm4OokPerl 6Perl 5PythonRubySchemeTcl

байт-код

Page 17: Migrating from Perl 5 to 6

BasicForthJakoLispm4OokPerl 6Perl 5PythonRubySchemeTcl

LOL-код

Page 18: Migrating from Perl 5 to 6

Хаффманизизация

Page 19: Migrating from Perl 5 to 6

print "Hello, World!";

Page 20: Migrating from Perl 5 to 6

say "は、ラクダの方法";

Page 21: Migrating from Perl 5 to 6

"は、ラクダの方法".say;

Page 22: Migrating from Perl 5 to 6

my $ναριαβλε =   "は、ラクダの方法";

Page 23: Migrating from Perl 5 to 6

$str.chars;

$str.bytes;

$str.glyphs;

Page 24: Migrating from Perl 5 to 6

my $lang = "Perl 5";

$lang++;

say $lang;

Page 25: Migrating from Perl 5 to 6

my @arr = (0..5);

say $arr[2];

Page 26: Migrating from Perl 5 to 6

my @arr = (0..5);

say @arr[2];

Page 27: Migrating from Perl 5 to 6

my @arr = (0..5);

say @arr[2, 3];

Page 28: Migrating from Perl 5 to 6

my @arr = (0..5);

say @arr.elems;

Page 29: Migrating from Perl 5 to 6

my %hash = (

    city => "Rostov‐on‐Don",

    year => 2008

);

say $hash{city};

Page 30: Migrating from Perl 5 to 6

my %hash = (

    city => "Rostov‐on‐Don",

    year => 2008

);

say %hash<city>;

Page 31: Migrating from Perl 5 to 6

my %hash = 

    city => "Rostov‐on‐Don",

    year => 2008

;

say %hash<city year>;

Page 32: Migrating from Perl 5 to 6

my %hash = 

    city => "Rostov‐on‐Don",

    year => 2008

;

say %hash.kv;

Page 33: Migrating from Perl 5 to 6

if ($latitude > 47.2 &&

    $latitude < 47.3) {

    print "Rostov‐on‐Don\n";

}

Page 34: Migrating from Perl 5 to 6

if 47.2 < $latitude < 47.3 {

    say "Rostov‐on‐Don";

}

Page 35: Migrating from Perl 5 to 6

Контексты

Page 36: Migrating from Perl 5 to 6

my @array = (5..10);

say ~@array;

   5 6 7 8 9 10

Page 37: Migrating from Perl 5 to 6

my @array = (5..10);

say +@array;

   6

Page 38: Migrating from Perl 5 to 6

my @array = (5..10);

say ~ hash @array;

                   5  6                   7  8                   9  10

Page 39: Migrating from Perl 5 to 6

my @array = (5..10);

say ?+@array;

Page 40: Migrating from Perl 5 to 6

print

     "Ростов"

   . "‐на‐"

   . "Дону";

Page 41: Migrating from Perl 5 to 6

print

     "Ростов"

   ~ "‐на‐"

   ~ "Дону";

Page 42: Migrating from Perl 5 to 6

Функции

Page 43: Migrating from Perl 5 to 6

sub flight($from, $to) {   say "$from ‐‐> $to";}

flight("Москва",        "Ростов‐на‐Дону");

Page 44: Migrating from Perl 5 to 6

sub flight($from, $to) {   say "$from ‐‐> $to";}

flight "Москва",        "Ростов‐на‐Дону";

Page 45: Migrating from Perl 5 to 6

sub flight($from, $to) {   say "$from ‐‐> $to";}

flight   from => "Москва",    to   => "Ростов‐на‐Дону";

Page 46: Migrating from Perl 5 to 6

sub choose(@a, @b) {   return      any(@a) < all(@b) ??      1 !! 2;}

say choose(    @SkyExpressPrices,    @AeroflotPrices);

Page 47: Migrating from Perl 5 to 6

Циклы

Page 48: Migrating from Perl 5 to 6

for @list {    say $_;}

Page 49: Migrating from Perl 5 to 6

for @list ‐> $x {    say $x;}

Page 50: Migrating from Perl 5 to 6

for @list ‐> $x, $y {    say $x + $y;}

Page 51: Migrating from Perl 5 to 6

for    @list,    sub($x, $y) {       . . .    }

Page 52: Migrating from Perl 5 to 6

loop(my $t = 300; $t; $t‐‐) {

   sleep 1;

};

say "cunt";

Page 53: Migrating from Perl 5 to 6

Гипероператоры

Page 54: Migrating from Perl 5 to 6

my @Flight = (...);

my @Food = (...);

Page 55: Migrating from Perl 5 to 6

my @Flight = (...);

my @Food = (...);

my @FullPrice = 

   @Flight >>+<< @Food;

Page 56: Migrating from Perl 5 to 6

my @Flight = (...);

my @Food = (...);

my @FullPrice = 

   @Flight >>+<< @Food;

@FullPrice >>+=<< $Fuel;

Page 57: Migrating from Perl 5 to 6

my @Flight = (...);

my @Food = (...);

my @FullPrice = 

   @Flight »+« @Food;

@FullPrice »+=« $Fuel;

Page 58: Migrating from Perl 5 to 6

Объединения

Page 59: Migrating from Perl 5 to 6

Объединения

(квантовые суперпозиции)

Page 60: Migrating from Perl 5 to 6

sub choose(@a, @b) {   return      any(@a) < all(@b) ??      1 !! 2;}

Page 61: Migrating from Perl 5 to 6

say 1     if 20 == 10 | 20 | 30;

Page 62: Migrating from Perl 5 to 6

say 1     if 20 == 10 | 20 | 30;

say 1    if 20 == any(10, 20, 30);

Page 63: Migrating from Perl 5 to 6

say 1    if 20 == none(1, 2, 3);

Page 64: Migrating from Perl 5 to 6

Перегрузка операторов и функций

Page 65: Migrating from Perl 5 to 6

Перегрузка операторов и функций

(множественная диспетчеризация)

Page 66: Migrating from Perl 5 to 6

1 + 2

1.1 + 2.2

Page 67: Migrating from Perl 5 to 6

multi sub

    elections($candidate);

multi sub

    elections(@candidates);

Page 68: Migrating from Perl 5 to 6

multi infix:<+> ($a, $b) {   return $a ‐ $b;}

say 10 + 20;     ‐10

Page 69: Migrating from Perl 5 to 6

multi postfix:<!> ($n) {   return [*] 1..$n;}

say 2008!;

Page 70: Migrating from Perl 5 to 6

multi postfix:<!> ($n) {   return [*] 1..$n;}

say 2008!;

Page 71: Migrating from Perl 5 to 6

Perl 6 в Perl 5

Page 72: Migrating from Perl 5 to 6

Perl 6 в Perl 5

Perl 5.10

Page 73: Migrating from Perl 5 to 6

use feature qw(    say    switch    state);

Page 74: Migrating from Perl 5 to 6

> perl5.10 ‐e \  "use feature qw(say); say $$;"

> perl5.10 ‐E "say $$;"

Page 75: Migrating from Perl 5 to 6

//

defined‐or

Page 76: Migrating from Perl 5 to 6

my $a;my $b = $a // 2;say $b;           2

Page 77: Migrating from Perl 5 to 6

my $c = 0;my $d = $c // 3;say $d;           0

my $e = 0;my $f = $e || 4;say $f;           4

Page 78: Migrating from Perl 5 to 6

~~

Page 79: Migrating from Perl 5 to 6

~~Смарт-матчинг

(оператор сопоставления)

Page 80: Migrating from Perl 5 to 6

$a ~~ $b==

$b ~~ $a

Page 81: Migrating from Perl 5 to 6

my $b;

$b ~~ undef

!defined $b

Page 82: Migrating from Perl 5 to 6

my $c = 'abc';

$c ~~ 'abc'

$c eq 'abc'

Page 83: Migrating from Perl 5 to 6

my $c = 'abc';

$c ~~ /b/

$c =~ /b/

Page 84: Migrating from Perl 5 to 6

my @a = (1..3);my @b = (1..3);

@a ~~ @b

1 == 1 && 2 == 2 && 3 == 3

Page 85: Migrating from Perl 5 to 6

my @a = (1..3);my @b = (1..3);my @c = (3..5);

@a ~~ @c

1 == 3 && 2 == 4 && 3 == 5

Page 86: Migrating from Perl 5 to 6

my @d = (123, 'abc');my @e = (qr/\d/, qr/\w/);

@d ~~ @e

123 ~~ /\d/ &&'abc' ~~ /\w/

Page 87: Migrating from Perl 5 to 6

my @f = ('a'..'f');

@f ~~ 'd'

grep {$_ eq 'd'} @f

Page 88: Migrating from Perl 5 to 6

my @g = (1..10);

@g ~~ 7

grep {$_ == 7} @g

Page 89: Migrating from Perl 5 to 6

my @g = (1..10);

@g ~~ 7.0

grep {$_ == 7.0} @g

Page 90: Migrating from Perl 5 to 6

my @g = (1..10);

@g ~~ '7.0'

grep {$_ eq '7.0'} @g

Page 91: Migrating from Perl 5 to 6

my @g = (1..10);

@g ~~ /^\d$/

grep {$_ =~ /^\d$/} @g

Page 92: Migrating from Perl 5 to 6

sub subA {return 2}sub subB {return 2}

subA ~~ subB

subA() == subB()

Page 93: Migrating from Perl 5 to 6

my %h = (a => 'alpha',         b => 'beta');

%h ~~ 'a'

exists $h{'a'}

Page 94: Migrating from Perl 5 to 6

my %h = (a => 'alpha',         b => 'beta');

%h ~~ /[A‐F]/i

grep {/[A‐F]/i} keys %h

Page 95: Migrating from Perl 5 to 6

my %h = (a => 'alpha',         b => 'beta');my %hh = (b => 1, a => 2);

%h ~~ %hh

[sort keys %h] ~~[sort keys %hh]

Page 96: Migrating from Perl 5 to 6

В печати

Page 97: Migrating from Perl 5 to 6

Июнь 2003

Page 98: Migrating from Perl 5 to 6

Июнь 2004

Page 99: Migrating from Perl 5 to 6

Июнь 2004 2005

Page 100: Migrating from Perl 5 to 6

2005

Page 101: Migrating from Perl 5 to 6

2007?

Page 102: Migrating from Perl 5 to 6
Page 103: Migrating from Perl 5 to 6
Page 104: Migrating from Perl 5 to 6

real.perl6.ru

Page 105: Migrating from Perl 5 to 6

int main() {    char* argv[] = {

        "parrot", 

        getenv ("PATH_TRANSLATED"),

        NULL

    };    execvp("/parrot‐0.1.0/parrot", argv);    return 0;}

Page 106: Migrating from Perl 5 to 6

my @keys = (    'SERVER_NAME',    'REMOTE_ADDR',    'HTTP_USER_AGENT');my $key;foreach $key (@keys){   print1 "$key=%ENV{$key}<br />";}

Page 107: Migrating from Perl 5 to 6

my @keys = (    'SERVER_NAME',    'REMOTE_ADDR',    'HTTP_USER_AGENT');my $key;foreach $key (@keys){   print1 "$key=%ENV{$key}<br />";}

Page 108: Migrating from Perl 5 to 6

sub params2hash(    %params,    @params_key,    @params_value){    for 0 .. @params_key ‐> $c {        %params{@params_key[$c]} =            @params_value[$c];    }}

Page 109: Migrating from Perl 5 to 6

.include "counter.imc"

open     P0, "counter.txt"readline S0, P0set      I0, S0inc      I0set      I2, 0seek     P0, I2, I2print    P0, I0close    P0

Page 110: Migrating from Perl 5 to 6

November

Page 111: Migrating from Perl 5 to 6

yapc.tv/2008/ye/lt/lt2-01-masak-vilkund-november

Page 112: Migrating from Perl 5 to 6

yapc.tv/2008/fe/irhd-november

Page 113: Migrating from Perl 5 to 6

November

november-wiki.orgnovember.perl6.ru

Page 114: Migrating from Perl 5 to 6

$ git clone \  git://github.com/viklund/november.git

Page 115: Migrating from Perl 5 to 6

$ cd p6w$ perl Makefile.PL

$ make

Page 116: Migrating from Perl 5 to 6

/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

Page 117: Migrating from Perl 5 to 6

/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

Page 118: Migrating from Perl 5 to 6

#!perl6

use v6;

use CGI;

use Wiki;

my Wiki $wiki = Wiki.new;

$wiki.init();

my $cgi = CGI.new;

$cgi.init();

$wiki.handle_request($cgi);

Page 119: Migrating from Perl 5 to 6

Классы и роли

Page 120: Migrating from Perl 5 to 6

class Wiki does Session {

    my $.template_path       is rw;

    my $.userfile_path       is rw;

    has Storage $.storage    is rw;

    has CGI     $.cgi        is rw;

    . . .

}

Page 121: Migrating from Perl 5 to 6

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();}

Page 122: Migrating from Perl 5 to 6

has Storage $.storage is rw;

class Storage {    . . .}class Storage::File is Storage {    . . .}

$.storage = Storage::File.new();$.storage.init();

Page 123: Migrating from Perl 5 to 6

my $input = $*IN.slurp();

self.parse_params(%params, $input);

Page 124: Migrating from Perl 5 to 6

Грамматика

Page 125: Migrating from Perl 5 to 6

if $par ~~ 

Text::Markup::Wiki::Minimal::Syntax::paragraph {

    . . .

}

else {

   $result = '<p>Could not parse paragraph.</p>';

}

Page 126: Migrating from Perl 5 to 6

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 { '[' || ']' }}

Page 127: Migrating from Perl 5 to 6

grammar Text::Markup::Wiki::Minimal::Syntax {

}

Page 128: Migrating from Perl 5 to 6

token paragraph {    ^ [<heading> || <parchunk>+] $};

Page 129: Migrating from Perl 5 to 6

token heading {    '==' <parchunk>+ '=='

};

Page 130: Migrating from Perl 5 to 6

Highload

Page 131: Migrating from Perl 5 to 6

Что такое нагрузка?

Page 132: Migrating from Perl 5 to 6

Что такое нагрузка?

От 1 000 000посетитлей?

Page 133: Migrating from Perl 5 to 6

Что такое нагрузка?

Или от одногокомпилятора?

Page 134: Migrating from Perl 5 to 6

Highload++в реализации

Page 135: Migrating from Perl 5 to 6

Perl 6 не один

Pugs

Rakudo

SMOPKindaPerl6

Elf

Page 136: Migrating from Perl 5 to 6

Не только script.pl

Исходник .pl

Ассемблер .pir

Байт-код .pbc

Page 137: Migrating from Perl 5 to 6

Веб-серверов много

Apache CGI

mod_perl

Ваш любимый сервер

Page 138: Migrating from Perl 5 to 6

Сколькоспособов

оптимизации?

(МНОГО)

Page 139: Migrating from Perl 5 to 6

Компиляция в байт-код

Page 140: Migrating from Perl 5 to 6

Компиляция в байт-код

programme.pl

programme.pbc

Компилятор

Виртуальная машина

Page 141: Migrating from Perl 5 to 6

Компиляция в байт-код

programme.pl

programme.pbc

Компилятор

Виртуальная машина + JIT

Page 142: Migrating from Perl 5 to 6

Прекомпилированные модули

use Module;

Module.pir Module.pm

Page 143: Migrating from Perl 5 to 6

Parrot::Embed

(Байткод, исполняемый в Perl 5)

Page 144: Migrating from Perl 5 to 6

mod_parrot

(Аналог mod_perl, но для байткода)

Page 145: Migrating from Perl 5 to 6

Nginx / 0W / mod_proxy

(Абсолютно стандартно)

Page 146: Migrating from Perl 5 to 6

Компиляция в байт-код

Nginx / 0W / mod_proxy

Parrot::Embed

mod_parrot

Прекомпилированные модули

Page 147: Migrating from Perl 5 to 6

++Highloadв дизайне

Page 148: Migrating from Perl 5 to 6

Lazy lists

Директива async

Распараллеленные гипероператоры

Page 149: Migrating from Perl 5 to 6

Многое реализованов самой виртуальной машине

Page 150: Migrating from Perl 5 to 6

$ time pugs ‐e'say "HL++"'

real   0m0.382suser   0m0.348ssys    0m0.031s

Hello, World++ (Pugs)

Page 151: Migrating from Perl 5 to 6

$ time perl6 ‐e'say "HL++"'

real   0m0.389suser   0m0.307ssys    0m0.061s

Hello, World++ (Rakudo)

Page 152: Migrating from Perl 5 to 6

(Одинаково медленно)

Page 153: Migrating from Perl 5 to 6

$ time wget http://real.perl6.ru

real   0m0.034suser   0m0.003ssys    0m0.001s

Пример с байткодом (VPS Apache CGI)

Page 154: Migrating from Perl 5 to 6

$ time wget http://november.perl6.ru

real   0m0.027suser   0m0.003ssys    0m0.001s

Пример с кешем (VPS Apache CGI)

Page 155: Migrating from Perl 5 to 6

(Одинаково быстро)

Page 156: Migrating from Perl 5 to 6

Перспективы

Улучшенный синтаксический разбор

Новый JIT-компилятор

Новый сборщик мусора

Page 157: Migrating from Perl 5 to 6

dev.perl.org/perl6

Page 158: Migrating from Perl 5 to 6

rakudo.org

Page 159: Migrating from Perl 5 to 6

perl6.ru