Функциональное программирование

Автор работы: Пользователь скрыл имя, 20 Февраля 2013 в 07:16, статья

Краткое описание

В 1965 году (через шесть лет после изобретения интегральной схемы) один из основателей Intel Гордон Мур в процессе подготовки выступления обнаружил закономерность: появление новых моделей микросхем наблюдалось спустя примерно год после предшественников, при этом количество транзисторов в них возрастало каждый раз приблизительно вдвое. Мур пришел к выводу, что при сохранении этой тенденции мощность вычислительных устройств за относительно короткий промежуток времени может вырасти экспоненциально. Это наблюдение получило название закона Мура.

Прикрепленные файлы: 1 файл

Спанова Б.Ж._тезисы.docx

— 68.16 Кб (Скачать документ)

УДК004              КогайГ.Д. (Караганда, КарГТУ)

СпановаБ.Ж. (Караганда, КарГТУ)

Кряжев В.В. (Караганда, КарГТУ)

 

ФУНКЦИОНАЛЬНОЕ ПРОГРАММИРОВАНИЕ

 

В 1965 году (через шесть  лет после изобретения интегральной схемы) один из основателей Intel Гордон Мур в процессе подготовки выступления обнаружил закономерность: появление новых моделей микросхем наблюдалось спустя примерно год после предшественников, при этом количество транзисторов в них возрастало каждый раз приблизительно вдвое. Мур пришел к выводу, что при сохранении этой тенденции мощность вычислительных устройств за относительно короткий промежуток времени может вырасти экспоненциально. Это наблюдение получило название закона Мура. В 1975 году Гордон Мур внёс в свой закон коррективы, согласно которым удвоение числа транзисторов будет происходить каждые два года.

Ни одна другая область  человеческой деятельности еще не развивалась  такими бурными темпами. Примерно в 2005 – 2007 годах был достигнут предел по количеству транзисторов на одном  чипе, что привело к появлению  многоядерных процессоров. Многопоточное (concurrent) и параллельное (parallel) программирование это те проблемы, которые встают сейчас, если мы хотим сейчас воспользоваться преимуществами многоядерной архитектуры.

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

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

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

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

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

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

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

Развитие современной  многоядерной архитектуры привели  к тому что современные языки и платформы программирования становятся мульти-парадигменными, поддерживающими не только императивный, объектно-ориентированный но и функциональный подход. Примеры языков  поддерживающих программирование в функциональном стиле: C#, Scala, Groovy, Python, Ruby. Язык F# ставший уже полноценным языком в платформе .NET способствует только функциональному программированию. Хотя написание на этом языке в императивном стиле и возможно язык этому не способствует. На текущий момент есть договоренность добавление функциональных возможностей в ближайший релиз JavaSE 8. Такие функциональные языки такие как: Haskell, Clojure, Erlang тоже получают все большую популярность и находят все большее применение.

Итак,почему же функциональное программирование важно?

Достоинства:

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

Недостатки:

  • Производительность, ранее считалось, что функциональные языки менее эффективны. Однако сейчас код Scala или F# преобразуется в соответсвующий байт код, производительность будет такая же как и у Java или C#. Поэтому этот недостаток можно считать в современных условиях уже нивелирован.
  • Более квалифицированные специалисты. Переход от  структурного программирования к объектно-ориентированному занял десятилетия. На данное время при написании программ в основном используется императивный подход. Для более широкого применения функционального подхода в написании программ, может потребоваться достаточно длительный период времени.

 

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


Информация о работе Функциональное программирование