Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по информатике.doc
Скачиваний:
27
Добавлен:
07.11.2018
Размер:
754.69 Кб
Скачать

5.2. Стили программирования

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

Процедурный подход. Процедурное (императивное) программирование является отражением архитектуры традиционных ЭВМ, которая была предложена фон Нейманом в 40-х годах.

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

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

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

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

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

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

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

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

Язык программирования С. Разработан для реализации операционной системы UNIX в начале 70- годов. Приобрел широкую популярность среди системных и прикладных программистов. Реализован на большинстве ЭВМ.

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

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

Синтаксис затрудняет программирование и восприятие составленных программ. Отсутствует строгая типизация данных, предоставляет дополнительные возможности программисту, но не способствует написанию надежных программ.

BASIC (Beginnres All-purpose Symbolic Instruction Code). Разработан в 1964 году для использования новичками. Первоначально работа велась в интерактивном режиме с использованием интерпретаторов. В настоящее время имеются и компиляторы.

Язык BASIC в смысле строгости и стройности является антиподом языка Pascal. В нем широко распространены правила умолчания, что считается плохим тоном в большинстве языков программирования.

BASIC широко распространен на ЭВМ различных типов, очень популярен в среде начинающих программистов. Существует множество диалектов языка мало совместимых между собой. Он активно поглощает многие новинки и концепции из других языков. Достаточно динамичен. Нельзя однозначно определить его уровень.

PASCAL. Разработан в 1970 году Н.Виртом. Предназначался для обучения программированию. Очень популярен среди прикладных программистов. В последствии стал одним из основных инструментов прикладных и системных программистов при решении задач вычислительного и информационно-логического характера.

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

Структурный подход. В основе технологических принципов структурного программирования лежит утверждение о том, что логическая структура программы может быть выражена комбинацией трех базовых структур: следования, ветвления и цикла. Эти структуры можно комбинировать одну с другой – как путем организации их следований, так и путем создания суперпозиций (вложений одной структуры в другую) – сколь угодно раз для выражения логики алгоритма решения любой задачи. Используя описанные структуры, можно полностью исключить использование каких-либо еще операторов условного и безусловного перехода, что является важным признаком структурного программирования. Направление выполнения команд часто изображают сверху вниз.

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

  • возможность создания программы несколькими программистами;

  • простота проектирования и последующих модификаций программы;

  • упрощение отладки программы – поиска и устранения в ней ошибок;

  • возможность использования готовых библиотек наиболее употребительных модулей.

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

На следующем этапе эти задачи, в свою очередь, разбиваются на более мелкие подчиненные подзадачи и так далее, до уровня относительно небольших подзадач, которые требуют для решения небольших модулей. Такой метод проектирования программ позволяет преодолеть проблему сложности разработки программы, ее последующей отладки и сопровождения.

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

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

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

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

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

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

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

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

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

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

Логическое программирование. Логическое или реляционное программирование связывают с появлением языка PROLOG (PROgramming in LOGic). Этот язык был создан французским ученым А. Комельрое в 1973 году. Языки логического программирования используются в системах искусственного интеллекта.

Центральным понятием в логическом программировании является понятие отношения. Программа представляет собой совокупность определений отношений между объектами (в терминах условий или ограничений) и цели (запроса). Для таких языков применима формула Р. Ковальского: «алгоритм = логика + управление».

Языки логического программирования характеризуются:

  • высоким уровнем;

  • строгой ориентацией на символьные вычисления;

  • возможностью инверсных вычислений, т.е. переменные в процедурах не делятся на входные и выходные;

  • возможной логической неполнотой, поскольку часто невозможно выразить в программе определенные логические отношения, а также невозможно получить из программы все выводы правильные.

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

Объектно-ориентированное программирование. В основе ООП лежит понятие объекта, суть которого выражается формулой: «объект = данные + процедуры». Каждый объект интегрирует в себе некоторую структуру данных и доступные только ему процедуры обработки этих данных, называемые методами. Объединение данных и процедур в одном объекте называется инкапсуляцией.

Для описания объекта служат классы. Класс определяет свойства и методы объекта, принадлежащего этому классу. Любой объект можно определить как экземпляр класса.

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

Прототипом ООП послужил ряд средств, входивших в состав языка SIMULA-67. В самостоятельный стиль оно оформилось с появлением языка SMALLTALK, разработанного А. Кеем в 1972 году. К современным ООП языкам относят C++ и Java.

Язык С++ разработан в начале 80-х годов Б. Страуструпом. В 1990 году Д. Гослинг разработал ООП язык Oak. Новая интегрируемая в Internet версия языка получила название Java.

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

Принципиальной разницей между С++ и Java является то, что первый является компилируемым, а второй – интерпретируемым.

Pascal также поддерживает средства ООП.

В последнее время популярны системы визуального программирования. Это Visual Basic, Delphi, С++ Builder, Visual С++.