tehnologia (1018792), страница 3
Текст из файла (страница 3)
Это, в своюочередь, позволило увеличить сложность программ.Революционным было появление в языках средств, позволяющихоперировать подпрограммами. (Идея написания подпрограммпоявилась13гораздо раньше, но отсутствие средств поддержки в первыхязыковых средствах существенно снижало эффективность ихприменения.) Подпрограммы можно было сохранять ииспользовать в других программах.
В результате былисозданы огромные библиотеки расчетных и служебныхподпрограмм, которые по мере надобности вызывались изразрабатываемой программы.Типичная программа того времени состояла из основнойпрограммы, области глобальных данных и набораподпрограмм (в основном библиотечных), выполняющихобработку всех данных или их части (рис. 1.3). Слабымместом такой архитектуры было то, что при увеличенииколичества подпрограмм возрастала вероятность искажениячасти глобальных данных какой-либо подпрограммой.
Например, подпрограмма поискакорней уравнения на заданном интервале по методу деления отрезка пополам меняетвеличину интервала. Если при выходе из подпрограммы не предусмотреть восстановленияпервоначального интервала, то в глобальной области окажется неверное значение интервала.Чтобы сократить количество таких ошибок, было предложено в подпрограммах размещатьлокальные данные (рис.
1.4).Сложностьразрабатываемогопрограммногообеспечения при использовании подпрограмм слокальными данными по-прежнему ограничиваласьвозможностью программиста отслеживать процессыобработки данных, но уже на новом уровне. Однакопоявление средств поддержки подпрограмм позволилоосуществлять разработку программного обеспечениянескольким программистам параллельно.В начале 60-х годов XX в. разразился «кризиспрограммирования». Он выражался в том, что фирмы,взявшиеся за разработку сложного программногообеспечения, такого, как операционные системы,срывали все сроки завершения проектов [8]. Проектустаревал14раньше, чем был готов к внедрению, увеличивалась его стоимость, и в результатемногие проекты так никогда и не были завершены.Объективновсеэтобыловызванонесовершенствомтехнологиипрограммирования. Прежде всего стихийно использовалась разработка «снизу-вверх»- подход, при котором вначале проектировали и реализовывали сравнительно простыеподпрограммы, из которых затем пытались построить сложную программу.
Вотсутствии четких моделей описания подпрограмм и методов их проектированиясоздание каждой подпрограммы превращалось в непростую задачу, интерфейсыподпрограмм получались сложными, и при сборке программного продуктавыявлялось большое количество ошибок согласования. Исправление таких ошибок,как правило, требовало серьезного изменения уже разработанных подпрограмм, чтоеще более осложняло ситуацию, так как при этом в программу часто вносились новыеошибки, которые также необходимо было исправлять... В конечном итоге процесстестирования и отладки программ занимал более 80 % времени разработки, есливообще когда-нибудь заканчивался. На повестке дня самым серьезным образом стоялвопрос разработки технологии создания сложных программных продуктов,снижающей вероятность ошибок проектирования.Анализ причин возникновения большинства ошибок позволил сформулироватьновый подход к программированию, который был назван «структурным» [19, 23].Второй этап - структурный подход к программированию (60-70-е годы XX в.).Структурный подход к программированию представляет собой совокупностьрекомендуемых технологических приемов, охватывающих выполнение всех этаповразработки программного обеспечения.
В основе структурного подхода лежитдекомпозиция (разбиение на части) сложных систем с целью последующейреализации в виде отдельных небольших (до 40-50 операторов) подпрограмм. Споявлением других принципов декомпозиции (объектного, логического и т.д.) данныйспособ получил название процедурной декомпозиции.В отличие от используемого ранее процедурного подхода к декомпозиции,структурный подход требовал представления задачи в виде иерархии подзадачпростейшей структуры.
Проектирование, таким образом, осуществлялось «сверхувниз» и подразумевало реализацию общей идеи, обеспечивая проработку интерфейсовподпрограмм. Одновременно вводились ограничения на конструкции алгоритмов,рекомендовались формальные модели их описания, а также специальный методпроектирования алгоритмов -метод пошаговой детализации.Поддержка принципов структурного программирования была заложена в основутак называемых процедурных языков программирования. Как правило, они включалиосновные «структурные» операторы передачи управления, поддерживали вложениеподпрограмм, локализацию и ограничение об-15ласти «видимости» данных. Среди наиболее известных языков этой группы стоит назватьPL/1, ALGOL-68, Pascal, С.Одновременно со структурным программированием появилось огромное количествоязыков, базирующихся на других концепциях, но большинство из них не выдержалоконкуренции.
Какие-то языки были просто забыты, идеи других были в дальнейшемиспользованы в следующих версиях развиваемых языков.Дальнейший рост сложности и размеров разрабатываемого программного обеспеченияпотребовал развития структурирования данных. Как следствие этого в языках появляетсявозможность определения пользовательских типов данных. Одновременно усилилосьстремление разграничить доступ к глобальным данным программы, чтобы уменьшитьколичество ошибок, возникающих при работе с глобальными данными. В результатепоявилась и начала развиваться технология модульного программирования.Модульное программирование предполагает выделение групп подпрограмм,использующих одни и те же глобальные данные в отдельно компилируемые модули(библиотеки подпрограмм), например, модуль графических ресурсов, модуль подпрограммвывода на принтер (рис.
1.5). Связи между модулями при использовании данной технологииосуществляются через специальный интерфейс, в то время как доступ к реализации модуля(телам подпрограмм и некоторым «внутренним» переменным) запрещен. Эту технологиюподдерживают современные версии языков Pascal и С (C++), языки Ада и Modula.16Использованиемодульногопрограммированиясущественноупростилоразработку программного обеспечения несколькими программистами. Теперь каждыйиз них мог разрабатывать свои модули независимо, обеспечивая взаимодействиемодулей через специально оговоренные межмодульные интерфейсы. Кроме того,модули в дальнейшем без изменений можно было использовать в других разработках,что повысило производительность труда программистов.Практика показала, что структурный подход в сочетании с модульнымпрограммированием позволяет получать достаточно надежные программы, размеркоторых не превышает 100.000 операторов [10]. Узким местом модульногопрограммирования является то, что ошибка в интерфейсе при вызове подпрограммывыявляется только при выполнении программы (из-за раздельной компиляциимодулей обнаружить эти ошибки раньше невозможно).
При увеличении размерапрограммы обычно возрастает сложность межмодульных интерфейсов, и снекоторого момента предусмотреть взаимовлияние отдельных частей программыстановится практически невозможно. Для разработки программного обеспечениябольшого объема было предложено использовать объектный подход.Третий этап - объектный подход к программированию (с середины 80-х доконца 90-х годов XX в.). Объектно-ориентированное программирование определяется кактехнология создания сложного программного обеспечения, основанная напредставлении программы в виде совокупности объектов, каждый из которыхявляется экземпляром определенного типа (класса), а классы образуют иерархию снаследованием свойств [10, 24, 29].
Взаимодействие программных объектов в такойсистеме осуществляется путем передачи сообщений (рис. 1.6).Объектная структура программы впервые была использована в языкеимитационного моделирования сложных систем Simula, появившемся еще в 60-хгодах XX в. Естественный для языков моделирования способ представленияпрограммы получил развитие в другом специализированном языке моделирования языке Smalltalk (70-е годы XX в.), а затем был использован в новых версияхуниверсальных языков программирования, таких, как Pascal, C++, Modula, Java.Основным достоинством объектно-ориентированного программирования посравнению с модульным программированием является «более естественная»декомпозиция программного обеспечения, которая существенно облегчает егоразработку. Это приводит к более полной локализации данных и интегрированию их сподпрограммами обработки, что позволяет вести практически независимуюразработку отдельных частей (объектов) программы.
Кроме этого, объектный подходпредлагает новые способы организации программ, основанные на механизмахнаследования, полиморфизма, композиции, наполнения. Эти механизмы позволяютконструировать сложные объекты из сравнительно простых. В результатесущественно увеличивается пока-17затель повторного использования кодов и появляется возможность создания библиотекклассов для различных применений.Бурное развитие технологий программирования, основанных на объектном подходе,позволило решить многие проблемы. Так были созданы среды, поддерживающие визуальноепрограммирование, например, Delphi, C++ Builder, Visual C++ и т.д.