Опубликован: 19.03.2004 | Уровень: специалист | Доступ: платный
Лекция 1:

Основные идеи

Лекция 1: 123 || Лекция 2 >
Аннотация: В этой лекции дается общее представление о функциональном программировании и сфере его применения, включая анализ основных понятий и принципов и их иллюстрацию на материале истории языка Лисп, его диалектов, наследников и реализаций. Рассматривается роль функциональных программ в жизненном цикле программного обеспечения и эволюции информационных технологий, а также перспективы функционального подхода к совершенствованию информационных систем.
Ключевые слова: функции, Лисп, языки и системы программирования, программирование, функциональность, определение процессов, символьная обработка, связь, множества, семантическая система, алгебраические системы, рекурсия, консервативное расширение, базис системы, аппликативные системы, путь, Lisp, list processing, искусственный интеллект, ПО, теория программирования, Clisp, scheme, cmucl, logo, Sisal, haskell, лямбда-исчисление, пространство, связанная переменная, интерпретация, всюду определенные функции, однозначность результата, деление, остаток от деления, универсальные методы, чистые функции, строгие функции, идеальные функции, структурированное программирование, качество данных, специальные функции, расширение класса, аналогия, эволюция, функция, псевдо-функции, ввод/вывод, побочный эффект, отображение, формальный результат, моделирование, программотехника, доступ, варианты значений, псевдослучайное число, тупиковая ситуация, логическое программирование, замедленные вычисления, ленивые вычисления, функции высших порядков, спецификация типа, факториал, определение, цикла, число Фибоначчи, вычитание, универсальность, значение, переменная, категории функций, фактический параметр, компилятор, динамический контроль типов данных, анализ, вероятность, программа, искусственный разум, потенциал, организация памяти, сборка мусора, компиляция, промежуточный код, полиморфизм, атрибут объекта, autolisp, reduce, системное программирование, базис Лиспа, функционалы, базис, atom, CONS, CDR, cond, механизмы, преобразования формул, синтаксис, распознавание, пробел, представление, универсальная функция, информация, уровень представления, абстрагирование, высокопроизводительное программирование, Internet-приложение, расходы, статическое распределение памяти, теоретическое программирование, представление знаний, парадигма программирования, поддержка, работ, символьное представление, замкнутая система, функциональные переменные, функциональная полнота, метод раскрутки, операционная семантика, ясность, опыт, Java, python

Общее представление о функциональном программировании и его применении

Идея функционального программирования опирается на интуитивное понятие о функциях как о достаточно общем механизме представления и анализа решений сложных задач. Механизм функций основательно изучен математиками, и это позволяет программистам наследовать выверенные построения, обладающие предельно высокой моделирующей силой [ 1 ] . Систематическое применение функционального программирования впервые достаточно ярко было продемонстрировано Джоном Маккарти и его учениками в методах реализации языка Лисп и программирования на этом языке. Наиболее очевидные из этих методов были успешно ассимилированы другими языками и системами программирования. Обычно про функциональное программирование вспоминают при смене технологий, когда возрастает роль аналитики и исследовательских задач. В настоящее время часто употребляют термин "функциональность" при сравнительной характеристике информационных систем, что, видимо, свидетельствует о проявлении новой метрики, заслуживающей отдельного рассмотрения [ 2 ] .

Функциональный стиль объединяет разные подходы к определению процессов вычисления на основе достаточно строгих абстрактных понятий и методов символьной обработки данных. Связь функционального программирования с математическими основами позволяет в тексте программы наследовать доказательность построения результата, если она достигнута, причем с использованием разных методов абстрагирования решаемой задачи [ 2 ] [ 3 ] .

Сложность решения задач с помощью функциональных определений преодолевается чисто алгебраически: нацеленностью на формализацию основного множества объектов и определения полной семантической системы операций над ними. Это позволяет представлять классы задач и их решений строгими формулами, для наглядности упрощаемыми введением дополнительных функциональных символов. При необходимости такие символы вносятся в опpеделение алгебраической системы, что приводит к ее расширению. Вводятся новые функции, подобные леммам и другим вспомогательным построениям в математике. Активно используется рекурсия и символьные обозначения как данных, так и действий и любых формул, удобных при определении функций.

Формально такое расширение является консервативным (новый символ определен с помощью старых), оно гарантирует сохранение всех функциональных свойств исходной системы. Минимальный набор обозначений, к которым можно свести все правильные, т.е. вычислимые формулы системы, играет роль базиса системы, реализация которого является минимальной версией всей системы.

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

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

Основная трудность перехода к функциональному программированию — соблазн легкого пути, т.е. стремление быстро смоделировать привычные средства и методы программирования. Более надежный путь — исследовать функциональное программирование как незнакомый мир. Идеи функционального программирования легче воспринять как самостоятельную теорию или интеллектуальную игру, которая новыми путями непременно приведет к знакомым и интересным задачам, но обеспечит преимущество — изящные решения и глубину понимания.

Джон Маккарти предложил проект языка Лисп (LISP - LISt Processing) в качестве средства исследования границ применимости компьютеров, в частности, методом решения задач искусственного интеллекта. Идеи этого языка вызвали не утихающие по сей день дискуссии о приоритетах в программировании и сущности программирования. Лисп послужил эффективным инструментом экспериментальной поддержки теории программирования и развития сферы его применения. Рост интереса к Лиспу коррелирует с улучшением элементной базы, повышением эксплуатационных характеристик оборудования и появлением новых сфер применения ИТ.

Существует и активно применяется более трехсот диалектов Лиспа и родственных ему языков: Interlisp, muLisp, Clisp, Scheme, ML, Cmucl, Logo, Hope, Sisal, Haskell, Miranda и др.

Лекция 1: 123 || Лекция 2 >
Дарья Федотова
Дарья Федотова
Сергей Березовский
Сергей Березовский

В рамках проф. переподготовки по программе "Программирование"

Есть курсы, которые я уже прошел. Но войдя в курс я вижу, что они не зачтены (Язык Ассемблера и архитектура ЭВМ, Программирование на С++ для профессионалов). Это как?

Алина Ленкова
Алина Ленкова
Россия, Ставрополь, СФ МГУПИ, 2014
Валерий Ромашов
Валерий Ромашов
Россия