Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
35
Добавлен:
28.06.2014
Размер:
1.19 Mб
Скачать

Национальный Исследовательский Университет

МОСКОВСКИЙ ЭНЕРГЕТИЧЕСКИЙ ИНСТИТУТ

Институт автоматики и вычислительной техники

Кафедра прикладной математики

Курсовая работа

Сравнение f# иFptl

Курс «Параллельные системы и параллельные вычисления»

Выполнил

студент 5 курса группы А-13-08

Захаров Антон

Преподаватель

Кутепов Виталий Павлович

Введение

В настоящее время многоядерные и многопроцессорные компьютеры получили повсеместное распространение, поэтому для ресурсоёмких задач необходимым требованием является максимально возможное распределение вычислений между ядрами.

Функциональные языки предлагают более высокий уровень абстракции в сравнении с императивными и зачастую наиболее пригодны для решения задач математического характера. Параллельное и функциональное программирование требуют во многом схожих навыков, не вполне типичных для наиболее популярной модели последовательного императивного программирования.

Формально, функциональное программирование – раздел дискретной математики и парадигма программирования, в которой процесс вычисления трактуется как вычисление значений функций в математическом понимании последних (в отличие от функций как подпрограмм в процедурном программировании). Под функциональным языком программирования понимается язык, который позволяет разрабатывать программы в соответствии с функциональной парадигмой программирования.

Основные преимущества:

  • краткость и простота

  • строгая типизация

  • модульность

  • функции – объекты

  • чистота

  • отложенные (ленивые) вычисления, механизм мемоизации (запоминание промежуточных результатов вычисления)

Важным преимуществом чистых функциональных языков является параллелизм. Поскольку все функции для вычислений используют только свои параметры, можно организовать вычисление независимых функций в произвольном порядке или параллельно, на результат вычислений это не повлияет. Параллелизм может быть организован не только на уровне компилятора языка, но и на уровне архитектуры технических средств. Существуют экспериментальные компьютеры, основанные на подобных архитектурах, например Lisp-машина.

Во многих функциональных языках (Haskell, F#) существует набор примитивов, позволяющих писать параллельные программы. Впрочем, необходимость явного определения параллелизма в программном коде зачастую нарушает стройную структуру функциональной программы и заставляет программиста вручную заботиться о верном использовании параллелизма в разрабатываемой программе.

В данной работе был написан набор программ на двух функциональных языках: F# иFPTL.

F# – это функциональный язык программирования из семейства языков .NET Framework, поддерживающий функциональное программирование в дополнение к императивному (процедурному) и объектно-ориентированному программированию. Структура F# во многом схожа со структурой OCaml с той лишь разницей, что F# реализован поверх библиотек и среды исполнения .NET. Язык был разработан Доном Саймом в Microsoft Research в Кембридже, в настоящее время его разработку ведет Microsoft Developer Division. F# достаточно тесно интегрируется со средой разработки Visual Studio и включён в поставку Visual Studio 2010; разработаны также компиляторы для Mac и Linux.

Код на языке F# является безопасным в отношении типов, часто бывает более компактным, чем аналогичный код C#, за счёт вывода типов.

Такие возможности, как обобщённое программирование и функции высших порядков позволяют писать абстрактные обобщённые алгоритмы, которые управляют параметризованными структурами данных (например, массивами, списками, графами, деревьями).

FPTL(Functional Programming Typified Language) – строго типизированный язык композиционного функционального параллельного программирования.

В FPTL введены четыре простые бинарные композиции функций, которые позволяют легко отразить композиционное представление функции и, что более важно в данном контексте, явно определить параллелизм. Функции в FPTL рассматриваются, как (m,n)-арные соответствия между кортежами данных, где- длина кортежа на входе функции,- на выходе. Функции арности (0, 1) рассматриваются в FPTL как константы. Дляилиравным 0, имеются два кортежа нулевой длины, обозначаемые, со свойствами, где– произвольный кортеж. Кортеж данных в языке представляется в виде последовательной записи его элементов.

В FPTL в отличие от общепринятой формы задания функций с явным указанием ее аргументов (так называемая форма задания общего значения функции) строго различается собственно функция, как отображение одного множества в другое, и ее аппликация к конкретным данным. Роль переменных в задании функций в FPTL выполняют функции выбора необходимого элемента из кортежа данных. Формально функция выбора аргумента, обозначаемая (в языке – просто [i]), при применении к кортежу данных длины, выбирает егоi-й элемент,. Длявыбираемое значение есть. Функции в FPTL являются в общем случае частичными, причем неопределенное значение функции может быть выражено либо как неограниченный процесс вычисления ее значения, либо как специальное вычисленное неопределенное значение, обозначаемое, со свойствамидля любого кортежа.

Формально функции определяются как системы функциональных уравнений , где– функциональные термы, построенные из заданных (базисных) функций и функциональных переменныхпутем применения четырех операций композиции функций:. Для функций и функциональных переменных задана их арность, а для базисных функций также их тип.

Пусть заданные функции,– определяемая новая функция,– обозначение кортежей. Семантика операций композиции определяется следующим образом:

1. Последовательная композиция ():

– кортеж данных, каждый элемент которого имеет тип. Типы данных кортежа значений функциии типы данных кортежа аргументов функцииодинаковы.

Заметим, что в FPTLиспользуется «префиксная» форма записи операции последовательной композиции, определяющая последовательный характер вычисления значений функцийии эквивалентная последовательному характеру задания следования операторов при выполнении последовательных программ.

2. Операция конкатенации кортежей значений функций ():

(конкатенация кортежей значений двух функций).

3. Операция условной композиции ():

f(α) =f2(α), если значениеf1(α) определено (отлично оти не равно булевской константе «ложь»), в противном случае считается неопределенным.

4. Операция объединения (графиков) ортогональных функций ():