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);

Источники[править]

  1. www.pekunov.byethost31.com/Progs.htm

Литература[править]

  1. Пекунов В. В. Язык программирования Planning C. Инструментальные средства. Новые подходы к обучению нейронных сетей. — LAP LAMBERT Academic Publishing, 2017. — 171 с. — ISBN 978-620-2-06539-9.
  2. Пекунов В. В. Процедуры с планированием повторного входа в языках высокого уровня при традиционном и параллельном программировании // Информационные технологии.- 2009. — № 8. — С.63-67.
 
Используемые
в разработке

Ада A+ APL Atlast Forth AWL Язык ассемблера ActionScript ABAP/4 AutoIt AWK BeanShell Бейсик Си Кобол C++ C# Clarion Clojure ColdFusion Common Lisp D dBase Delphi DuAL Eiffel Erlang Euphoria F# Форт Фортран Gambas Go Groovy HAL/S Haskell IBM PL/S Icon IridiumJava JavaScript Limbo Lua Модула-3 Object Pascal Objective-C OCaml Oz Parser Паскаль Компонентный Паскаль Perl Pixilang PHP PowerBASIC Python ПЛ/1 Пролог Qi Ruby Scala Scheme Seed7 Smalltalk SQL PL/SQL Tcl TouchDesigner Vala Visual Basic (.NET) • X-Robot

Академические

Agda Clean Curry Idris Лого ML Оберон Planning C РЕФАЛ Симула

IEC 61131-3

Instruction List ST FBD Ladder Diagram (LD) • SFC

Прочие

Алгол Алгол 68 Модула-2 Миранда Hope НОРМИН Санда

Эзотерические

HQ9+/HQ9++ • INTERCAL Brainfuck Befunge Malbolge Piet Spoon Unlambda Whitespace FALSE LOLCODE Глагол

Визуальные

G (LabVIEW) • Microsoft VPL Sikuli VisSim Алиса ДРАКОН Скретч

Прочее

ДинамическиеКомпилируемыеС ключевыми словами не на английском языке С C-style синтаксисом СинтаксисYoptaScript

Категория Языки программирования