Смекни!
smekni.com

Программирование 2 (стр. 2 из 2)

Эти затраты быстро увеличиваются при возрастании требований к качеству ПС. По оценкам, приведенным в работе [111], на долю устранения ошибок и сопровождение ПС приходится почти 75% всех затрат. Следует учитывать, что значительная часть работ, выполняемых на этапе сопровождения, связана с поиском и устранением оставшихся в программе ошибок.

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

На этом этапе следует выделить развитие специализированных языков программирования, таких как КОБОЛ, СИМУЛА, СИМСКРИПТ [40], АСПИД [140], АНАЛИТИК [157] и т.д.

Специализированные или проблемно-ориентированные языки [34], построенные для решения конкретных задач, несомненно упрощают процесс разработки программных продуктов в выбранной предметной области, но в то же время для новых языков характерна проблема преемственности, а для специализированных - ограниченности области применения.

Постепенное усложнение решаемых задач, а вместе с ними кодов и объемов разрабатываемых программных средств, заставило критически переосмыслить сложившийся к концу 60-х годов стиль и технику программирования. В связи с чем, начиная с 70-х годов усилиями рабочей группы Технического комитета по программированию Международной федерации по обработке информации (ИФИП), состоящей из таких известных ученых как Н. Вирт, Д. Грис, Э. Дейкстра, У. Дал, Д. Парнас, Ч. Хоар (руководимой профессором В. Турским), формируются основы методологии и теории программирования.

В среде программистов утверждается принцип структурного программирования, как наиболее производительного и привлекательного стиля программирования [26, 41]. Развитие концепции структуризации привело к осознанию необходимости структуризации данных [2], что и определило появление в языках программирования механизмов абстрагирования типов данных (Клу [166], Модула [25] и д.р.). Последнее легло в основу техники модульного программирования, содержательной основой которой является интерпретация типа как алгебры над множеством объектов и множеством операций, а модуля как программного эквивалента абстрактного типа.

В модульном программировании акцент делается на разбиение программы на модули таким образом, чтобы данные (обрабатываемые модулем) были спрятаны в нем. Эта доктрина, известная как “принцип ограничения доступа к данным”, в значительной степени повысила модифицируемость и эффективность порождаемого кода.

Эволюция техники модульного программирования привела к появлению объектно-ориентированного стиля программирования [154, 158, 170], который во многом унифицировал процесс создания ПС. К достоинствам этого метода относится то, что в нем более полно реализуется технология структурного программирования, облегчается процесс создания сложных иерархических систем, появляется удобная возможность создания пользовательских библиотек объектов в различных областях применения.

Параллельно с развитием процедурного стиля программирования в начале 70-х годов появляются непроцедурные языки логического программирования и программирования искусственного интеллекта (LISP [51, 122], PROLOG [15, 114], РЕФАЛ [149], ПРИЗ [61,144]) . Программа в таких языках представляет собой совокупность правил (определяющих отношения между объектами) и цели (запроса). Процесс выполнения программы трактуется как процесс установления общезначимости логической формулы по правилам, установленным семантикой того или иного языка. Результат вычислений является побочным продуктом процедуры вывода. Такой метод являет собой полную противоположность программирования на каком-либо из процедурных языков. Сегодня PROLOG - язык, предназначенный для программирования приложений, использующих средства и методы искусственного интеллекта, создания экспертных систем и представления знаний.

В 80-х годах исследование причин неудач при реализации больших программных проектов [167] показало, что число ошибок в спецификациях на программы значительно превышает их количество в программных кодах. Так около 56% ошибок допускаются на этапе формулировки требований к программе при этом расходуется в среднем 82% всех усилий, затраченных коллективом на устранение ошибок проекта. В то время как на этапе кодирования программ допускается соответственно 7% ошибок и тратится 1% усилий на их ликвидацию [167]. В это время формулируется тезис о том, что целью программирования является не порождение программы как таковой, а создание технологических условий, когда разрабатываемое программное обеспечение легко адаптируется к новым обстоятельствам и новому пониманию решаемой задачи [20, 100]. Р. Хемминг так формулирует этот тезис: “Здравая вычислительная практика требует постоянного исследования изучаемой задачи не только перед организацией вычислений, но также в процессе его развития и особенно на той стадии, когда полученные числа переводятся обратно и истолковываются на языке первоначальной задачи” [148].

Перечисленные выше причины привели в середине 80-х годов к осознанию необходимости реализации интегрированного окружения поддержки всего жизненного цикла ПС и, в первую очередь, этапа проектирования ПС, что обусловило появление инструментальных средств автоматизации проектирования программных систем (CASE-технологий) [155, 171, 172].

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

Применение CASE-инструментов позволяет в значительной степени снизить трудоемкость создания ПС, а в отдельных случаях заменить программирование автоматическим синтезом программ.

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

В последнее время в связи с совершенствованием технических средств отображения информации утверждается новый графический подход к решению проблемы автоматизации разработки ПС, основанный на идее привлечения визуальных форм представления программ, в большей степени соответствующих образному способу мышления человека. Применение графических методов обещает кардинально повысить производительность труда программиста. Кроме того, графическая форма записи по сравнению с текстовым представлением программ обеспечивает более высокий уровень их структуризации, соблюдение технологической культуры программирования, предлагает более надежный стиль программирования [23].

В настоящее время известно достаточно большое количество удачных инструментальных средств визуализации программирования. Прежде всего это относится к визуальным средствам разработки экранных форм, меню и других элементов программы (Microsoft Windows 3.0, Visual BASIC [38, 59,133] и т.д.), средствам автоматизации проектирования программного обеспечения (CASE-средствам), средствам быстрой разработки приложений для информационных систем (Visual FoxPro), текстовым и графическим редакторам, издательским системам и т.д.

В соответствии с “формулой” Н. Вирта [26] программу можно интерпретировать как “Алгоритм + Структуры данных”. Визуальные формы представления алгоритмов программ известны достаточно давно это
Р-технология программирования И. В. Вельбицкого [21], сети Петри [19], наконец, обычные блок-схемы можно считать в определенном смысле графической формой задания алгоритма. Общим для перечисленных выше способов представления алгоритмов является использование “языка” теории графов.

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