Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Функциональным языкам присущи энергичный и ленивый виды вычислений

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

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

Ссылки на некоторую величину эквивалентны самой величине, и возможность ссылаться на некоторое выражение из другой части программы не влияет на значение этого выражения.

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

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

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

 

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

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

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

Ленивое вычисление – стратегия планирования, при которой вычисления не выполняются до тех пор, пока не возникнет необходимость в их результатах.

Энергичное вычисление – стратегия, при которой вычисления выполняются, как только появляется возможность их выполнить. Принцип энергичного вычисления можно сформулировать следующим тезисом: «на каждом шаге вычисляется все, что может быть вычислено». Не важно, пригодится ли в конечном случае полученный результат. Таким образом, всегда существует вероятность выполнения лишних вычислений.

Принцип ленивого вычисления: «не вычислять ничего, что не требуется в данный момент». Можно провести некоторую аналогию энергичного вычисления в функциональных языках с механизмом вызова по значению в императивных языках, а ленивое вычисление с механизмом вызова по необходимости. Однако между ними не существует тождественного равенства, и точное соотношение между этими терминами будет ясно, после изучения гл. 9.

Если функциональный язык не поддерживает отложенные вычисления, то он называется строгим (strict) языком программирования, в отличие от нестрогого (lazy) языка, с ленивой стратегией вычисления.


<== предыдущая лекция | следующая лекция ==>
Рекурсивные функции и лямбда-исчисление А.Черча | Краткость и простота
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 351; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.015 сек.