Параллельные вычисления в perl 6
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__
Андрей Шитов [email protected] май 2015