научная статья по теме ОСНОВЫ ФУНКЦИОНАЛЬНОГО ПРОГРАММИРОВАНИЯ Общие и комплексные проблемы естественных и точных наук

Текст научной статьи на тему «ОСНОВЫ ФУНКЦИОНАЛЬНОГО ПРОГРАММИРОВАНИЯ»

Математическое и программное обеспечение вычислительных машин, комплексов и компьютерных сетей

Боголюбская Ю.В., кандидат технических наук, доцент Стоякова К.Л., кандидат педагогических наук, доцент

Ибраев Р.Р., кандидат педагогических наук, доцент

Бесфамильная Е.М., кандидат педагогических наук, доцент Савина Ю. И., доцент Канидьев Д.Ю., старший преподаватель

(Московский государственный университет технологий и управления им. К.Г. Разумовского)

ОСНОВЫ ФУНКЦИОНАЛЬНОГО ПРОГРАММИРОВАНИЯ

В статье рассматриваются основы функционального программирования и его роль в науке и технике при обработке информации. Анализируются причины неполного использования всех функций языка программирования. Объясняется сущность и специфика функционального подхода к программированию.

Ключевые слова: программирование, парадигмы, языки программирования, программное обеспечение, функциональный подход, математические основы программирования.

BASES OF FUNCTIONAL PROGRAMMING

In article bases of functional programming and its role in a science and technics are considered. The causes of incomplete use all the features of the programming language. Explained the nature and specificity of the functional approach to programming.

Keywords: programming paradigms, programming languages, software, functional approach, the mathematical foundations of programming.

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

Однако, идеи, апробированные в области функционального программирования (параметрический полиморфизм и вывод типов), оказывают сильное влияния на разработку языков, подобно тому, как объектно-ориентированная модель коренным образом изменила облик программирования.

Программное обеспечение постоянно усложняется, повышается и необходимость в улучшении его структуры. Хорошо структурированное программное обеспечение проще пишется и легче отлаживается, оно предоставляет набор многократно используемых модулей, уменьшает затраты на программирование в будущем.

Традиционные языки программирования имеют концептуальные ограничения на организацию модульной структуры. Функциональные языки снимают эти ограничения [1, 3].

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

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

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

Обращение к функции не вызывает иного эффекта кроме вычисления результата. Это устраняет главный источник ошибок и делает порядок выполнения функций несущественным: так как побочные эффекты не могут изменять значение выражения, оно может быть вычислено в любое время. Программист освобождается от бремени описания потока управления. Поскольку выражения могут быть вычислены в любое время, можно свободно заменять переменные их значениями и наоборот, то есть программы «прозрачны по ссылкам». Эта прозрачность ссылок делает функциональные программы более удобными для математической обработки, по сравнению с общепринятыми аналогами.

Все эти характеристики приводят к более быстрой разработке короткого, простого и безошибочного кода, процесс доказательства формальных свойств для функциональных языков и программ много проще, чем для императивных.

Теория, положенная в основу функционального подхода родилась в 20-х-30-х годах прошлого века.

В числе разработчиков математических основ функционального программирования можно назвать Мозеса Шёнфинкеля (Германия и Россия) и Хаскелла Карри (Англия), разработавших комбинаторную логику, а также Алонзо Чёрча (США), создателя ^-исчисления.

В начале 60-х годов прошлого века Джон МакКарти разработал язык Lisp, который стал первым почти функциональным языком программирования и на протяжении многих лет оставался единственным таковым. Хотя Lisp всё ещё используется, он уже не удовлетворяет некоторым современным запросам. В связи с этим обстоятельством всё большую роль начинает играть типизация.

В конце 70-х, начале 80-х годов интенсивно разрабатываются модели типизации, подходящие для функциональных языков. Большинство этих моделей включали в себя поддержку таких мощных механизмов как абстракция данных и полиморфизм. Появляется множество типизированных функциональных языков: ML, Scheme, Hope, Miranda, Clean, Mercury, OCAML и многие другие. Вдобавок постоянно увеличивается число диалектов.

В результате вышло так, что практически каждая группа, занимающаяся функциональным программированием, использовала собственный язык. Это препятствовало дальнейшему распространению этих языков и порождало многочисленные более мелкие проблемы. Чтобы исправить ситуацию, объединенная группа ведущих исследователей в области функционального программирования решила воссоздать достоинства различных языков в новом функциональном универсальном языке. Первая реализация этого языка, названного Haskell в честь Хаскелла Карри, была создана в начале 90-х годов [1, 2, 3].

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

рами обычно проигрывают по скорости выполнения в несколько раз. Поэтому помимо интерпретаторов существуют и компиляторы, генерирующие неплохой машинный код (например, Objective Caml) или код на C/C++ (например, Glasgow Haskell Compiler). Что показательно, практически каждый компилятор с функционального языка реализован на этом же самом языке.

Роль функционального программирования в науке и технике. Применение функциональных языков связано с разработкой искусственного интеллекта, с помощью рекурсивных функций описывают интеллектуальную деятельность людей [3].

Первые области применения Лиспа были связаны с символьной обработкой данных и процессами принятия решений [1, 2, 3].

Наиболее популярный сегодня диалект Common Lisp является универсальным языком программирования. Он широко используется в самых разных проектах: интернет-серверы и службы, серверы приложений и клиенты, взаимодействующие с реляционными и объектными базами данных, научные расчёты и игровые программы.

Одно из направлений использования языка Lisp - его использование в качестве скрипто-вого языка, автоматизирующего работу в ряде прикладных программ. Лисп используется как язык сценариев в САПР AutoCAD (диалект AutoLISP). Диалект SKILL используется для написания скриптов в САПР Virtuoso Platform компании Cadence Design Systems. Диалект Scheme используется в качестве одного из скриптовых языков в графическом процессоре Gimp. Диалект GOAL используется для высокодинамичных трёхмерных игр.

Сферы применения Лиспа многообразны: наука и промышленность, образование и медицина, от декодирования генома человека до системы проектирования авиалайнеров.

Таким образом, языки программирования служат разным целям, и их выбор определяется тем, насколько они удобны для пользователя, пригодны для данного компьютера и данной задачи.

ЛИТЕРАТУРА

1. Стоякова К.Л. Использование логической парадигмы программирования для обучения информатике студентов в инженерных вузах/ автореферат. Московский городской педагогический университет Комитета образования Правительства Москвы. Москва, 2008.

2. Стоякова К.Л., Ибраев Р.Р. Основы разработки систем контроля и защиты информации от внутренних угроз/ статья. Вестник Российского университета дружбы народов. Серия: Информатизация образования. 2013. № 2. С. 78-81.

3. Ибраев Р.Р. Формирование содержательных линий информатики при обучении студентов на основе комплексного объектно-ориентированного подхода/ статья. Информатика и образование. 2008. № 1. С. 110-112.

Для дальнейшего прочтения статьи необходимо приобрести полный текст. Статьи высылаются в формате PDF на указанную при оплате почту. Время доставки составляет менее 10 минут. Стоимость одной статьи — 150 рублей.

Показать целиком