На этом шаге мы рассмотрим методы локализации ошибок.
После того как установлено, что в программе или в конкретном ее блоке имеется ошибка, возникает задача ее локализации, то есть установления точного места в программе, где она находится. Можно считать, что процесс локализации ошибок состоит из трех основных компонентов[1]:
Если ошибка найдена, то производится ее исправление; в противном случае осуществляется переход к пункту 1, то есть к получению дополнительных тестовых результатов.
В ходе поиска ошибок программист, анализируя полученные на компьютере результаты, проверяет различные предположения о характере и месте ошибки в программе, которые при этом приходят ему в голову. В случае несоответствия этих гипотез выданным результатам, программист выдвигает новые гипотезы и проверяет их или в уме, или проводя вычисления за столом, или обращаясь за новыми результатами к компьютеру.
В таком характере работы программиста можно найти нечто общее с расчетом вариантов, который осуществляет шахматист (или шашист) во время игры, когда он путем расчетов в уме ищет выигрывающий ход в позиции на шахматной доске, подвергая проверке один из заслуживающих внимания ходов за другим. Не найдя выигрывающего хода, шахматист делает какой-то, по его мнению, хороший ход, приближающий его к цели. Так и программист, не найдя ошибки путем исследования полученных тестовых результатов, делает новое предположение о месте или о характере ошибки, вставляет новую отладочную печать или изменяет программу ("ход программиста"), а ЭВМ выдает новые тестовые результаты ("ход ЭВМ"). Компьютер выступает как своеобразный партнер, задача которого заключается в том, чтобы вскрыть ошибки в рассуждениях программиста, как бы сформулированных им в тексте отлаживаемой программы. Продолжая аналогию, можно сказать, что подобно тому, как нельзя реально надеяться выиграть партию в два-три хода, так же нельзя найти все ошибки в реальной программе за одно-два обращения к компьютеру.
Программистов, успешно проводящих поиск ошибок в программе, можно условно разделить на "аналитиков" и "экспериментаторов" [1].
Аналитики отлаживают программу, редко используя компьютер и применяя простейшие способы получения тестовых результатов на компьютере путем тщательного изучения этих результатов и на основании глубокого и четкого представления о структуре и особенностях алгоритма отлаживаемой программы.
Экспериментаторы ищут ошибки, изощренно используя всевозможные отладочные средства, быстро получая необходимые для все большей и большей локализации ошибок промежуточные результаты и легко ориентируясь в них.
Конечно, идеальным является случай, когда программист сочетает в себе способность к глубокому расчету в уме различных вариантов работы программы и навыки работы с разнообразными отладочными средствами.
Если успех аналитического подхода к поиску ошибок зависит, видимо, от способностей и опыта программиста, то изучение и использование средств, помогающих локализации ошибок - главным образом средств получения необходимых промежуточных результатов, - доступно каждому программисту.
Под промежуточными результатами выполняемой программы договоримся понимать как арифметические результаты, характеризующие значения используемых величин, так и логические результаты, то есть информацию, содержащую сведения о факте или последовательности выполнения операторов программы.
Учтите следующие принципы Г.Майерса [2].
Эксперименты показали, что программисты, избегающие применения средств отладки, даже при отлаживании незнакомых им программ выполняют ее лучше, чем те, кто пользуется этими средствами.
И, наконец,
Сделав это, Вы, вероятно, обнаружите что-то новое. Часто случается так, что просто пересказав задачу хорошему слушателю, Вы вдруг найдете решение без какой-либо помощи с его стороны.
Далее мы начнем рассматривать некоторые способы получения программистом промежуточных результатов, вырабатываемых отлаживаемой программой. В различных системах программирования они сильно отличаются друг от друга. Мы остановимся на Microsoft Access 97, Borland Pascal 7.0, Borland Delphi 4.0, Microsoft Visual C++ 5.0, Turbo Prolog 2.0..
Со следующего шага мы начнем рассматривать средства отладки в Microsoft Access.