Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
39
Добавлен:
17.04.2015
Размер:
32.85 Кб
Скачать

Императивное программирование

Про императивное программирование мы уже практически все сказали. Автомат, последовательно изменяющий свои состояния под управлением некоторой схемы, наиболее просто реализуется технически. Поэтому первые компьютеры были императивными. И оста-лись такими и в наши дни, несмотря на все эксперименты с оригинальными вычислитель-ными устройствами. Даже типичное определение алгоритма, вдалбливаемое еще со школы (описание последовательности действий для решения какой-либо задачи), несет на себе сильнейший отпечаток императивного подхода. Стоит ли говорить о том, почему императивное программирование - практически наиболее "популярное"?

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

Синтаксис описания алгоритмов в простейшем языке, поддерживающем императивную модель программирования, мог бы быть таким:

Оператор ::= Простой оператор | Структурный оператор

Простой оператор ::= Оператор присваивания | Оператор вызова | Оператор возврата

Структурный оператор ::= Оператор последовательного исполнения | Оператор ветвления | Оператор цикла

Оператор присванивания ::= Переменная := Выражение ;

Оператор вызова ::= Имя подпрограммы ( Список параметров ) ;

Оператор возврата ::= return [ Выражение ] ;

Оператор последовательного исполнения ::= begin Оператор* end

Оператор ветвления ::= if Выражение then Оператор* (elseif Выражение then Оператор*)* [ else Оператор* ] end

Оператор цикла ::= while Выражение do Оператор* end

Семантика такого языка описывается достаточно легко. Состоянием вычислительного устройства будут указатель текущей инструкции, значения всех используемых программой ячеек памяти, и состояние стека возвратов из подпрограмм. Исполнение каждого оператора тривиальным образом записывается как изменение этого "состояния вычислителя" (если считать, что алгоритм представлен в виде дерева вывода в указанной грамматике, то с описанием переходов не должно возникнуть никаких проблем).

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

Императивное программирование наиболее пригодно для реализации небольших подзадач, где очень важна скорость исполнения на современных компьютерах. Кроме этого, работа с внешними устройствами, как правило, описывается в терминах последоательного исполнения операций ("открыть кран, набрать воды"), что делает такие задачи идеальными кандидатами на императивную реализацию.