Пифагор (язык программирования)
Пифагор — функционально-потоковый язык программирования, предназначенный для разработки переносимых (архитектурно-независимых) параллельных программ. ИсторияЯзык «Пифагор» разработан в Красноярском Государственном Техническом Университете в 1995 году, в настоящее время разработка ведется в Институте Космических и Информационных Технологий Сибирского Федерального Университета. Название является сокращением фразы «Параллельный Информационно-Функциональный АлГОРитмический» или «Parallel Informational and Functional AlGORithmic». ОсобенностиРазработка программы на Пифагоре ведется для машин с бесконечными ресурсами, это упрощает процесс программирования, так как нет необходимости учитывать ресурсные ограничения (максимальный параллелизм). Ресурсные ограничения учитываются на этапе выполнения, осуществляется сжатие параллелизма. Эта особенность обеспечивает архитектурную независимость разрабатываемых программ. СинтаксисРазделителиК символам-разделителям на Пифагоре относятся пробелы, символы табуляции и переноса строки. В качестве разделителя может применяться любое количество таких символов. КомментарииВ Пифагоре поддерживаются однострочные и многострочные комментарии. Однострочные комментарии начинаются парой символов «//» и заканчиваются символом перевода строки. Многострочные комментарии начинаются парой символов «/*» и заканчиваются парой «*/». Вложенность многострочных комментариев не допускается. // однострочный комментарий
/* многострочный
комментарий */
ИдентификаторыИдентификаторы используются для обозначения имен констант, переменных, функций и типов данных. Идентификатор может состоять из произвольного количества символов латинского алфавита, цифр и символа подчеркивания. Первым символом идентификатора не может быть цифра. Зарезервированные словаДля ключевых слов встроенных типов данных, функций и предопределенных обозначений используются зарезервированные слова. Далее приводится их общий список: block break bool char const
dup datalist delaylist else error
false float func funcdef int
nil parlist prefunc return signal
true type typedef
Зарезервированные слова пишутся строчными латинскими буквами и они не могут являться идентификаторами. ОбозначенияПоскольку данный язык построен на основе принципа единственного присваивания, здесь отсутствует понятие переменной. Вместо этого вводится понятие обозначения как идентификатора, поставленного в соответствие с каким-либо программным фрагментом. В пределах некоторой области видимости использование идентификатора в качестве обозначения должно быть уникальным. Обозначение получает тип и величину сопоставленного элемента и может использоваться для дальнейшей передачи этих параметров в любую точку программы, обеспечивая тем самым копирование объекта, полученного в ходе вычислений. В языке определены два способа задания обозначений:
Элементом является любой из объектов языка, выражение, блок или ранее введенное обозначение. Имя ранее обозначенного элемента задается на идентификатором. ОбъектыК объектам языка относятся конструкции, рассматриваемые при выполнении операций интерпретации как единое целое. Каждый объект характеризуется двойкой: <тип, значение>. Существует неупорядоченное множество типов предопределенных объектов, задаваемых соответствующими именами. Предопределенные объекты делятся на атомарные и составные. Типы атомарных объектов (атомов) и области их допустимых значений определяются аксиоматически. Составные объекты являются комбинацией атомарных и уже существующих составных объектов. Они конструируются по заданным правилам. К составным объектам относятся описания функций и списки. КонстантыАтомы данного вида обеспечивают задание различных величин. Величина принадлежит области её допустимых значений, которая, в зависимости от типа, может задаваться одним из следующих способов: диапазоном, диапазоном и точностью, перечислением элементов упорядоченного множества, перечислением элементов неупорядоченного множества (если нет необходимости устанавливать между элементами отношение порядка), функцией. В настоящее время в языке реализованы следующие виды констант: целые, действительные, булевские, символы, константы ошибок, специальные знаки. Тип константы в программе определяется её внешним видом, задаваемым синтаксическими правилами. ФункцииФункция — составной объект, конструируемый специальным образом. Она задается определением, начинающимся с ключевого слова funcdef. Состоит из заголовка и тела. В заголовке указывается идентификатор аргумента, обеспечивающего передачу в тело функции необходимых данных. В теле описывается алгоритм обработки аргумента. Доступ к исходным данным осуществляется только через аргумент, тип которого и значение в данной версии языка могут быть произвольными. Тело функции состоит из элементов, заключенных в фигурные скобки и разделяемых между собой символом «;». В ходе выполнения функции обычно формируется результат, который возвращается после обозначения его зарезервированным идентификатором «return»: Возвращаемый результат может быть любым допустимым значением, полученным в ходе вычислений. Возврат результата может осуществляться до завершения выполнения всех операций в теле функции, которая продолжает существования до завершения всех внутренних операций. БлокиБлок — это объединение элементов внутри тела функции, служит для логического соединения группы операторов выполняющих законченное действие, а также для локализации обозначений. Он начинается с ключевого слова block, за которым следует тело блока, аналогичное телу функции. Отличие тела блока заключается в том, что выход из него осуществляется по обозначению результата зарезервированным идентификатором break, с которым связывается значение, возвращаемое из блока: Примеры программРасчет факториала числаmath.fact << funcdef X
{
fl << ((X,1):[<=,>]):?;
act << (X,
{ (X, (X,1):-:math.fact ):* } );
return << act:fl:.;
}
Получение модуля числаmath.abs << funcdef X
{
val << ({(0,X):-},X);
kluch << ((X,0):[<,>=]):?;
return << val:kluch:.;
}
Сортировка методом Хоараsort.hoar.mind << funcdef Y
{
X << Y:2;
cind << Y:1;
fl << ( (X:|,cind):[=,>] ):?;
act << ( cind,
{
block
{
ncind << ((cind,1):+,X):sort.hoar.mind;
fl2 << ( (X:cind, X:ncind ):[>,<=]):?;
act2 << (ncind,cind);
break << act2:fl2:.;
}
}
);
return << act:fl:.;
}
sort.hoar.getmind << funcdef X
{
minind << sort.hoar.mind^(1,X);
return << minind;
}
sort.hoar.getsort << funcdef X
{
fl << ( (X:|,1):[=,>] ):?;
act << (X,
{
block
{
gm << X:sort.hoar.getmind;
mgm << (0,gm):-;
minel << X:gm;
tail << X:mgm;
ktail << tail:sort.hoar.getsort;
break << (minel,ktail:[]);
}
}
);
return << act:fl:.;
}
ПрименениеДанный язык имеет на данный момент теоретическую значимость, и в перспективе планируется применение его для разработки параллельных структур в смежных научных областях. Для данного языка разработаны транслятор[2], интерпретатор[3] и генератор управляющего графа[4]. В настоящее время ведутся работы в области верификации[5] функционально-потоковых программ, при этом в ряде работ применяется язык «Пифагор». Примечания
Литература
Ссылки
|
Portal di Ensiklopedia Dunia