Читайте также:
|
|
Сильные стороны
Привлекательная сторона вычислений без состояний — повышение надёжности кода за счет чёткой структуризации и отсутствия необходимости отслеживания побочных эффектов. Любая функция работает только с локальными данными и работает с ними всегда одинаково, независимо от того, где, как и при каких обстоятельствах она вызывается. Невозможность мутации данных при пользовании ими в разных местах программы исключает появление труднообнаруживаемых ошибок (таких, например, как случайное присваивание неверного значения глобальной переменной в императивной программе). Отсутствие состояний даёт возможность применять к функциональным программам достаточно сложные методы автоматической оптимизации, которые непригодны для программ с состояниями и побочными эффектами. Ещё одним преимуществом функциональных программ является то, что они предоставляют широчайшие возможности для автоматического распараллеливания вычислений. Поскольку отсутствие побочных эффектов гарантировано, в любом вызове функции всегда допустимо параллельное вычисление двух различных параметров — порядок их вычисления не может оказать влияния на результат вызова. Ещё одной, традиционно упоминаемой положительной особенностью функционального программирования является то, что оно позволяет описывать программу в декларативном стиле; программист может сосредоточиться на описании отношений, в которых результат вычислений находится с исходными данными. Последовательность операций, приводящая к вычислению результата, в явном виде не описывается, а получается автоматически.
Недостатки
Недостатки функционального программирования вытекают из тех же самых его особенностей. Отсутствие присваиваний и замена их на порождение новых данных приводят к необходимости постоянного выделения и автоматического освобождения памяти, поэтому в системе исполнения функциональной программы обязательным компонентом становится высокоэффективный сборщик мусора. Для эффективности сборки мусора необходимо отслеживать ссылки на данные, что также требует затрат времени и памяти. Отсутствие циклов для промышленных программ является очень серьёзным ограничением — далеко не все виды рекурсии могут быть автоматически преобразованы в цикл.
Для преодоления недостатков функциональных программ уже первые языки функционального программирования включали не только чисто функциональные средства, но и механизмы императивного программирования (присваивание, цикл, «неявный PROGN» были уже в LISPе). Использование таких средств позволяет решить некоторые практические проблемы, но это означает отход от идей (и преимуществ) функционального программирования и написание императивных программ на функциональных языках. Естественно, при этом теряется и декларативность функциональной программы — при описании функциональных зависимостей программист оказывается вынужден учитывать и задавать порядок исполнения программы.
Дата добавления: 2014-11-24; просмотров: 113 | Поможем написать вашу работу | Нарушение авторских прав |