Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции ФП.doc
Скачиваний:
9
Добавлен:
02.05.2015
Размер:
52.22 Кб
Скачать

Схемы редукции и механизмы вызова

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

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

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

В контексте формальных языков можно говорить о двух видах вычисления – энергичномиленивом.

Принцип энергичного вычисления – «делай все, что можешь». Другими словами, не надо заботиться о том, пригодиться ли в конечном итоге полученный результат.

Принцип ленивого вычисления – «не делай ничего, пока этого не потребуется».

Пусть имеется выражение вида

(x. Е1) Е2

Мы знаем, что один способ упрощения его заключается в вычислении аргумента Е2в первую очередь и выполнении затем-редукции, подставляющей значениеЕ2вместохвЕ1. Этот способ соответствует АПР и эквивалентен вызову по значению в традиционных языках программирования. В формальных языках программирования вызов по значению известен как энергичное вычисление и которое в-исчислении определяется следующим образом:

Энергичное вычисление=АПР, приводящий выражение к СЗНФ.

Согласно второму способу упрощения выражения, выражение Е2подставим вместохвЕ1, что соответствует НПР. В-исчислении, где отсутствует понятие разделения, такая подстановка является чисто текстовой. Она поэтому соответствует понятиювызова по текстовой замене. При этом, как мы знаем, может возникнуть проблема конфликта имен. Используя-преобразование или приводя выражение к СЗНФ, то тогда этот вызов соответствует по имени. При этом мы не можем избежать повторного вычисления аргументов.

Если мы реализуем НПР и поддерживаем разделение, тогда механизм редукции соответствует вызову по необходимости.

Вызов по необходимости можно охарактеризовать как НПР, приводящий выражение к СЗНФ вместе с разделением выражений аргументов.

И в контексте формальных языков вызов по необходимости называется ленивым вычислением.

Ленивое вычисление=НПР, приводящий выражение к СЗНФ + разделение.

6