Planning C
Planning C — язык классического и параллельного программирования высокого уровня [1], основанный на широком применении процедур с планированием повторного входа [2]. Является надмножеством C++, в связи с чем может быть отнесен к универсальным языкам. Ориентирован на применение на широком классе многопроцессорных/многоядерных систем, имеет поддержку для программирования в общей и разделенной памяти (SMP-системы, кластеры, гибридные системы), программирования векторной (многоядерные видеокарты и центральные процессоры с векторными командами) и конвейерной обработки, программирования с применением транзакционной памяти.
Основные особенности[править]
Ключевым элементом программирования в Planning C является процедура с планированием повторного входа [2]. Исполнение такой процедуры может осуществляться как в последовательном, так и в параллельном режиме "портфеля задач" (task pool). С помощью нескольких синтаксических конструкций группа процедур может быть запущена на параллельное исполнение в векторном или конвейерном режиме. Объединение нескольких процедур в вычислительную топологию с указанием разрешенных направлений передачи данных обеспечивает возможность написания параллельных программ с произвольными протоколами обмена данными. Описание топологии производится или в формате перечня цепочек процедур, для которых разрешены прямые или обратные пересылки данных, либо в высокоуровневом формате, возможности которого определяются алгеброй процедур с планированием повторного входа [1]. Так, например, алгебраическая запись A*B*C+C*B*A определяет вычислительную топологию "труба", в которой между парами узлов A и B, B и C имеют место как прямые, так и обратные связи передачи данных.
Язык имеет библиотеку стандартных средств синхронизации процессов и обмена данными: каналы, семафоры, барьеры, критические секции, блоки виртуальной общей памяти. Поддерживается редукция (на уровне параметров процедур при их параллельном исполнении в режиме "портфеля задач").
Язык имеет поддержку порождающего программирования в виде дедуктивных макромодулей, основанных на GNU Prolog-предикатах. Такой подход позволяет, в частности, поддерживать достаточно мощный логический аппарат порождения кода. В частности, на дедуктивных макромодулях реализованы конструкции, строящие низкоуровневые описания вычислительных топологий по их эквивалентам, записанным в терминах алгебры процедур с планированием повторного входа.
Алгоритмическая полнота[править]
- Есть два пути доказательства алгоритмической полноты:
1. Теоретической базой процедуры с планированием повторного входа являются расширенные машины Тьюринга (РМТ, реализуемые в виде предельных реальных параллельных объектно-событийных моделей). Поскольку процедура с планированием повторного входа описывается РМТ, которая является расширением классической машины Тьюринга, способной реализовать произвольный алгоритм, то любая процедура с планированием повторного входа в Planning C способна реализовать любой алгоритм.
Дополнительно легко показать [1], что язык Planning C способен реализовать любой алгоритм, используя лишь функции (процедуры с результатом) с планированием повторного входа и возможности сокращенного исполнения логических выражений. Так, например, ветвление может быть записано в формате выражения:
<условие> && функция_прямой_ветви || функция_обратной_ветви;
где функция_прямой_ветви всегда возвращает истинное значение. Цикл while с телом procA может быть представлен кодом:
reenterable bool procA(<параметры A>) { A; return true; } reenterable while_loop(<параметры>) { <условие> && plan_last(<параметры>) && procA(<параметры A>); }
2. Planning C является надмножеством C++, который является алгоритмически полным языком. Следовательно, Planning C также является алгоритмически полным языком.
Инструментальные средства[править]
- В настоящее время известен единственный рабочий транслятор Planning C [1]. Дополнительно существует транслятор MPI-программ на Planning C [1].
Примеры программы[править]
Параллельный поиск максимального элемента в дереве реализуется программой:
reenterable _TreeMax(TreeNode * Cur, reduction(max) int &Max) { if (Cur==Root) plan_group_parallelize; if (Cur->Left) plan_last(Cur->Left,Max); if (Cur->Right) plan_last(Cur->Right,Max); Max = Cur->Data; }
Дедуктивный макромодуль-генератор типа "лист k-ичного дерева"
#def_module(struct) tree_node(ID, Type, Name, Arity) { @goal:-brackets_off. @goal:-write(ID). { @goal:-write(Type),write(' '),write(Name),write(';'). @refs(2):-write('struct '),write(ID),write(' * Left;'), write('struct '),write(ID),write(' * Right;'), !. @refs(N):-write('struct '),write(ID),write(' * Children['),write(N),write('];'),!. @goal:-refs(Arity). } }; tree_node('node2', 'int', 'Data', 2); tree_node('node4', 'int', 'Data', 4);
Источники[править]
- ↑ www.pekunov.byethost31.com/Progs.htm
Литература[править]
- Пекунов В. В. Язык программирования Planning C. Инструментальные средства. Новые подходы к обучению нейронных сетей. — LAP LAMBERT Academic Publishing, 2017. — 171 с. — ISBN 978-620-2-06539-9.
- Пекунов В. В. Процедуры с планированием повторного входа в языках высокого уровня при традиционном и параллельном программировании // Информационные технологии.- 2009. — № 8. — С.63-67.