logo
Konspekt_lektsy_po_ASOU_7

13.12.Технологии повышения безошибочности ит программ

Методы повышения безошибочности ИТ программ разделяют на две группы: методы, применяемые при проектировании и кодировании ИТ-программ и методы и ИТ, применяемые при отладке готовой программы.

К первой группе методов относятся:

- ИТ использования принципов модульного программирования;

- ИТ использования принципов структурного программирования;

- ИТ применения языков высокого уровня;

- ИТ, использующие повышение уровня непроцедурности программы;

- ИТ, применяющие методы синтеза программ по спецификациям и методы автоматического доказательства программы.

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

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

Технологии, применяемые при подготовке программы

Модульное программирование предполагает, что программа разбивается на отдельные части-модули, причем разбиение должно в той или иной мере удовлетворять требованиям, среди которых отметим:

- ИТ ограничения размера модуля (обычно, в пределах 20-100 операторов);

- ИТ семантического выделения отдельных модулей программы (неформальная функционально-структурная декомпозиция);

- ИТ, использующие относительную независимость модуля. Связи между модулями как по управлению, так и по информации в этом случае должны быть минимальными.

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

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

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

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

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

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

Структурное программирование – это технология программирования, в которой разрешено использование только трех видов конструкций: последовательность, выбор, итерация.

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

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

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

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

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

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

Непроцедурность программ позволяет уйти от подобного (а значит, чреватого ошибками) расписывания последовательности действий для выполнения того или иного фрагмента программы. Непроцедурное программирование фрагмента означает задание спецификаций входа и выхода этого фрагмента без указания алгоритма преобразования. Иначе говоря, программист оговаривает, ЧТО НАДО СДЕЛАТЬ, не указывая КАК НАДО СДЕЛАТЬ. Реализация фрагмента по его спецификациям выполняется автоматически. Сама программа при этом не меняется. Примером метода повышения непроцедурности может служить использование макросредств – механизма получения открытых программ, настроенных на значения параметров.

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

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