Upload
andysh
View
901
Download
2
Embed Size (px)
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;
"Ростов"
. "‐на‐"
. "Дону";
"Ростов"
~ "‐на‐"
~ "Дону";
Функции
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