Migrating from Perl 5 to 6

Preview:

DESCRIPTION

 

Citation preview

s/5/6/

Perl 6

Perl 6Дизайн

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

Apocalypses, Exegeses, Synopses

STD.pm

Pugs

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

cd pugs

perl Makefile.PL

make

make test

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

cd pugs

perl Makefile.PL

make

make test

install GHC

. . .

. . .

Rakudo

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

                        trunk parrot

perl Configure.pl

make

cd languages/perl6/

make perl6

./perl6

perl6.exe

Программа

Компилятор

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

Байт-код

Программа

Компилятор

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

Байт-код

BasicForthJakoLispm4OokPerl 6Perl 5PythonRubySchemeTcl

BasicForthJakoLispm4OokPerl 6Perl 5PythonRubySchemeTcl

байт-код

BasicForthJakoLispm4OokPerl 6Perl 5PythonRubySchemeTcl

LOL-код

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

print "Hello, World!";

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

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

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

$str.chars;

$str.bytes;

$str.glyphs;

my $lang = "Perl 5";

$lang++;

say $lang;

my @arr = (0..5);

say $arr[2];

my @arr = (0..5);

say @arr[2];

my @arr = (0..5);

say @arr[2, 3];

my @arr = (0..5);

say @arr.elems;

my %hash = (

    city => "Rostov‐on‐Don",

    year => 2008

);

say $hash{city};

my %hash = (

    city => "Rostov‐on‐Don",

    year => 2008

);

say %hash<city>;

my %hash = 

    city => "Rostov‐on‐Don",

    year => 2008

;

say %hash<city year>;

my %hash = 

    city => "Rostov‐on‐Don",

    year => 2008

;

say %hash.kv;

if ($latitude > 47.2 &&

    $latitude < 47.3) {

    print "Rostov‐on‐Don\n";

}

if 47.2 < $latitude < 47.3 {

    say "Rostov‐on‐Don";

}

Контексты

my @array = (5..10);

say ~@array;

   5 6 7 8 9 10

my @array = (5..10);

say +@array;

   6

my @array = (5..10);

say ~ hash @array;

                   5  6                   7  8                   9  10

my @array = (5..10);

say ?+@array;

print

     "Ростов"

   . "‐на‐"

   . "Дону";

print

     "Ростов"

   ~ "‐на‐"

   ~ "Дону";

Функции

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

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

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

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

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

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

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

say choose(    @SkyExpressPrices,    @AeroflotPrices);

Циклы

for @list {    say $_;}

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

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

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

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

   sleep 1;

};

say "cunt";

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

my @Flight = (...);

my @Food = (...);

my @Flight = (...);

my @Food = (...);

my @FullPrice = 

   @Flight >>+<< @Food;

my @Flight = (...);

my @Food = (...);

my @FullPrice = 

   @Flight >>+<< @Food;

@FullPrice >>+=<< $Fuel;

my @Flight = (...);

my @Food = (...);

my @FullPrice = 

   @Flight »+« @Food;

@FullPrice »+=« $Fuel;

Объединения

Объединения

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

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

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

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

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

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

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

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

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

1 + 2

1.1 + 2.2

multi sub

    elections($candidate);

multi sub

    elections(@candidates);

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

say 10 + 20;     ‐10

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

say 2008!;

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

say 2008!;

Perl 6 в Perl 5

Perl 6 в Perl 5

Perl 5.10

use feature qw(    say    switch    state);

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

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

//

defined‐or

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

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

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

~~

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

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

$a ~~ $b==

$b ~~ $a

my $b;

$b ~~ undef

!defined $b

my $c = 'abc';

$c ~~ 'abc'

$c eq 'abc'

my $c = 'abc';

$c ~~ /b/

$c =~ /b/

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

@a ~~ @b

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

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

@a ~~ @c

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

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

@d ~~ @e

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

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

@f ~~ 'd'

grep {$_ eq 'd'} @f

my @g = (1..10);

@g ~~ 7

grep {$_ == 7} @g

my @g = (1..10);

@g ~~ 7.0

grep {$_ == 7.0} @g

my @g = (1..10);

@g ~~ '7.0'

grep {$_ eq '7.0'} @g

my @g = (1..10);

@g ~~ /^\d$/

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

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

subA ~~ subB

subA() == subB()

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

%h ~~ 'a'

exists $h{'a'}

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

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

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

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

%h ~~ %hh

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

В печати

Июнь 2003

Июнь 2004

Июнь 2004 2005

2005

2007?

real.perl6.ru

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

        "parrot", 

        getenv ("PATH_TRANSLATED"),

        NULL

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

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

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

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

.include "counter.imc"

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

November

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

yapc.tv/2008/fe/irhd-november

November

november-wiki.orgnovember.perl6.ru

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

$ cd p6w$ perl Makefile.PL

$ make

/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

/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

#!perl6

use v6;

use CGI;

use Wiki;

my Wiki $wiki = Wiki.new;

$wiki.init();

my $cgi = CGI.new;

$cgi.init();

$wiki.handle_request($cgi);

Классы и роли

class Wiki does Session {

    my $.template_path       is rw;

    my $.userfile_path       is rw;

    has Storage $.storage    is rw;

    has CGI     $.cgi        is rw;

    . . .

}

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

has Storage $.storage is rw;

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

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

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

self.parse_params(%params, $input);

Грамматика

if $par ~~ 

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

    . . .

}

else {

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

}

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

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

}

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

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

};

Highload

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

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

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

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

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

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

Perl 6 не один

Pugs

Rakudo

SMOPKindaPerl6

Elf

Не только script.pl

Исходник .pl

Ассемблер .pir

Байт-код .pbc

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

Apache CGI

mod_perl

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

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

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

(МНОГО)

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

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

programme.pl

programme.pbc

Компилятор

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

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

programme.pl

programme.pbc

Компилятор

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

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

use Module;

Module.pir Module.pm

Parrot::Embed

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

mod_parrot

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

Nginx / 0W / mod_proxy

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

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

Nginx / 0W / mod_proxy

Parrot::Embed

mod_parrot

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

++Highloadв дизайне

Lazy lists

Директива async

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

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

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

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

Hello, World++ (Pugs)

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

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

Hello, World++ (Rakudo)

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

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

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

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

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

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

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

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

Перспективы

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

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

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

dev.perl.org/perl6

rakudo.org

perl6.ru

__END__

Андрей Шитов

http://shitov.ru | andy@shitov.ru

Recommended