Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры [4747 вопросов].doc
Скачиваний:
83
Добавлен:
15.06.2014
Размер:
407.04 Кб
Скачать

39 Языки параллельного программирования. Способы реализации.

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

40 Императивные языки программирования. Способы реализации.

Императивные языки обычно предусматривают лишь ограниченную поддержку функционального программирования. Не­достаток использования императивного языка для функционального программирования в том, что функции в императивных языках имеют ограничения, наложенные на типы значений, которые они возвращают. В таких языках, как FORTRAN и Pascal, функ­ции возвращают только переменные скалярного типа. Еще более важным является то, что они не могут возвращать функции. Такие ограничения сужают круг функциональных форм, поддерживаемых императивным языком. Другая серьезная проблема, относящаяся к функциям в императивных языках, заключается в том, что функции могут иметь по­бочные эффекты.

41 Функциональные языки программирования. Способы реализации.

Математическая функция — это отображение (mapping) элементов одного множест­ва, называемого областью определения (domain set), в другое множество, называемое множеством значений (range set). В определении функции явно или неявно указывают­ся множество определения и множество значений вместе с самим отображением. Ото­бражение описывается выражением или, в некоторых случаях, таблицей. Функции часто применяются к отдельному элементу множества определения.

Простые функции

Определения функций часто записываются в виде имени функции, за которым следует список параметров в скобках и выражение, задающее отображение. Например, cube(х)=х*х*х, где x - действительное число.

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

Функции более высокого порядка, или функциональные формы (functional forms), отличаются тем, что они либо получают функции в виде параметров, либо некая функция является результатом их работы, либо имеет место и то, и другое. Наиболее распростра­ненным видом функциональных форм является композиция функций (function composition), параметрами которой служат две функции. Результат композиции функ­ций - это функция, значения которой являются, в свою очередь, результатом примене­ния первой функции-параметра к результату работы второй функции-параметра.

Конструкция (construction) — это функциональная форма, получающая в качестве параметра список функций.

Функция применить ко всем (apply-to-all) — это функциональная форма, имеющая в качестве параметра одну функцию.

Основы функциональных языков программирования

Функциональные языки программирования разрабатывались с целью как можно более точной имитации математических функций. В результате возник подход к решению задач, в корне отличающийся от методов, применяемых императивными языками. В императив­ном языке вычисляется некое выражение, и результат помещается в ячейку памяти, пред­ставленную переменной в программе. Необходимость уделять внимание ячейкам памяти приводит к методологии программирования относительно низкого уровня, близкого к ма­шинным командам. Программа на языке ассемблера часто к тому же должна хранить ре­зультаты промежуточных вычислений. Например, чтобы вычислить выражение (х+у)/(а-b), значение выражения (х+у) должно быть вычислено первым. Это значение должно быть помещено в память, пока вычисляется значение выражения (а-b). Чтобы облегчить эту задачу, размещение промежуточных результатов вычисления выражений в языках высокого уровня обрабатывается компилятором. Размещение промежуточных результа­тов в этих языках все еще необходимо, но детали скрыты от программиста.

Чисто функциональный язык программирования не использует ни переменных, ни опе­раторов присваивания. Это освобождает программиста от заботы о ячейках памяти компь­ютера, на котором будет выполняться программа. Отсутствие переменных делает невоз­можным использование итеративных конструкций, поскольку они управляются переменными. Повторение должно выполняться только с помощью рекурсии. Программы пред­ставляют собой определения функций и спецификаций применения функций, а выполнение заключается в вычислении применений функции. В отсутствие переменных выполнение программы, написанной на чисто функциональном языке, не имеет структуры в смысле операционной или денотационной семантики. Выполнение функции при одних и тех же параметрах всегда приводит к одному и тому же результату. Это явление называется про­зрачностью ссылок (referential transparency). Она делает семантику чисто функциональ­ных языков программирования намного более простой, чем семантика императивных язы­ков и функциональных языков, обладающих императивными свойствами.

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

Сравнение функциональных и императивных языков

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

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

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

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