Языки параллельного программирования
Большинство компьютерных архитектур и языков программирования ориентированы на последовательное выполнение операторов программы. В настоящее время, однако же, существуют программно-аппаратные комплексы, позволяющие организовать параллельное выполнение различных частей одного и того же вычислительного процесса. Для программирования таких систем необходима специальная поддержка со стороны средств программирования, в частности, языков программирования. Некоторые языки общего назначения содержат в себе элементы поддержки параллелизма, однако же программирование истинно параллельных систем требует подчас специальных приемов.
Язык Оccam
Язык Оccam был создан в 1982 году и предназначен для программирования транспьютеров — многопроцессорных систем распределенной обработки данных. Он описывает взаимодействие параллельных процессов в виде каналов — способов передачи информации от одного процесса к другому. Отметим особенность синтаксиса языка Щccam — в нем последовательный и параллельный порядки выполнение операторов равноправны, и их необходимо явно указывать ключевыми словами PAR и SEQ.
Модель параллельных вычислений Linda
В 1985 году была предложена модель параллельных вычислений Linda. Основной ее задачей является организация взаимодействия между параллельно выполняющимися процессами. Это достигается за счет использования глобальной кортежной области (tuple space). Процесс может поместить туда кортеж с данными (то есть совокупность нескольких, возможно разнородных, данных), а другой процесс может ожидать появления в кортежной области некоторого кортежа и, после его появления, прочитать кортеж с возможным последующим его удалением. Заметим, что процесс может, например, поместить кортеж в область и завершиться, а другой процесс может через некоторое время воспользоваться этим кортежем. Таким образом обеспечивается возможность асинхронного взаимодействия. Очевидно, что при помощи такой модели может быть сэмулировано и синхронное взаимодействие. Linda — это модель параллельных вычислений, она может быть добавлена в любой язык программирования. Существуют достаточно эффективные реализации Linda, обходящие проблему существования глобальной кортежной области с потенциально неограниченным объемом памяти.
Неимперативные языки
Все языки, о которых шла речь ранее, имеют одно общее свойство: они императивны. Это означает, что программы на них, в конечном итоге, представляют собой пошаговое описание решения той или иной задачи. Можно попытаться описывать лишь постановку проблемы, а решать задачу поручить компилятору. Существует два основных подхода, развивающие эту идею: функциональное и логическое программирование.
Функциональные языки
Основная идея, лежащая в основе функционального программирования, — это представление программы в виде математических функций (т.е. функций, значение которых определяется лишь их аргументами, а не контекстом выполнения). Оператор присваивания в таких языках не используется (или, как минимум, его использование не поощряется). Императивные возможности, как правило, имеются, но их применение обставлено серьезными ограничениями. Существуют языки с ленивой и с энергичной семантикой. Различие заключается, грубо говоря, в том, что в языках с энергичной семантикой вычисления производятся в том же месте, где они описаны, а в случае ленивой семантики вычисление производится только тогда, когда оно действительно необходимо. Первые языки имеют более эффективную реализацию, в то время как вторые — лучшую семантику.
Из языков с энергичной семантикой упомянем ML и два его современных диалекта — Standard ML (SML) и CaML. Последний имеет объектно-ориентированного потомка — Objective CaML (O’CaML).
Среди языков с ленивой семантикой наиболее распространены два: Haskell и его более простой диалект Clean.
Языки логического программирования
Программы на языках логического программирования выражены как формулы математической логики, а компилятор пытается получить следствия из них.
Родоначальником большинства языков логического программирования является язык Prolog (1971). У него есть ряд потомков — Parlog (1983, ориентирован на параллельные вычисления), Delta Prolog и др. Логическое программирование, как и функциональное, — это отдельная область программирования, и за более подробными сведениями мы отсылаем читателя к специальной литературе.
Основные определения
Программаэто упорядоченный список команд, необходимых для решения некоторой задачи.
Для создания программ используют те или иные системы программирования.
Системой программированияэто совокупность языка программирования и виртуальной машины, обеспечивающей выполнение на реальной машине программ, составленных на этом языке.
Языком программированияназывают систему обозначений, служащую в целях точного описания алгоритмов для ЭВМ или по крайней мере достаточную для автоматического нахождения такого алгоритма. Эти языки являются искусственными языками со строго определенным синтаксисом.
Виртуальная машинаэто программный комплекс, эмулирующий работу реальной машины с определенным входным языком на ЭВМ с другим, машинным языком, а иными словами, реализующий входной язык программирования.
Такая техника реализации языка программирования позволяет сделать последний удобным для использования человеком. Виртуальная машина содержит транслятор и/или интерпретатор и может включать библиотеки стандартных подпрограмм, отладчик, компоновщик и другие сервисные средства.