Технологии повышения безошибочности программ
Конструкции в программе могут комбинироваться друг с другом так, как этого требует программа. Всякая программ, построенная в терминах этих конструкций, может быть постепенно преобразована в одну из этих конструкций. Так реализуется идея вложенной структуры, являющаяся важной в структурном программировании.
Программа, построенная таким образом, является модульной в строгом смысле слова. Потому что, основное в модульном программировании - это возможность замены отдельного модуля его эквивалентом без последствий в остальной части программы.
Принципы структурного программирования реализованы во многих языках программирования. При программировании должны использоваться либо обычные конструктивные операторы для выполнения в линейном порядке, либо перечисленные ранее управляющие средства выбора и повторения.
Структурные программы обладают многими свойствами, облегчающими поиск ошибок. Тем самым повышается надежность программ. Значение структурного программирования не исчерпывается сказанным. По сути, это - дисциплина программирования, представляющая собой, постепенное превращение программирования из ремесла в науку. Наиболее очевидная выгода - рост производительности и уменьшение процента ошибок.
Языки высокого уровня позволяют готовить программу в терминах более соответствующих самой задаче. При программировании на языке высокого уровня не надо учитывать специфику реализации, не надо (или почти не надо) заботиться о распределении ресурсов. В процессе программирования усилия сосредотачиваются на анализе конструктивных средств программы, на связях между ними, на формировании более сложных конструкций. Разные языки высокого уровня предоставляют разные возможности по созданию правильных программ, но в любом случае эти возможности выше, чем в языках типа Ассемблера.
Основные параметры, по которым можно сравнивать языки высокого уровня, с целью выбрать "более надежный" - читабельность подготовленных программ и отсутствие особенностей языка, провоцирующих ошибки.
Непроцедурность программ позволяет уйти от подобного (а значит, чреватого ошибками) расписывания последовательности действий для выполнения того или иного фрагмента программы. Непроцедурное программирование фрагмента означает задание спецификаций входа и выхода этого фрагмента без указания алгоритма преобразования. Иначе говоря, программист оговаривает, ЧТО НАДО СДЕЛАТЬ, не указывая КАК НАДО СДЕЛАТЬ. Реализация фрагмента по его спецификациям выполняется автоматически. Сама программа при этом не меняется. Примером метода повышения непроцедурности может служить использование макросредств - механизма получения открытых подпрограмм, настроенных на значения параметров. Другой пример - использование объектно-ориентированных языков. Предварительная и независимая отлаженность стандартных алгоритмов, привлекаемых для расшифровки спецификаций, позволяет повысить безошибочность подготовленной программы.
Методы синтеза программ и автоматического доказательства их правильности ориентируются на формальные методы, которые позволили бы получать безошибочные, абсолютно правильные программы. По-видимому, построить практическую технологию создания произвольных абсолютно правильных программ невозможно. Но для некоторых классов программ такие исследования ведутся. Тем не менее, в ближайшее время нельзя ожидать реальных синтезаторов и верификаторов для сколько-нибудь практического применения.
Технологии отладка программ
Одна из аксиом программирования гласит: Любая нетривиальная программа содержит хотя бы одну ошибку. Практика показывает справедливость этой аксиомы. Как бы хорошо ни была подготовлена программа, какие бы методы ни применялись при построении программы, следует исходить из "презумпции виновности".
Для обнаружения и устранения ошибок выделяется целый этап - отладка программ. Большинство специалистов считают, что отладка (вместе с тестированием) занимает 50% времени разработки программ.
Цель отладки - изменить программу таким образом, чтобы она была в состоянии решить запланированную задачу.