Введение в теорию программирования. Функциональный подход


Оптимизация вычислений и абстрактные машины - часть 4


Однако существуют и другие стратегии вычислений. Рассмотрим более подробно возможные подходы к означиванию переменных.

При вычислении с вызовом по значению (call-by-value) все выражения должны быть означены до вычисления операции аппликации.

При вычислении с вызовом по имени (call-by-name) до вычисления операции аппликации необходима подстановка термов вместо всех вхождений формальных параметров перед означиванием. Именно эта стратегия лежит в основе "ленивых" (lazy), "отложенных" (delayed) или "замороженных" (frozen) вычислений, которые принципиально необходимы для обработки потенциально бесконечных структур данных.

Наконец, при вычислении с вызовом по необходимости (call-by-need) ранее вычисленные значения аргументов сохраняются в памяти компьютера только в том случае, если необходимо их повторное использование.

Чтобы устранить сложности с поддержкой категориальной абстрактной машиной "ленивых" вычислений, пересмотрим цикл работы КАМ, расширив пространство состояний дополнительными инструкциями для "замораживания" (freeze) и "размораживания" (unfreeze), которые представим в форме таблицы 12.3.

Таблица 12.3. Дополнительные инструкции КАМ для реализации "ленивых" вычислений

Старое состояние КАМНовое состояние КАМТермКодСтекТермКодСтек

s

{freeze c}.C1

S

C.s

C1

S

C.s

unfreeze.C

S

s

C

S

s

unfreeze.C

S

s

C

S




Начало  Назад  



Книжный магазин