Главная страница Случайная лекция Мы поможем в написании ваших работ! Порталы: БиологияВойнаГеографияИнформатикаИскусствоИсторияКультураЛингвистикаМатематикаМедицинаОхрана трудаПолитикаПравоПсихологияРелигияТехникаФизикаФилософияЭкономика Мы поможем в написании ваших работ! |
Императивное и объектно-ориентированное программированиеНесмотря на наличие разнообразных подходов к созданию программ и различных технологий программирования, классический процедурный подход, использующий императивные языки программирования, по-прежнему остается определяющим при программной реализации алгоритмов. Основными алгоритмическими конструкциями в этом подходе являются конструкции следования, ветвления и цикла. В 1966 году итальянскими математиками К. Бомом и Д. Якопини (Corrado Bohm, Giuseppe Jаcopini) было показано, что достаточно всего этих трех управляющих конструкций чтобы запрограммировать решение любой алгоритмически разрешимой задачи. Этот не совсем правильно трактуемый результат был одним из доводов в защиту утверждения о ненужности оператора go to в структурном программировании. Деннис Ритчи (Dennis M. Ritchie), которыйтоже называл этот оператор бесконечно неправильным, все же включил goto в стандарт языка С, а другой лауреат премии Тьюринга – Дональд Кнут (D.E. Knuth) указал на случаи, когда эффективность оператора go to превышает его вред для читабельности. Применение структурных переходов, которые ввел в практику и теорию Д. Кнут, избавляет от многих недостатков, присущих методике Э. Дейкстры (Edsger W. Dijkstra), который популяризировал структурное программирование и изгнал оператор go to, как концептуально противоречащий этому стилю. Структурные переходы, то есть переходы только вперед или на более высокий уровень структурной иерархии управления, возникают из-за необходимости выразить мысль о том, что успех либо неудача глобального процесса может выявиться внутри одной из решаемых подзадач, и дальнейшая работа и над текущей задачей, и над всей последовательностью вложенных подзадач становиться бессмысленной. Однако структурные переходы могут оказаться некорректными, когда они осуществляются из функции, являющейся параметром вызова другой функции. В этом случае нужны даже не переходы, а операторы завершения, но они во многих языках программирования действуют лишь на один уровень иерархии вверх, а этого даже теоретически не достаточно. Примером современного общераспространенного языка, в котором подобные операторы завершения корректно реализованы, является язык программирования Java. Различия между существующими языками программирования заключаются не в том, что решение каких-то задач невозможно при использовании определенных языков, эти различия сводятся к тому, насколько легко и эффективно могут быть решены задачи на этих языках. Язык программирования, в терминах которого разработчик думает о проблеме, может менять сам алгоритм. Для иллюстрации связи между языком программирования и способом решения задачи рассмотрим проблему анализа цепей ДНК, возникающую в процессе генетических исследований. Данная проблема может быть сведена к задаче поиска в полинуклеотидной цепи длиной N, состоящей из большого числа мономеров четырех типов (AGCT), повторяющегося участка длины M. Простая программа на языке Fortran, решающая данную задачу, могла бы выглядеть следующим образом: DO 10 I = 1, N-M DO 10 J = 1, N-M FOUND = .TRUE. DO 20 K = 1, M 20 IF (X(I+K-1) .NE. X (J+K-1)) FOUND = .FALSE. IF (FOUND) … 10 CONTINUE Решение проблемы на основе языка, ориентированного на числовые расчеты с применением циклов, привело к тому, что в программе был реализован алгоритм со сложностью О(МxN2), требующий достаточно больших затрат времени на поиск решения. Переформулировав задачу в терминах языка программирования, не ориентированного на использование циклов, можно добиться существенного ускорения процесса решения задачи, несмотря на то, что выбранный язык может оказаться интерпретируемым, а не компилируемым языком. Для этого, вместо того чтобы работать с вектором из N элементов, достаточно представить данные в виде матрицы, имеющей N строк и M столбцов, и отсортировать ее по строкам, используя, тривиальный для выбранного языка, оператор сортировки. Если какой-то фрагмент окажется повторяющимся, то в отсортированной матрице две соседние строки будут идентичными. Алгоритм, использующий сортировку, имеет меньшую сложность, равную О(МxN logN), что существенно ускоряет решение задачи. Таким образом, язык программирования, на котором записывается решение задачи, напрямую влияет на ход мыслей программиста, заставляя его определенным образом подойти к рассмотрению стоящей перед ним проблемы. Объектно-ориентированное программирование не снабжает (в теории) новой вычислительной мощностью, которая позволила бы решать задачи, недоступные для других средств, однако приводит задачу к более естественной форме и наилучшим образом подходит для разработки сложных проектов. С введением объектно-ориентированных абстракций, ориентированных не столько на машину, сколько на человека, происходит расширение класса программируемых задач, то есть задач, которые удается запрограммировать на практике. Суть объектно-ориентированного программирования состоит в решении задач с помощью идентификации соответствующих реальных объектов и обработки, требуемой для этих объектов, и последующим моделировании этих объектов, их процессов и необходимых связей между ними. Объектно-ориентированное программирование может рассматриваться как общая высокоуровневая надстройка над структурным программированием, в которой основными единицами декомпозиции программы являются объекты. С точки зрения процесса функционирования объект можно считать абстрактной машиной, способной отвечать на сообщения, структурно объект можно рассматривать как некоторый набор данных и процедур. Система объектов, динамически продуцируемая программой объектно-ориентированного стиля, является одной из возможных реализаций конечного автомата с потенциально неограниченным числом состояний, представляемых объектами. Термин “объектно-ориентированный” окончательно утвердился с появлением в 1980 году языка Smalltalk 80, который основывался на диссертации Алана Кэя (Alan Kay) и обеспечивал поддержку трех ключевых языковых свойств: абстракции данных, инкапсулирующей в одном объекте данные вместе с методами их обработки и скрывающей доступ к данным, наследования и динамического связывания. Сама концепция объектно-ориентированного программирования появилась значительно раньше и частично использовалась в языке Simula 67, в котором впервые появилось понятие объекта. В отличие от рассмотренных ранее моделей программирования, базирующихся на формальных теориях, объектно-ориентированное программирование основано исключительно на модельном представлении и на данный момент лишено формального обоснования. То, что до настоящего времени объектно-ориентированное программирование развивается в условиях отсутствия каких-либо строгих математических теорий в отношении синтаксиса и семантики, однако, не является препятствием для коммерческих разработок, за исключением, может быть, тех областей, где особое значение придается надежности и безопасности. Общее свойство функционального, логического и объектно-ориентированного программирования состоит в том, что все они пытаются отделить описание вычислений от деталей его реализации, смоделировать реальную проблему, а не вычислительный процесс. 5 Лекция №4
Дата добавления: 2014-11-24; просмотров: 307; Нарушение авторских прав Мы поможем в написании ваших работ! |