В чем разница между процедурным и функциональным программированием?

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

Решение

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

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

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


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

Комментарии (4)

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

Комментарии (1)

Я полагаю, что процедурное/функциональное/объективное программирование о том, как приблизиться к проблеме.

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

У каждого стиля программирования есть свои собственные преимущества и слабые места. Следовательно, делая что-то, такое как " чистый programming" (т.е. чисто процедурный - никто не делает это, между прочим, который является довольно странным - или чисто функциональным или чисто объективным), очень трудное, если не невозможный, кроме некоторых элементарных проблем, особенно разработанных, чтобы продемонстрировать преимущество программного стиля (следовательно, мы называем тех, кому нравится чистота " weenie": D).

Затем от тех стилей у нас есть языки программирования, который разработан к оптимизированному для некоторого каждого стиля. Например, Ассамблея - все о процедурном. Хорошо, самые ранние языки процедурные, не только Asm, как C, Паскаль, (и Фортран, я слышал). Затем у нас есть вся известная Ява в объективной школе (На самом деле, Ява и C# находятся также в классе, названном " ориентированный на деньги, " но это подвергается для другого обсуждения). Также цель - Smalltalk. В функциональной школе у нас был бы " почти functional" (некоторые полагали, что они были нечисты), семья Шепелявости и семья ML и много " просто functional" Хаскелл, Erlang, и т.д. Между прочим, есть много общих языков, таких как Perl, Питон, Рубин.

Комментарии (0)

В развитие комментария Конрада:

Как следствие, чисто функциональная программа всегда выдает одно и то же значение на вход, и порядок оценки не является четко определенным;

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

Функциональное программирование также используется, когда вам нужно иметь возможность доказать правильность вашего кода. Это гораздо труднее сделать при процедурном программировании (не так легко при функциональном, но все же легче).

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

Комментарии (0)

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

Рекурсия - классический пример функционального программирования стиля.

Комментарии (1)

Подробно остановиться на Konrad' s комментарий:

и заказ оценки не четко определенный

Некоторые функциональные языки имеют то, что называют Ленивой Оценкой. Что означает, что функция не выполнена, пока стоимость не необходима. До того времени сама функция - то, что роздано.

Процедурные языки - шаг 3 шага 2 шага 1..., если в шаге 2 Вы говорите, добавляют 2 + 2, это делает это прямо тогда. В ленивой оценке Вы сказали бы, добавляют 2 + 2, но если результат никогда не используется, это никогда не делает дополнение.

Комментарии (0)