Параллельные вычисления в perl 6

Post on 19-Jul-2015

68 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Perl 6для параллельных

вычислений

The Parallel Features of the Perl Six

Parallel Futuresof Perl 6

Предисловие

Интервью Pragmatic Perl в 2013–2015

Что, по-твоему, является наиболее важной особенностью языков будущего?

Q:

Я не знаюA:

Не знаю (2 ответа)

Нет хорошего ответаA:

Не знаю (2 ответа)

Похожий на натуральный язык

A:

Синтаксис (1/3)

Здоровый минимализмA:

Синтаксис (2/3)

РасширяемостьA:

Синтаксис (3/3)

Гибкий и надежный вывод типов

A:

Объектная система (1/3)

НадежностьA:

Объектная система (2/3)

Интроспекции самого языка

A:

Объектная система (3/3)

Поддержка JVMA:

Среда (1/4)

Работа в браузереA:

Среда (2/4)

Совместимость с другими языками

A:

Среда (3/4)

Возможность встраиваимости

A:

Среда (4/4)

СообществоA:

Гуманизм (1/8)

ЧеловечностьA:

Гуманизм (2/8)

Open sourceA:

Гуманизм (3/8)

ПрагматизмA:

Гуманизм (4/8)

Управляемость сознанием (sic!)

A:

Гуманизм (5/8)

Возможность просто объяснить задачу

A:

Гуманизм (6/8)

Легкость решения задач в предметной области

A:

Гуманизм (7/8)

НенавязчивостьA:

Гуманизм (8/8)

Ответ номер 1

Параллельность

ПараллелизмA:

Параллельность (1/12)

Работа с распределенными ресурсами

A:

Параллельность (2/12)

ПараллелизмA:

Параллельность (3/12)

Хорошая модель распараллеливания

A:

Параллельность (4/12)

Интуитивные корутины и поддержка многоядерности

A:

Параллельность (5/12)

ПараллелизмA:

Параллельность (6/12)

Безопасность параллельных операций

A:

Параллельность (7/12)

Встроенная многопоточность

A:

Параллельность (8/12)

Качественная абстракция над сложной многопоточностью

A:

Параллельность (9/12)

ПараллелизмA:

Параллельность (10/12)

Хороший параллелизмA:

Параллельность (11/12)

МногозадачностьA:

Параллельность (12/12)

Вернемся к Perl 6

Идея: прозрачность операций

Пользователь просто

пользуется

Компилятор делает всю работу

Все примеры на Rakudo Star

Все примеры на Rakudo Star под MoarVM

Два типа параллельных возможностей

1) неявные 2) явные

Операторы (кратко)

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

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

метаоператор

+оператор

+=метаоператор

>>+<<гипероператор

»+«гипероператор

>>+гипероператор

»+гипероператор

>>+>>гипероператор

<<+<<гипероператор

«+«гипероператор

<<+>>гипероператор

«+»гипероператор

<<<>>гипероператор

«<»гипероператор

@c = @a >>+<< @b

@c = @a >>+<< @b@c[0] = @a[0] + @b[0];

@c = @a >>+<< @b@c[0] = @a[0] + @b[0];@c[1] = @a[1] + @b[1];

@c = @a >>+<< @b@c[0] = @a[0] + @b[0];@c[1] = @a[1] + @b[1];@c[2] = @a[2] + @b[2];

@c = @a >>+>> 1

@c = @a >>+>> 1@c[0] = @a[0] + 1;

@c = @a >>+>> 1@c[0] = @a[0] + 1;@c[1] = @a[1] + 1;

@c = @a >>+>> 1@c[0] = @a[0] + 1;@c[1] = @a[1] + 1;@c[2] = @a[2] + 1;

2. Junctions

Или квантовые

суперпозиции

Несколько значений как одно

my $j = 1 | 2 | 3 | 5;

my $j = 1 | 2 | 3 | 5;

say 1 if 3 == $j;

my $j = 1 | 2 | 3 | 5;

say 1 if 3 == $j;

my $j = 1 | 2 | 3 | 5;

say 1 if 3 == $j;

my $j = 1 | 2 | 3 | 5;

say 1 if 3 == $j;

}

my $j = 1 | 2 | 3 | 5;

say 1 if 3 == $j;

}1

3.Feeds

my @a = 1..10;

my @a = 1..10;@a ==> grep {$_ mod 2};

my @a = 1..10;@a ==> grep {$_ mod 2};!

1 3 5 7 9

my @a = 1..10;@a ==> grep {$_ mod 2} ==> map {$_ ** 2};

my @a = 1..10;@a ==> grep {$_ mod 2} ==> map {$_ ** 2};!

1 9 25 49 81

4.Каналы

my $c = Channel.new;

my $c = Channel.new;$c.send(42);

my $c = Channel.new;$c.send(42);say $c.receive;!

42

my $ch = Channel.new;

my $ch = Channel.new;for <1 3 5 7 9> { $ch.send($_);}

my $ch = Channel.new;for <1 3 5 7 9> { $ch.send($_);}while $ch.poll -> $x { say $x;}

5.Промисы

my $p = Promise.new;

my $p = Promise.new;say $p.status;

Planned

my $p = Promise.new;$p.keep;

my $p = Promise.new;$p.keep;say $p.status;!

Kept

my $p = Promise.new;$p.break;

my $p = Promise.new;$p.break;say $p.status;!

Broken

Фабричные методы

start

my $p = start {42};

my $p = start {42}; say $p.WHAT;

(Promise)

my $p1 = start {sleep 2};

my $p1 = start {sleep 2};my $p2 = start {sleep 2};

my $p1 = start {sleep 2};say $p1.status;my $p2 = start {sleep 2};say $p2.status;

my $p1 = start {sleep 2};say $p1.status;my $p2 = start {sleep 2};say $p2.status;!

PlannedPlanned

my $p1 = start {sleep 2};my $p2 = start {sleep 2};sleep 3;

my $p1 = start {sleep 2};my $p2 = start {sleep 2};sleep 3;say $p1.status;say $p2.status;

my $p1 = start {sleep 2};my $p2 = start {sleep 2};sleep 3;say $p1.statussay $p2.statusKeptKept

start блок кода для отложенного исполнения

in

my $p = Promise.in(3);

my $p = Promise.in(3);!

for 1..5 { say "$_ {$p.status}"; sleep 1;}

my $p = Promise.in(3);!

for 1..5 { say "$_ {$p.status}"; sleep 1;}

1 Planned

1 Planned2 Planned

1 Planned2 Planned3 Planned

1 Planned2 Planned3 Planned4 Kept

1 Planned2 Planned3 Planned4 Kept5 Kept

Пример:Sleep Sort

!

for @*ARGS -> $a { !

!

!

!

}

!

for @*ARGS -> $a { !

!

!

!

}

!

for @*ARGS -> $a { @promises.push( Promise.in($a).then({ say $a; }) );}!

await(|@promises);

my @promises;for @*ARGS -> $a { @promises.push( Promise.in($a).then({ say $a; }) );}!

await(|@promises);

my @promises;for @*ARGS -> $a { @promises.push( Promise.in($a).then({ say $a; }) );}!

await(|@promises);

my @promises;for @*ARGS -> $a { @promises.push( Promise.in($a).then({ say $a; }) );}!

await(@promises);

$ ./sleep-sort.pl

$ ./sleep-sort.pl 3 1 2

$ ./sleep-sort.pl 3 1 21

$ ./sleep-sort.pl 3 1 212

$ ./sleep-sort.pl 3 1 2123

Домашнее задание:

каналы внутри промисов

Что еще:Schedulers

Что еще:Suppliers

Что еще:I/O и Suppliers

Что еще:Signals

Что еще:Threads

Что еще:Atomic

Что еще:Locks

Что еще:Semaphores

__END__

Андрей Шитов andy@shitov.ru май 2015

top related