Программа. Информатика ключевой предмет современной школы программирование
Скачать 0.53 Mb.
|
1.2. Парадигмы программированияСтиль - это отражение мышления. Шопенгауэр А. Парадигма (греч. paradeigma - пример, образец) - схема, модель постановки проблем и их решения, методы исследования, господствующие в течение определенного исторического периода в научном обществе. Характерные идеи и методы программирования и соответствующий образ мышления образуют так называемую парадигму программирования. Между парадигмами и языками программирования высокого уровня прямая связь, хочется сказать, изоморфная (противники этой точки зрения будут утверждать что и на Бейсике можно создать «шедевр»...). В большинстве учебников по информатике подразумевается, что суть программирования заключается в знании алгоритмов и определений языка, описанных в них. Но правила конкретного языка программирования можно изучить за несколько часов, соответствующие парадигмы требуют гораздо больше времени как для того, чтобы научиться им, так и для того, чтобы отучиться от них . Примечание. У Йодана Э.[10] приводится следующая притча о классике программирования Э. Дейкстре (элемент фольклора в computer science). Известно, что Э. Дейкстра был мало заинтересован в приеме на старшие курсы университета, где он работал, студентов со знанием Фортрана по той причине, что вместе с этим знанием могли привиться дурные привычки программирования. От него пошло также высказывание, что если знание Фортрана можно сравнить с младенческим расстройством, то уж ПЛ/1 - определенно роковая болезнь. Язык программирования ПЛ/1 ушел в прошлое, сегодня, видимо, о Бейсике можно говорить как о таком типе болезни. Операциональное программирование (языки программирования типа ассемблеров, Бейсика, Фортрана). Программа «собирается» из мелких деталей, отдельных операций и имеет достаточно простую структуру: область глобальных данных и подпрограммы. Уровень абстрагирования - отдельное действие, принципы декомпозиции задачи отсутствуют, во всяком случае, о них не говорят. Нисходящая технология конструирования программ. Суть нисходящего конструирования программ в разбивке большой задачи на меньшие подзадачи, которые могут рассматриваться отдельно. Основными правилами для успешного применения данной технологии являются: формализованное и строгое описание программистом входов функций и выходов всех модулей программы и системы; согласованная разработка структур данных и алгоритмов; ограничение на размер модулей. Нисходящая технология разработки программ не есть свод жестких правил, скорее это основной принцип, допускающий вариации в соответствии с конкретными особенностями решаемой задачи. В свое время в обширной литературе по этому поводу говорилось и о восходящей технологии. В этом случае решение (программа) как бы «складывалось из отдельных кирпичиков», из известных решений подзадач. Таким образом, данной технологией оговаривается определенный принцип декомпозиции и иерархическая структура программы. Если проводить черту, то суть этого этапа развития технологии программирования в том, что «мы не знаем, как этого достичь, у нас нет инструментария для обеспечения процесса правильной разработки программы, но так должно быть». Структурное программирование (языки программирования Паскаль, Модула-2). Профессор Э. Дейкстра был первым инициатором структурного программирования. В 1965 г. он высказал предположение о том, что оператор GO TO мог бы быть исключен из языков программирования. Разумеется, структурное программирование представляет собой нечто большее, чем один лишь отказ от оператора GO TO. Структурное программирование - это некоторые принципы написания программ. Теоретическими основаниями структурного программирования являются: формальные системы теории вычислимости (общие рекурсивные функции, системы Поста, алгоритмы Маркова, лямбда исчисление Чёрча); анализ программ по нисходящей схеме, декомпозиция, основанная на разбивке задач по уровням 0, 1, ..., k. В классической работе Бома и Джакопини [22] показано, что такая структура (иерархическая, разбитая на уровни) может быть реализована в языке, включающем только две управляющие конструкции. Работа [22] имеет фундаментальное значение. По Бому и Джакопини для реализации программ требуется три основных составляющих блока: функциональный блок (или конструкция следования); конструкция обобщенного цикла; конструкция принятия двоичного или дихотомического решения. Пример неструктурированной программы. Характерные черты структурного стиля программирования: простота и ясность (программа легко читается и анализируется, достаточное комментирование); использование только базовых конструкций; отсутствие сетевых структур в программе; отсутствие многоцелевых функциональных блоков; отсутствие неоправданно сложных арифметических и логических конструкций; расположение в строке программы не более одного оператора языка программирования; содержательность имен переменных. При этом процесс нисходящей разработки программы может продолжаться до тех пор, пока не будет достигнут уровень «атомарных» блоков, т. е. базовых конструкций (присвоения, if-then-else, do-while). Итак, если формулировать суть в сжатом виде, то в структурном программировании уточнен принцип декомпозиции задачи (в основном ее алгоритмического аспекта, т.е. действий, однако уровень интеграции действий и данных «на совести» разработчика) и сделана попытка его строгой формализации. Модульное программирование. Достаточно независимые фрагменты задачи оформляются как модули. Создаются библиотеки модулей, разрабатывается механизм включения модулей в разрабатываемую программу. Модуль должен иметь строго определенный интерфейс и скрытую часть, одну точку входа и одну точку выхода. Из фольклора computer science - «модульность в программировании подобна честности в политике: каждый утверждает, что она - одно из его достоинств, но кажется, никто не знает, что она собой представляет, как ее привить, обрести или добиться». Очередной этап развития принципа декомпозиции задачи и абстрагирования. Объектно-ориентированное программирование (языки программирования Турбо Паскаль, начиная с версии 5.5, Смоллток, С++). Характеризуется тремя основополагающими идеями: инкапсуляцией, наследованием, полиморфизмом. Инкапсуляция. Сочетание данных с допустимыми действиями над этими данными приводит к «рождению» нового элемента в конструировании программы - объекта. «Рожденный ползать - летать не может» - и наш объект действует только так, как это в нем заложено и только над тем, что в нем описано. Обращение к данным объекта не через его действия недопустимо. Наследование. Программист для решения определенного класса задач строит иерархию объектов, в которой, и это самое главное, каждый следующий производный объект имеет доступ (наследует) к данным и действиям всех своих предшественников («прародителей»). Характер связей между объектами вертикальный. Полиморфизм. Выделение некоторого действия, т.е. действие должно иметь имя и создание средств использования действия объектами иерархии. Причем каждый объект реализует это действие так, как оно для него подходит. Пример: есть множество геометрических фигур, образующих иерархию. Действие - перемещение по экрану. Мы видим «скачок» в технологии программирования, впервые действия и данные образуют нечто единое - новый уровень абстрагирования. Визуальная технология конструирования программ (система программирования Delphi). Во-первых, полностью поддерживается объектно-ориентированная технология, во-вторых, идеи модульного программирования получают логическое завершение, в-третьих, и это принципиально новое в данной технологии (создан соответствующий инструментарий), программирование реакции на события (любая программа в процессе своей работы с чем-то или кем-то взаимодействует) автоматизировано. Обзор. О спирали развития. Первый виток - операциональный, 1954 -1965 годы (Разбивка по годам достаточно приблизительна, отражает лишь точку зрения авторов.) Языки программирования: FORTRAN I и II, ALGOL 58, 60, COBOL, LISP и др. Нарабатываемые идеи: подпрограмма (подпрограммы возникли до 1950 года, но рассматривались не как элемент абстрагирования, а как средство, упрощающее работу); типы данных и их описание, раздельная компиляция, блочная структура, обработка списков, указатели и т.д. Второй виток - структурный (объединяем этим термином и нисходящее проектирование, и модульное). 1966 - 1985 годы. Языки программирования ПЛ/1, ALGOL 68, Pascal, Simula, C, Ada (наследник ALGOL 68, Pascal, Simula), Clos, C++(возникший в результате слияния C и Simula) и т.д. В 70-е годы созданы тысячи языков и диалектов. Нарабатываемые идеи: подпрограммы как элемент абстрагирования (разработаны механизмы: передачи параметров; вложенности подпрограмм; локальных и глобальных переменных; теория типирования; развитие модулей от группы логически связанных подпрограмм до раздельно компилируемых фрагментов со строго определенным интерфейсом). Третий виток - объектно-ориентированный (включая визуальную технологию), с 1986г. по настоящее время. Языки программирования: Smalltalk, Object Pascal, C++. Основным элементом конструирования программы является модуль, составленный из логически связанных объектов. Вывод. Каждый новый виток, «вбирая» все от предыдущего, решает основную проблему технологии (разработка надежного и эффективного программного проекта с минимальными затратами) новым, более совершенным инструментарием (принципы декомпозиции и абстрагирования, приемы анализа и синтеза и т. д.). Мера дезорганизации (энтропия) программных проектов (имеется в виду весь их «жизненный цикл») как сложных систем уменьшается. Примечание. В данном материале не рассматривалась декларативная ветвь развития программирования(описываются ключевые абстракции задачи, что необходимо сделать, какими свойствами должен обладать результат, но не описывают, каким способом это результат будет получен) . Имеются в виду языки программирования типа Пролога (логическое программирование), Лиспа (функциональное программирование). В 70-е, а особенно, в связи с проектом ЭВМ пятого поколения, в 80-е годы они достаточно интенсивно развивались. Однако полнокровная реализация идей этих систем программирования требует не фон Неймановской архитектуры ЭВМ и на сегодня это не так актуально (не исключено, что очень непродолжительное время), как казалось бы по огромному валу публикаций на эту тематику. |