Пифагор | |
---|---|
Семантика | функциональный, потоковый |
Класс языка | язык программирования |
Появился в | 1995 |
Автор | Легалов Александр Иванович [1] |
Система типов | динамическая |
Испытал влияние | Haskell, Sisal |
Пифагор — функционально-потоковый язык программирования, предназначенный для разработки переносимых (архитектурно-независимых) параллельных программ.
Язык «Пифагор» разработан в Красноярском Государственном Техническом Университете в 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»: результат >> return
или return << результат
Возвращаемый результат может быть любым допустимым значением, полученным в ходе вычислений. Возврат результата может осуществляться до завершения выполнения всех операций в теле функции, которая продолжает существования до завершения всех внутренних операций.
Блок — это объединение элементов внутри тела функции, служит для логического соединения группы операторов выполняющих законченное действие, а также для локализации обозначений. Он начинается с ключевого слова block, за которым следует тело блока, аналогичное телу функции. Отличие тела блока заключается в том, что выход из него осуществляется по обозначению результата зарезервированным идентификатором break, с которым связывается значение, возвращаемое из блока:результат >> break
или 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] функционально-потоковых программ, при этом в ряде работ применяется язык «Пифагор».
Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".
Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.
Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .