Парадигмы программирования.
В основе разделения языков программирования на поколения лежит линейная шкала. Позиция языка на этой шкале определяется тем, насколько пользователь свободен от ненужной информации и в какой степени данный язык позволяет программисту мыслить в понятиях, связанных с решаемой задачей. В действительности развитие языков программирования происходит не только в этом направлении, существуют и другие подходы к процессу программирования - парадигмы программирования. Поэтому историческое развитие языков программирования лучше изображать с помощью диаграммы (рис. 2.6). На этой диаграмме показано, что разные направления развития языков являются результатом разных парадигм (подходов), развивающихся независимо друг от друга. В частности, на рисунке изображены четыре направления, представляющие функциональную, объектно-ориентированную, императивную и декларативную парадигмы. Языки, относящиеся к каждой парадигме, расположены на временной шкале, показанной внизу (но из этого не следует, что один язык развивался из другого).[1]
Рис. 2.6. Эволюция парадигм программирования.
Следует заметить, что хотя парадигмы, изображенные на рисунке, и называются парадигмами программирования, их влияние выходит за рамки процесса программирования. Они представляют собой совершенно разные подходы к решению задач и, следовательно, ко всему процессу разработки программного обеспечения. В этом смысле термин «парадигмы программирования» употребляется неправильно. Здесь больше подходит термин «парадигмы разработки программного обеспечения».
Императивная, или процедурная парадигма, представляет собой традиционный подход к процессу программирования. К этой парадигме относится вышерассмотренный псевдокод, а также машинный язык. Императивная парадигма определяет процесс программирования как построение последовательности команд, которые манипулируют входными данными для порождения необходимого результата. Согласно этой парадигме сначала следует найти алгоритм решения задачи, а затем представить его в виде последовательности команд.
Декларативная парадигма позволяет программисту описывать задачу. Суть заключается в том, чтобы найти и выполнить алгоритм, решающий общую задачу. Как только этот общий алгоритм найден, задачи можно решать, просто формулируя их условия так, чтобы они были совместимы с этим алгоритмом. В такой среде программист должен точно сформулировать задачу, а не найти алгоритма решения.
Главной сложностью при разработке программного обеспечения на основе декларативной парадигмы является обнаружение лежащего в основе алгоритма. Поэтому первые декларативные языки были по своей сути специализированными и создавались для использования в определенных прикладных задачах. Например, декларативный подход многие годы применялся для имитации систем (экономических, физических, политических и т. д.) с целью проверки гипотез. В таком случае лежащий в основе алгоритм — это процесс воспроизведения хода времени с помощью повторяющегося вычисления значений параметров (валовой внутренний продукт, внешнеторговый дефицит и т. д.) из предыдущих значений. Таким образом, использование в таких моделях декларативного языка требует применения алгоритма, который выполняет эту повторяющуюся процедуру. Следовательно, перед программистом стоит единственная задача: описать зависимости между параметрами. Затем алгоритм просто имитирует ход времени, используя эти зависимости для необходимых вычислений.
Функциональная парадигма рассматривает процесс разработки программы как соединение «черных ящиков», каждый из которых получает входные данные и порождает выходные данные так, чтобы создать необходимую зависимость между ними. Математики называют эти «ящики» функциями, именно поэтому подход и называется функциональным. Примитивы функционального языка программирования являются элементарными функциями, из которых можно построить более сложные функции, необходимые для решения некоторой задачи. Таким образом, программист, придерживающийся функциональной парадигмы, создает программное обеспечение, объединяя элементарные функции в систему, которая порождает необходимый результат. Проще говоря, процесс программирования сводится к построению сложных функций из более простых (например, в Паскале sin(sqr(x)) ).
Функциональная парадигма представляет среду, в которой существует иерархия абстракций, и это позволяет создавать новое программное обеспечение из больших заранее заданных компонентов. Создание таких сред для разработки программного обеспечения является одной из главных задач в вычислительной технике.
Ниже приведены примеры запись команд на LISP, который относится к функциональным языкам:
1) (MAX_число1_число2_ ... числоN) - максимальное из чисел;
2) (+_число1_число2_ ... числоN) – сложение;
3) (SETQ_символ1_S-exp1_ .... символN_S-expN) - связывает имя со значением выражения.;
4) (EVAL_(/_(-_(*_ 2_7)_5)_2)) - вычисление значения выражения (2*7-5)/2;
5) (SETQ_f_1) (WHILE_(<_f_10)_(SETQ_f_(+_f_3))) – присваиваем переменной f значение 1 и увеличиваем переменную f на три, до тех пор, пока f меньше 10.
Объектно-ориентированная парадигма и соответствующее ей объектно-ориентированное программирование (ООП) представляют собой еще один подход к процессу разработки программного обеспечения. Данные при этом подходе рассматриваются как активные «объекты», а не как пассивные единицы, представленные в обычной императивной парадигме. Например, рассмотрим список имен. В императивной парадигме этот список рассматривается просто как набор данных. Любая программа, пытающаяся получить доступ к списку, должна содержать алгоритм, выполняющий необходимые действия (чтение списка и т.п.). Таким образом, список обслуживается управляющей программой. При объектно-ориентированном подходе список рассматривается как объект, состоящий из самого списка и процедур для манипуляции им. Это могут быть программы для помещения в список нового элемента, удаления элемента из списка, проверки наличия элемента в списке и сортировки списка. В свою очередь, программе, пытающейся получить доступ к списку, совсем не обязательно содержать алгоритмы для выполнения этих задач. Вместо этого она использует процедуры объекта. Можно сказать, что программа просит список отсортировать себя, а не сама сортирует его.
В качестве другого примера объектно-ориентированного подхода рассмотрим разработку графического пользовательского интерфейса. Здесь значки, которые появляются на экране, представляют собой объекты. Каждый из этих объектов включает в себя набор процедур, которые описывают, как этот объект должен отвечать на появление различных событий, например, таких как щелчок мыши на нем. Таким образом, вся система является набором объектов, каждый из которых отвечает на определенные события.
Преимущества объектно-ориентированного программирования заключаются в модульной структуре программы, которая является естественным следствием объектно-ориентированной философии. Каждый объект представляет собой отдельную, строго определенную единицу. После задания свойств объекта его можно использовать каждый раз, когда требуется такой объект. Сторонники объектно-ориентированного программирования также утверждают, что объектно-ориентированная парадигма предоставляет естественную среду для разработки программного обеспечения с помощью стандартных блоков. Они представляют собой библиотеки определений объектов, из которых можно создавать новое программное обеспечение точно так же, как сложные изделия собираются из готовых компонентов.
Другое преимущество модульной структуры состоит в том, что связь между модулями осуществляется строго определенным способом (обмен сообщениями между объектами) - этот же метод используется для организации связи по сети. На самом деле передача сообщений между объектами представляет собой естественный подход к разработке систем программного обеспечения, которые распределены по сети. Поэтому неудивительно, что в основе программного обеспечения, разработанного в рамках объектно-ориентированной парадигмы, часто лежит модель «клиент-сервер». В данном случае сервер – это объект, который отвечает на сообщения другого объекта, являющегося клиентом. Следует отметить, что процедуры объекта, описывающие как объект должен отвечать на различные сообщения, в сущности, представляют собой небольшие императивные программные единицы.
В объектно-ориентированном программировании данные вместе с процедурами хранятся в классе. Класс определяет общие для всех его объектов методы и свойства. Свойства представляют собой характеристики объекта (цвет, размер шрифта, название, положение на экране и т.п.). Методы – это программные процедуры, реализующие некоторый алгоритм, который определяет взаимодействие объектов класса с внешней средой. Объект, с одной стороны обладает определенными свойствами, а, с другой стороны, над ним возможны операции (методы), которые приводят к изменению этих свойств. Это свойство объединения в объекте его свойств и методов называется инкапсуляцией.
Понятие ООП включает также возможность наследования. Наследование - это возможность сопоставления с создаваемым классом одного или даже нескольких уже созданных классов в качестве родительских. Все члены родительских классов будут при этом являться и членами создаваемого класса, в котором они, обычно, переопределяются в соответствии с его характеристиками.
Наследование обеспечивает один из способов реализации третьего принципа ООП – полиморфизма, т.е. возможности использовать одноименные методы для выполнения однотипных действий у объектов разных классов (например, существует команда нарисовать объект, но для выведения объектов разной формы используются различные процедуры).
Объектно-ориентированные языки программирования позволяют сделать простым и понятным процесс создания интерфейса разрабатываемых приложений, поскольку при задании свойств графических объектов используются диалоговые окна. Взаимодействия программных объектом между собой и их изменение описывается с помощью программного кода (программы). [1, 8]
Основные понятия традиционного программирования.
Операторы императивных и объектно-ориентированных языков программирования можно разделить на три группы: операторы описания, исполняемые операторы и комментарии. Операторы описания определяют терминологию, которая будет использоваться в программе, например, задают имена переменных и т.п. Исполняемые операторы описывают шаги алгоритма, лежащего в основе программы. Комментарии упрощают чтение текста программы, желательно помещать комментарии перед каждым блоком программы.
Программа, написанная на императивном языке, обычно начинается с описания данных, которые будут использоваться в программе. За операторами описания следуют исполняемые операторы, описывающие алгоритм, который будет выполняться. Комментарии помещаются в любое место программы для объяснения выполняемых ею действий.
Языки программирования высокого уровня позволяют обращаться к ячейкам памяти через описательные имена, а не через числовые имена. Такие имена называются именами переменных. При изменении значения, хранящегося в ячейке памяти, изменяется и значение, присвоенное переменной. Во многих языках программирования все переменные, которые будут использоваться в программе, должны быть предварительно определены с помощью операторов описания. В операторах описания указывается и тип данных, которые будут храниться в ячейках, связанных с переменными.
Тип данных однозначно определяет представление данных в памяти ЭВМ, и следовательно, и множество их возможных значений, а также допустимые действия над данными.
Переменные в программе могут быть не только данными простых типов, но также структурами данных, т.е. данными, упорядоченными каким-либо образом. Наиболее распространенной структурой данных является массив. Массив представляет собой набор значений одного типа, пример, список, двумерную таблицу или многомерную таблицу. В большинстве языков программирования, для того чтобы описать массив, нужно задать количество измерений, а также число элементов (размерность) в каждом измерении. После описания массива к нему можно обращаться по заданному имени, а к конкретному элементу указав имя массива, а в скобках индекс (порядковый номер) элемента. Структурированные данные могут содержать данные разных типов (например, запись и структура в Паскале).
В программе могут использоваться фиксированные, заранее заданные значения – константы.
После операторов описания программисту необходимо с помощью исполняемых операторов описать алгоритм решения задачи. Основными операторами являются операторы присваивания, в результате выполнения которых переменной присваивается некоторое значение (или, более точно, значение сохраняется в ячейке памяти, связанной с этой переменной). При вычислении выражения, находящегося в правой части оператора присваивания операции выполняются согласно приоритету: умножение, деление, сложение, вычитание. Другую последовательность выполнения операций можно задать, используя скобки.
Управляющими операторами называются исполняемые операторы, меняющие последовательность выполнения инструкций (операторов) в программе. К этим операторам относится оператор goto (желательно не использовать). Он позволяет изменить порядок выполнения программы и перейти к выполнению программы, начиная с определенного места, обозначенного меткой. К управляющим структурам относятся также условный оператор, операторы цикла.
Процедуры– набор команд для выполнения некоторой задачи, который могут использовать программные единицы. Управление передается процедуре, когда ее действия необходимы, а затем, после завершения выполнения процедуры, снова возвращается исходной программной единице. Процесс передаче управления процедуре называется вызовом процедуры. Одним из вариаций понятия процедура является понятие функция. Функция не выполняет действия (например, сортировать список), а вычисляет значение (например, синус угла). Обычно процедуры и функции вызываются указанием их имени и после имени с скобках фактических параметров, которые передаются в процедуру из основной программы.
Имена переменных, которые используются при написании процедуры, называются формальными параметрами. При выполнении процедуры формальным параметрам присваиваются необходимые значения (значения фактических параметров).
Процедуры и функции предоставляют средства для расширения возможностей языка программирования. Можно написать процедуру, выполняющую определенную задачу, а затем при необходимости вызывать ее из различных программ.
2.3. Язык программирования высокого уровня – Паскаль.
Язык программирования Паскаль был разработан Н.Виртом в конце 1960-х годов и получил широкое распространение благодаря легкости изучения и наглядности программ. В настоящее время наиболее распространены среды программирования Turbo Pascal 7.0 и Borland Pascal.
Для входа в среду Паскаля необходимо запустить файл bp.exe, который обычно находится в каталоге ВР\BIN. После успешного вызова системы верхняя строка экрана монитора содержит «меню» возможных режимов работы в среде Паскаля.
В команде меню File находятся команды, которые предназначены для работы с файлами: new – создать новый файл, load – открыть ранее созданный файл, save - сохранить файл на диске под тем же именем и на то же место, save as – сохранить файл на диске, указав маршрут и имя файла. В имени файла в Паскале нельзя использовать пробелы и специальные символы, желательно использовать только буквы латинского алфавита.
Паскаль имеет встроенный редактор текстов. Для входа в редактор нужно выбрать команду меню Edit.
Команда Compile служит для компиляции, т.е. перевода программы на Паскале в машинные коды. При выполнении этой команды выдается сообщения о результатах прохождения компиляции. Если в программе допущены синтаксические ошибки и ошибки, вызванные внутренними несоответствиями, то выдается сообщение.
Для выполнения программы служит команда меню Run, в случае успешного выполнения программы результат можно просмотреть, нажав клавишиAlt+F5.
Дата добавления: 2014-12-20; просмотров: 2276;