Процедурное программирование функциональное программирование логическое программирование

14.1. Эволюция и классификация языков программирования.

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

Развитие языков программирования идет от середины ХХ века до наших дней. От «конкретного» программирования, когда команды обозначались в виде двоичных или восьмеричных кодов, а операнды – в виде двоичных или восьмеричных адресов, от машинных языков и до современных систем программирования.

14.1.1. Процедурное программирование

Процедурное программирование является отражением архитектуры традиционных ЭВМ, которая была предложена фон Нейманом в 40-х гг. Теоретической моделью процедурного программирования служит алгоритмическая система под названием «машина Тьюринга».

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

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

Процедурные языки характеризуются:

— отсутствием строгой математической основы;

— необходимостью явного управления памятью, в частности необходимостью описания переменных;

— малой пригодностью для символьных вычислений;

— высокой эффективностью реализации на традиционных ЭВМ.

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

Одним из важнейших классификационных признаков процедурных языков является их уровень. Уровень языка программирования определяется семантической (смысловой) емкостью его конструкций и его ориентацией на программиста-человека. Язык программирования (частично) ликвидирует семантический разрыв между методами решения задач человеком и машиной. Чем более язык ориентирован на программиста, тем выше его уровень.

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

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

Сущность функционального (аппликативного) программирования определена А.П. Ершовым как «… способ составления программ, в которых единственным действием является вызов функции, единственным способом расчленения программы на части является введение имени для функции, а единственным правилом композиции – оператор суперпозиции функции. Никаких ячеек памяти, операторов присваивания, ни, тем боле, блок-схем, ни передачи управления».

Роль основной конструкции в функциональных языках играет выражение. К выражениям относятся скалярные константы, структурированные объекты, функции, тела функций и вызовы функций. Функция трактуется как однозначное отображение из Х в Х, где Х – множество выражений.

Аппликативный язык программирования включает следующие элементы:

— классы констант, которыми могут манипулировать функции;

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

— правила построения новых функций из базовых;

— правила формирования выражений на основе вызовов функций.

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

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

Первым таким языком был LISP(ЛИСП) (LIStProcessing– обработка списков). Созданный в 1959 году. Цель его создания состояла в организации удобства обработки символьной информации. Существенная черта этого языка – унификация программных структур и структур данных: все выражения записываются в виде списков.

Источник

Читайте также:  Динамическое программирование порядок перемножения матриц
Оцените статью