ВУЗ:
Составители:
Рубрика:
- 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-атрибуты в этом режиме игно- рируются) до использования спецметодов (трассировка, профилировка и др.) для оптимизации при выполнении на многопроцессорной ЭВМ.
Страницы
- « первая
- ‹ предыдущая
- …
- 106
- 107
- 108
- 109
- 110
- …
- следующая ›
- последняя »