Ответ 1
Пример декларативного программирования выше не является реальной программой, поэтому это не очень хороший пример.
Основное различие между императивным и декларативным. Функциональный - это особый вид декларативного.
C, С++, Java, Javascript, BASIC, Python, Ruby и большинство других языков программирования императив. Как правило, если он имеет явные циклы (for, while, repeat), которые изменяют переменные с явными операциями присваивания в каждом цикле, тогда это необходимо.
SQL и XSLT являются двумя хорошо известными примерами декларативного программирования. Языки разметки, такие как HTML и CSS, также декларативны, хотя они, как правило, недостаточно мощны для описания произвольных алгоритмов.
Вот пример вычисления (суммирование дохода по полу, из подходящего источника данных), сначала написанного на императивном языке (Javascript), а затем в декларативном языке (SQL).
Императивное программирование
var income_m = 0, income_f = 0;
for (var i = 0; i < income_list.length; i++) {
if (income_list[i].gender == 'M')
income_m += income_list[i].income;
else
income_f += income_list[i].income;
}
Примечание:
- явная инициализация переменных, которая будет содержать текущие итоги;
- явный цикл над данными, изменяет управляющую переменную (
i
) и текущие итоги на каждой итерации; - conditionals (
if
s) используются только для выбора пути кода на каждой итерации.
Декларативное программирование
select gender, sum(income)
from income_list
group by gender;
Примечание:
- ячейки памяти, содержащие текущие итоги, подразумеваются выводом, который вы заявляете,
- любой цикл, который процессор должен выполнить (например, над таблицей income_list), подразумевается выводом, который вы заявляете, и структурой исходных данных;
- условные выражения (например,
case
в SQL) используются в функциональном способе указать требуемое значение на основе входных значений, а не выбирать кода.
Функциональное программирование
Как я уже упоминал выше, SQL case
- отличный пример функционального способа программирования, который является ограниченным подмножеством декларативного программирования, в котором требуемое вычисление задается составлением функции.
Функции - это вещи, которые принимают входы и обратные выходы (например, case
, sum()
...)
Композиция означает цепочку две или более вместе, указывая, как вывод одного из них подается в качестве входа в следующий (обычно, записывая один внутри другого). Наконец, вся композиция, которая все еще сама по себе большая функция, применяется к доступным входам для получения желаемого результата.
В этом фрагменте я объявляю вывод, который я хочу, создавая функции sum()
и case
. Это называется функциональным программированием:
select
sum(case when some_flag = 'X' then some_column
else some_other_column end)
from
...
Если состав двух или более функций и их применение к входным данным являются единственными конструкциями, доступными в данном ягуаге, этот язык называется чисто функциональным. На этих языках вы заметите полное отсутствие циклов, назначение переменных и другие типично императивные утверждения.
Изменить: рекомендую посмотреть некоторые из Anjana Vakil разговоров о функциональном программировании в Javascript, чтобы лучше понять, что это значит.