Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Лекции по дисциплине Информатика и программирование Автор ~ Шульга Т

Работа добавлена на сайт samzan.net:


41

Лекции по дисциплине «Информатика и программирование»

Автор – Шульга Т.Э.

Тема 15. Основные парадигмы программирования

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

Языки программирования высокого уровня

Алгоритмические

(директивные, императивные)

(BASIC, Ada, Pascal, C)

объектно-ориентированные (Smaltalk, C++, Object Pascal, Delphi, Java)

Логические

(Prolog)

функциональные (Lisp, ЛОГО)

Однако отмечалось, что такую классификацию языков нельзя считать полностью корректной и актуальной в современном мире.

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

Структурное программирование

Структурное программирование сосредотачивает свое внимание на логике программы и включает три основных компонента: модульное программирование, структурное кодирование, нисходящее проектирование. Языки,  которые поддерживают эту парадигму программирования называют алгоритмическими (директивными, императивными). К ним относят огромное количество языков в том числе BASIC, Ada, Pascal, C, Simula 67,  Modula.

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

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

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

Восходящее проектирование основано на противоположном процессе.

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

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

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

Функциональный язык содержит набор элементарных функций, набор функциональных форм для построения сложных функций и некоторые структуры для представления данных.

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

Например, список

(А  (B C)   D   (E  (F G)))

состоит из четырех элементов. Первый – это атом A, второй это список (B C), третий  - атом D, а четвертый список (E  (F G)),  содержащий в качестве второго элемента список   (F G).

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

Все записи на функциональном языке представляют собой список. Например (A B C D) читает так: «Функция A применяется к аргументам B,C,D

Примеры функций на языке Scheme (диалекте LISP).

  1.  Функция вычисления факториала

(DEFINE (factorial n)

(IF (  = n 0)

1

 (*n (factorial(-n 1) ))

)

)

DEFINE – специальная форма для определения  функций

factorial – имя функции

n – параметр

IF – оператор ветвления (в языке Scheme всего две управляющие структуры для ветвления и мультиветвления)

  1.  Функция сравнения двух списков

(DEFINE (equallist lis1 lis2)

 (COND

((NULL? lis1) (NULL? lis2))

((NULL? lis2) ‘())

((EQ? (CAR lis1)(CAR lis2))

(equallist (CDR lis1) (CDR lis2)))

 

 (ELSE’ () )

))

)

DEFINE – специальная форма для определения функций

equallist – имя функции

lis1, lis2 – параметры

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

NULL? – стандартная функция, возвращающая «истина» если ее параметр  - пустой список

EQ?  - стандартная функция – возвращающая «истина», если оба ее параметра атомы и эквиваленты между собой, в противном случае – пустой список.

CDR – элементарная функция возвращающая остаток заданного списка после удаления его первого элемента

CAR – элементарная функция, возвращающая первый элемент списка

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

Логическое программирование

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

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

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

mother (joanne, jake)

father (vern, joanne).

Они утверждают, что объект joanne приходится матерью (mother) объекту jake, а объект vern – отцом (father) объекту joanne.

Пример правила:

grandparent(X, Z):-parent (X,Y), parent(Y,Z)

Оно утверждает, что для конкретных значений переменных X, Y, Z и из факта, что X является родителем объекта Y, а объект Y является родителем объекта Z, можно сделать вывод, что объект X является бабушкой или дедушкой grandparent  объекту   Z.

База данных Prolog может интерактивно запрашиваться целевыми утверждениями, например:

father (bob, jane).

В нем  спрашивается является ли объект bob отцом (father) объекта jane. При получении такого запроса система Prolog использует резолюцию, чтобы определить истинность или ложность утверждения.

Применения логического языка программирования не распространено. Как и другие неимперативные походы логическое программирование неэффективно. Она эффективно лишь в некоторых областях, таких как системы управления базами данных и некоторые области искусственного интеллекта.


Объектно-ориентированное программирование (ООП)

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

В 1980 году было официально объявлено о создании языка Smalltalk-80, разработанного в научно- исследовательском центре фирмы Xerox. Этот язык поддерживал абсолютно новую по тому времени концепцию объектно-ориентированного программирования. Он стал родоначальником существующих языков программирования этого класса.

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

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

Приведем основные положения ООП, предложенные  Аланом Кейем.

  1.  Все является объектом.
  2.  Вычисления осуществляются путем взаимодействия (обмена данными) между объектами, при котором один объект требует, чтобы другой объект выполнил некое действие. Объекты взаимодействуют, посылая и получая сообщение. Сообщение - это запрос на выполнение действия, дополненный набором аргументов, которые могут понадобиться при выполнении действия.
  3.  Каждый объект имеет независимую память, которая состоит из других объектов.
  4.  Каждый объект является представителем класса, который выражает общие свойства и общее поведение объектов.
  5.  В классе задается поведение (функциональность) объекта. Тем самым все объекты, которые являются экземплярами одного класса, могут выполнять одни и те же действия.
  6.  Классы организованы в единую древовидную структуру с общим корнем, называемую иерархией наследования. Память и поведение, связанное с экземплярами определенного класса, автоматически доступны любому классу, расположенному ниже в иерархическом дереве.

Основными принципами ООП являются инкапсуляция, наследование и полиморфизм.

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

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

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

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

Использование принципов наследования и полиморфизма

  1.  повышает надежность программы
  2.  сокращает избыточность кода
  3.  сокращает сроки разработки
  4.  дает возможность создания библиотек классов для различных применений

Таким образом, объектно-ориентированное программирование может эффективно использоваться для создания больших надежных программных систем.

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

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

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

Бурное развитие технологий программирования, основанных на объектном подходе, позволило решить многие проблемы. Так были созданы среды, поддерживающие визуальное программирование, например, Delphi, С++ Builder, Visual Studio и т. д. При использовании визуальной среды у программиста появляется возможность проектировать некоторую часть, например, интерфейсы будущего продукта, с применением визуальных средств добавления и настройки специальных библиотечных компонентов. Результатом визуального проектирования является заготовка будущей программы, в которую уже внесены соответствующие коды.

2 Основные идеи структурного кодирования:

основным программным объектом является переменная,

основная операция – операция присваивания,

управление в программе реализуется с помощью основных управляющих конструкций – цепочка, ветвление, цикл.

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




1. Организация адвокатуры
2. Введение.html
3. 1 Англосаксонский витенагемот 4 1
4. Шередарь приглашает волонтеров для проведения очередной реабилитационной смены которая состоится с 9 по 1
5. I. Теоретическое исследование психологической готовности старших дошкольников к школе
6. снижением управляемости
7. Лекція 1 2 години Предмет і завдання курсу методики викладання української мови в початкових класах1
8.  Планування вантажних перевезень
9. Реклама как формы коммуникации вид социальной массовой коммерческой коммуникации формируется и оплачи
10. тематика ~ п23 929 930 931 Математика ~ п
11. Реферат- Армия Пера I
12. Реферат- Государственное регулирование рынка труда в Республике Казахстан
13. На слайдах не варто писати багато тексту інформація має бути представлена творчо з графікою картинками фо
14. Правовая реформа в современной России
15. Проверяемая безударная гласная в корне во втором классе.html
16. МИКРОПРОЦЕССОРНЫЕ СРЕДСТВА И СИСТЕМЫ МИКРОПРОЦЕССОРНЫЕ СРЕДСТВА И СИСТЕМЫ Одобрено
17. Договор долевого строительства
18. Слово о профессиональной журналистской культуре
19. на тему философия эпохи возрождения по дисциплине Философия Выполнил Гамзатов Р
20. з курсу хімії Частина перша вміщує завдання з тем теоретичної частини курсу