Данные — представление фактов, понятий, инструкций в форме, приемлемой для обмена, интерпретации или обработки человеком или с помощью автоматических средств.
Алгоритм — конечная совокупность точно заданных правил решения произвольного класса задач или набор инструкций, описывающий порядок действий исполнителя для решения некоторой задачи.
Свойства алгоритма:
Компьютерная программа — алгоритм, записанный на некотором языке программирования.
Язык программирования — формальный язык, предназначенный для записи компьютерных программ.
Компьютер — универсальное программно-управляемое устройство для обработки информации (данных).
Парадигмы программирования — совокупность идей и понятий, определяющих стиль написания компьютерных программ (подход к программированию). Это способ концептуализации, определяющий организацию вычислений и структурирование работы, выполняемой компьютером.
Основные парадигмы программирования делятся на три большие группы:
Императивное программирование — способ записи программ, в котором указывается последовательность действий.
Основной признак императивной парадигмы (группы парадигм) — оператор деструктивного присваивания. Слово «деструктивное» означает, что присваивание может изменять значение, хранящееся в переменной — старое теряется безвозвратно, заменяясь новым значением.
Декларативное программирование — способ записи программ, в котором описываются взаимосвязь между данными; описывается цель, а не последовательность шагов для её достижения. Деструктивного присваивания в декларативной парадигме нет. Возможно лишь однократное присваивание значения при создании новой переменной.
Метапрограммирование — программа становится объектом управления со стороны программы — той же или другой.
В императивной группе выделяют три основные парадигмы.
goto
, break
, return
из середины
функции, continue
запрещены). В программе используются три основные управляющие
констркции: следование ({…}
в Си, begin
в Scheme), ветвление (if
/else
в Си, if
и cond
в Scheme) и цикл (while
, for
в Си, do
в Scheme).Декларативная парадигма:
Пример. Требуется отсортировать последовательность чисел по возрастанию. Как это будет выглядеть в разных парадигмах.
numbers
. Для упорядочивания вызывается процедура sort(array)
,
меняющая содержимое своего аргумента:
{ Паскаль }
sort(numbers);
После вызова процедуры в массиве numbers
будут находиться те же числа,
что и ранее, но в порядке возрастания.
numbers
, функция sort
формирует новый список sorted_numbers
, где будут располагаться те же
числа, но по возрастанию:
-- Хаскель
sorted_numbers = sort numbers
Содержимое списка numbers
остаётся прежним.
% Пролог
unsorted_sorted(Unsorted, Sorted) :- …
Теперь рассмотрим обращения к предикату:
?- unsorted_sorted([8, 2, 5, 1], X).
X = [1, 2, 5, 8];
false.
Получили сортированный список для несортированного
?- unsorted_sorted(X, [1, 2, 3]).
X = [1, 2, 3];
X = [1, 3, 2];
X = [2, 1, 3];
X = [2, 3, 1];
X = [3, 1, 2];
X = [3, 2, 1];
false.
Нашлись все перестановки сортированного списка.
?- unsorted_sorted(X, [1, 3, 2]).
false.
Для исходного списка не по возрастанию предикат не выполняется.
Парадигма метапрограммирования:
Подпрограмма — именованный блок кода; вызывающая программа приостанавливается, управление передаётся подпрограмме. При завершении работы подпрограммы вызывающая программа возобновляет свою работы; процедуры, функции, методы — разновидности подпрограмм.
Сопрограмма — в отличие от подпрограмм работает поочередно с вызывающей программой, при следующем вызове она возобновляет свою работу с точки остановки.