Параллельные вычисления. Баканов В.М. - 108 стр.

UptoLike

Составители: 

- 108 -
Важной особенностью Haskell является механизмленивых (отложенных)
вычислений’. В традиционных языках программирования (например, Fortran,
C/С++) вызов функции приводит к вычислению всех аргументов (‘вызов-по-
значению’); при этом если какой-либо аргумент не использовался в функции,
то результат вычислений пропадает, т.е. вычисления были произведены впус-
тую. Альтернативой вызова-по-значению
является вызов-по-необходимости
(этом случае аргумент вычисляется, только если он действительно необходим
для вычисления результата); понятный программисту примервыполнение
оператора конъюнкции
&&
из C/C++, который никогда не вычисляет значе-
ние второго аргумента, если первый аргумент сутьложь’. Языки, исполь-
зующие отложенные вычисления, называются нестрогими (примеры
Haskell, Gofer, Miranda); если функциональный язык не поддерживает отло-
женные вычисления, он является строгим (языки Scheme, Standard ML,
Caml, в таких языках порядок вычисления строго определен).
Одно из главенствующих понятий Т-системы – ‘
чистые функции (функ-
ции без побочных эффектов при вычислениях); чистая функция может быть
выполнена параллельно с основной программой. Чистыми (отсутствуют по-
бочные эффекты) обычно являются нестрогие языки.
В каждый момент времени выделяются готовые к вычислениюподвыра-
жения и распределяются по имеющимся процессорам, при этом за основу
берется граф,
узлы которого представляют выбранные функции, а дуги соот-
ветствуют отношениювыражение-подвыражение’.
Для использования возможностей функционального программирования в
традиционные языки вводится понятие неготового значения. В применении к
С это выражается введением дополнительного атрибута
tval
описания пере-
менных,
tval int j
определяет переменную, значение которой может быть це-
лым числом или неготовым (пока не посчитанным) значением, в описании
функции без побочных эффектов необходим атрибут
tfun
, выходного значе-
ния
tout
, глобальной ссылки на неготовую переменную -
tptr
(измененный
таким образом С++ получил название Т++, см. Приложение 3).
Т-система запускает чистые функции как ветви параллельной программы, а
неготовые переменные (НП) являются основным средством синхронизации
их выполнения. При чтении НП происходит блокировка процесса вычисле-
ния, выполнившего такое обращение, причем ожидание продлится до тех
пор, пока переменная не получит
готового значения (исключениеоперация
присваивания НП, при этом блокировка не возникает). При записи обычного
значения в НП она становится готовой для всех выражений, в которые она
входит; ранее заблокированные на ней процессы выходят из блокировки.
Т-система снабжена развитыми системами отладкиот начальной прогон-
ки программы на последовательной машине (
t
-атрибуты в этом режиме игно-
рируются) до использования спецметодов (трассировка, профилировка и др.)
для оптимизации при выполнении на многопроцессорной ЭВМ.
                                   - 108 -


   Важной особенностью Haskell является механизм ‘ленивых (отложенных)
вычислений’. В традиционных языках программирования (например, Fortran,
C/С++) вызов функции приводит к вычислению всех аргументов (‘вызов-по-
значению’); при этом если какой-либо аргумент не использовался в функции,
то результат вычислений пропадает, т.е. вычисления были произведены впус-
тую. Альтернативой вызова-по-значению является вызов-по-необходимости
(этом случае аргумент вычисляется, только если он действительно необходим
для вычисления результата); понятный программисту пример – выполнение
оператора конъюнкции && из C/C++, который никогда не вычисляет значе-
ние второго аргумента, если первый аргумент суть ‘ложь’. Языки, исполь-
зующие отложенные вычисления, называются нестрогими (примеры –
Haskell, Gofer, Miranda); если функциональный язык не поддерживает отло-
женные вычисления, он является строгим (языки Scheme, Standard ML,
Caml, в таких языках порядок вычисления строго определен).
   Одно из главенствующих понятий Т-системы – ‘чистые’ функции (функ-
ции без побочных эффектов при вычислениях); чистая функция может быть
выполнена параллельно с основной программой. Чистыми (отсутствуют по-
бочные эффекты) обычно являются нестрогие языки.
   В каждый момент времени выделяются готовые к вычислению ‘подвыра-
жения’ и распределяются по имеющимся процессорам, при этом за основу
берется граф, узлы которого представляют выбранные функции, а дуги соот-
ветствуют отношению ‘выражение-подвыражение’.
   Для использования возможностей функционального программирования в
традиционные языки вводится понятие неготового значения. В применении к
С это выражается введением дополнительного атрибута tval описания пере-
менных, tval int j определяет переменную, значение которой может быть це-
лым числом или неготовым (пока не посчитанным) значением, в описании
функции без побочных эффектов необходим атрибут tfun, выходного значе-
ния – tout, глобальной ссылки на неготовую переменную - tptr (измененный
таким образом С++ получил название Т++, см. Приложение 3).
   Т-система запускает чистые функции как ветви параллельной программы, а
неготовые переменные (НП) являются основным средством синхронизации
их выполнения. При чтении НП происходит блокировка процесса вычисле-
ния, выполнившего такое обращение, причем ожидание продлится до тех
пор, пока переменная не получит готового значения (исключение – операция
присваивания НП, при этом блокировка не возникает). При записи обычного
значения в НП она становится готовой для всех выражений, в которые она
входит; ранее заблокированные на ней процессы выходят из блокировки.
   Т-система снабжена развитыми системами отладки – от начальной прогон-
ки программы на последовательной машине (t-атрибуты в этом режиме игно-
рируются) до использования спецметодов (трассировка, профилировка и др.)
для оптимизации при выполнении на многопроцессорной ЭВМ.