Общее представление о функциональном программировании и его применении
Идея функционального программирования опирается на интуитивное понятие о функциях как о достаточно общем механизме
представления и анализа решений сложных задач. Механизм функций основательно изучен
математиками, и это позволяет программистам наследовать выверенные построения,
обладающие предельно высокой моделирующей силой
[1].
Систематическое применение функционального программирования впервые достаточно ярко было
продемонстрировано Джоном Маккарти и его учениками в методах реализации языка Лисп и программирования на этом языке. Наиболее очевидные из этих методов были успешно
ассимилированы другими языками и системами программирования. Обычно про функциональное
программирование вспоминают при смене технологий, когда возрастает роль аналитики и
исследовательских задач. В настоящее время часто употребляют термин "функциональность"
при сравнительной характеристике информационных систем, что, видимо, свидетельствует
о проявлении новой метрики, заслуживающей отдельного рассмотрения
[2].
Функциональный стиль объединяет разные подходы к определению процессов вычисления на основе достаточно строгих абстрактных понятий
и методов символьной обработки данных.
Связь функционального программирования с математическими основами позволяет в тексте
программы наследовать доказательность построения результата, если она достигнута,
причем с использованием разных методов абстрагирования решаемой задачи
[2]
[3].
Сложность решения задач с помощью функциональных определений преодолевается чисто алгебраически:
нацеленностью на формализацию основного множества объектов и определения полной семантической системы операций над ними.
Это позволяет представлять классы задач и их решений строгими формулами, для наглядности
упрощаемыми введением дополнительных функциональных символов. При необходимости такие символы
вносятся в опpеделение алгебраической системы, что приводит к ее расширению.
Вводятся новые функции, подобные леммам и другим вспомогательным построениям в математике.
Активно используется рекурсия и символьные обозначения
как данных, так и действий и любых формул, удобных при определении функций.
Формально такое расширение является консервативным (новый символ определен с
помощью старых), оно гарантирует сохранение всех функциональных свойств исходной
системы. Минимальный набор обозначений, к которым можно свести все правильные, т.е.
вычислимые формулы системы, играет роль базиса системы, реализация которого является
минимальной версией всей системы.
Следует отметить, что при формальной эквивалентности разные расширения одного
и того же базиса могут поддерживать различные применения и восприниматься как
совершенно разные системы. Программисты вынуждены строить расширения, которые
выглядят неконсервативными, так как целью их работы является именно изменение
ряда характеристик функционирования исходной системы (компьютера, системы
программирования и т.п.) с частичным сохранением заданных функциональных свойств.
Большинство систем программирования разработано с ориентацией на расширение,
уточнение и настройку пользователем реализованных программных средств, свойства
которых определены и обеспечены в процессе разработки. Такое разделение труда
естественно при ориентации на решение задач с исчерпанным или четко ограниченным
исследовательским компонентом. Но исходная разработка любой системы включает фазу
формирования базиса и наполнения ядра системы в терминах, которые не сводятся к ее
языку. Это позволяет независимо рассматривать один еще более общий уровень — аппликативные системы, в которые можно
включать любые символы с определенным смыслом.
Поведение такой системы будет обусловлено набором включенных в нее символов.
Основная трудность перехода к функциональному программированию — соблазн легкого
пути, т.е. стремление быстро смоделировать привычные средства и методы программирования.
Более надежный путь — исследовать функциональное программирование как незнакомый мир.
Идеи функционального программирования легче воспринять как самостоятельную теорию или
интеллектуальную игру, которая новыми путями непременно приведет к знакомым и интересным
задачам, но обеспечит преимущество — изящные решения и глубину понимания.
Джон Маккарти предложил проект языка Лисп (LISP - LISt Processing) в качестве
средства исследования границ применимости компьютеров, в частности, методом решения
задач искусственного интеллекта.
Идеи этого языка вызвали не утихающие по сей день
дискуссии о приоритетах в программировании и сущности программирования. Лисп послужил
эффективным инструментом экспериментальной поддержки теории программирования и развития
сферы его применения. Рост интереса к Лиспу коррелирует с улучшением элементной базы,
повышением эксплуатационных характеристик оборудования и появлением новых сфер применения ИТ.
Существует и активно применяется более трехсот диалектов Лиспа и родственных ему языков:
Interlisp, muLisp, Clisp, Scheme, ML, Cmucl, Logo, Hope, Sisal, Haskell, Miranda и др.