Perl 6

для параллельных
вычислений
The Parallel

Features

of the Perl Six
Parallel Futures

of 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;	
!
Planned	
Planned
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.status	
say $p2.status	
Kept	
Kept
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 Planned	
2 Planned
1 Planned	
2 Planned	
3 Planned
1 Planned	
2 Planned	
3 Planned	
4 Kept
1 Planned	
2 Planned	
3 Planned	
4 Kept	
5 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 2	
1
$ ./sleep-sort.pl 3 1 2	
1	
2
$ ./sleep-sort.pl 3 1 2	
1	
2	
3
Домашнее
задание:

каналы внутри
промисов
Что еще:

Schedulers
Что еще:

Suppliers
Что еще:

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

Signals
Что еще:

Threads
Что еще:

Atomic
Что еще:

Locks
Что еще:

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

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