5.3 ЗАДАЧИ ФУНКЦИОНАЛЬНОГО ПРОГРАММИРОВАНИЯ (Лебедев Иван)
Идея функционального программирования опирается на интуитивное
понятие о функциях как
о достаточно общем механизме представления и анализа решений сложных задач.
Механизм функций основательно
изучен математиками, и это позволяет программистам наследовать выверенные
построения, обладающие предельно высокой моделирующей силой. Систематическое
применение функционального программирования впервые достаточно ярко было
продемонстрировано Джоном Маккарти и его учениками в методах реализации языка Лисп и программирования на
этом языке. Наиболее очевидные из этих методов были успешно ассимилированы
другими языками и системами программирования. Обычно про
функциональное программирование вспоминают
при смене технологий, когда возрастает роль аналитики и исследовательских
задач. В настоящее время часто употребляют термин "функциональность" при сравнительной характеристике
информационных систем, что, видимо, свидетельствует о проявлении новой метрики,
заслуживающей отдельного рассмотрения.
Функциональный стиль объединяет разные подходы к определению процессов вычисления на основе достаточно
строгих абстрактных понятий и методов символьной обработки данных. Связь функционального
программирования с математическими основами позволяет в тексте программы
наследовать доказательность построения результата, если она достигнута, причем
с использованием разных методов абстрагирования решаемой задачи.
Сложность решения задач с помощью функциональных определений
преодолевается чисто алгебраически: нацеленностью на формализацию основного множества объектов
и определения полной семантической системы операций над ними. Это позволяет
представлять классы задач и их решений строгими формулами, для наглядности
упрощаемыми введением дополнительных функциональных символов. При необходимости
такие символы вносятся в опpеделение алгебраической системы,
что приводит к ее расширению. Вводятся новые функции, подобные леммам и
другим вспомогательным построениям в математике.
Активно используется рекурсия и
символьные обозначения как данных, так и действий и любых формул, удобных при
определении функций.
Формально такое расширение является консервативным (новый
символ определен с помощью старых), оно гарантирует сохранение всех
функциональных свойств исходной системы. Минимальный набор обозначений, к
которым можно свести все правильные, т.е. вычислимые формулы системы, играет
роль базиса системы, реализация которого является
минимальной версией всей системы.
Следует отметить, что при формальной эквивалентности разные
расширения одного и того же базиса могут поддерживать различные применения и
восприниматься как совершенно разные системы. Программисты вынуждены строить
расширения, которые выглядят неконсервативными, так как целью их работы
является именно изменение ряда характеристик функционирования исходной системы
(компьютера, системы программирования и т.п.) с частичным сохранением заданных
функциональных свойств.
Большинство систем программирования разработано с ориентацией на
расширение, уточнение и настройку пользователем реализованных программных
средств, свойства которых определены и обеспечены в процессе разработки. Такое
разделение труда естественно при ориентации на решение задач с исчерпанным или
четко ограниченным исследовательским компонентом. Но исходная разработка любой
системы включает фазу формирования базиса и наполнения ядра системы в терминах,
которые не сводятся к ее языку. Это позволяет независимо рассматривать один еще более общий уровень — аппликативные
системы, в которые можно включать любые символы с
определенным смыслом. Поведение такой системы будет обусловлено набором
включенных в нее символов.
Основная трудность перехода к функциональному программированию —
соблазн легкого пути, т.е. стремление быстро смоделировать привычные средства и
методы программирования.
Более надежный путь — исследовать функциональное программирование как
незнакомый мир. Идеи функционального программирования легче воспринять как
самостоятельную теорию или интеллектуальную игру, которая новыми путями
непременно приведет к знакомым и интересным задачам, но обеспечит преимущество
— изящные решения и глубину понимания.
Джон Маккарти предложил проект языка Лисп (LISP - LIStProcessing) в качестве
средства исследования границ применимости компьютеров, в частности, методом
решения задач искусственного интеллекта. Идеи этого языка вызвали
не утихающие по сей
день дискуссии о приоритетах в программировании и сущности программирования. Лисп послужил
эффективным инструментом экспериментальной поддержки теории программирования и развития сферы его применения. Рост
интереса к Лиспу коррелирует
с улучшением элементной базы, повышением эксплуатационных характеристик
оборудования и появлением новых сфер применения ИТ.
Существует и активно применяется более трехсот диалектов Лиспа и
родственных ему языков: Interlisp, muLisp, Clisp, Scheme, ML, Cmucl, Logo, Hope, Sisal, Haskell, Miranda и др.
- http://www.haskell.org - очень
насыщенный сайт, посвященный функциональному программированию в общем и
языку Haskell в частности. Содержит различные туториалы, список
интерпретаторов и компиляторов Haskell-а (в настоящий момент все
интерпретаторы и компиляторы - freeware). Кроме того, имеется обширный
список интересных ссылок на ресурсы по теории функционального
программирования и другим языкам (Standard ML, Clean). Очень рекомендую.
- http://cm.bell-labs.com/cm/cs/what/smlnj -
Standard ML of New Jersey. Очень
хороший компилятор. В бесплатный дистрибутив помимо компилятора входят
утилиты MLYacc и MLLex и библиотека Standard ML BasisLibrary. Отдельно
можно взять документацию по компилятору и библиотеке.
- http://www.harlequin.com/products/ads/ml/ - HarlequinMLWorks, коммерческий компилятор
Standard ML. Однако в некоммерческих целях можно бесплатно пользоваться
версией с несколько ограниченными возможностями.
- http://caml.inria.fr - институт INRIA. Домашний сайт команды
разработчиков языков CamlLight и ObjectiveCaml. Можно бесплатно скачать
дистрибутив ObjectiveCaml, содержащий интерпретатор, компиляторы байт-кода
и машинного кода, Yacc и Lex для Caml, отладчик и профайлер, документацию,
примеры. Качество компилированного кода у этого компилятора очень хорошее,
по скорости опережает даже Standard ML ofNewJersey.
- http://www.cs.kun.nl/~clean/ - содержит дистрибутив компилятора с языка
Clean. Компилятор коммерческий, но допускается бесплатное использование в
некоммерческих целях. Из того что компилятор коммерческий следует его
качество (очень быстр), наличие среды разработчика, хорошей документации и
стандартной библиотеки
Комментарии
Отправить комментарий