Ленивые вычисления

Материал из Википедии — свободной энциклопедии
Строгие вычисления
Аппликативный порядок
Вызов по значению
(call-by-value)
Вызов по ссылке
(call-by-reference)
Вызов по адресу
(call-by-address)
Вызов по соиспользованию
(call-by-sharing)
Вызов по копированию — восстановлению
(call-by-copy-restore)
Нестрогие вычисления
Нормальный порядок
Вызов по имени
(call-by-name)
Вызов по необходимости
(call-by-need)
Ленивые вычисления (lazy evaluation)
Оптимистичные вычисления
Вызов по макрораскрытию
Недетерминированные стратегии
Полная β-редукция
Вызов по преднамеченности
(call-by-future)
Оптимистичные вычисления
Другие

Ленивые вычисления (

нестрогим вычислениям. Усовершенствованная модель ленивых вычислений — оптимистичные вычисления — переходит в разряд недетерминированных стратегий вычисления
.

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

Ленивые вычисления естественным образом легли на

электронно-вычислительных устройств
.

Некоторые языки программирования, реализующие ленивые вычисления:

  • Haskell — язык программирования, в котором наиболее полно реализованы отложенные вычисления, в частности, в языке нет оператора присваивания значения переменной, а только операцию определения функциональной зависимости; благодаря ленивым вычислениям в языке возможно оперирование бесконечными коллекциями. Строго говоря, Haskell — ленивый по умолчанию, он предоставляет как стандартные средства (seq, deepseq, строгое вычисление полей в алгебраических типах), так и языковые расширения (BangPatterns) для строгого вычисления.
  • Mathematica и Maxima допускают отложенные вычисления с помощью оператора определения «:=».
  • в Python, C#, Java 8 и ряде других языков ленивые вычисления реализованы с помощью функций-генераторов и ключевого слова yield.
  • в языках D и Scala имеется ключевое слово lazy.

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

отложенная инициализация», предписывающий переносить выполнение ресурсоёмких операций по созданию объектов или получения значения непосредственно перед использованием. Для ряда языков созданы библиотеки, обеспечивающие работу с ленивыми вычислениями, например, для JavaScript таковы Streams.js, linq.js, Immutable.js и node-lazy
.

Ссылки