Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:
Итак, написав определенную программу, вы должны найти и удалить ошибки. Этот процесс обычно называют отладкой (debugging), а ошибки — жучками (bugs). Иногда говорят, что термин жучок возник в те времена, когда аппаратное обеспечение выходило из строя из-за насекомых, случайно заблудившихся среди электронных ламп и реле, заполнявших комнаты. Иногда считают, что этот термин изобрела Грейс Мюррей Хоппер (Grace Murray Hopper), создатель языка программирования COBOL (см. раздел 22.2.2.2). Кто бы ни придумал этот термин пятьдесят лет назад, ошибки в программах неизбежны и повсеместны. Их поиск и устранение
Отладка выглядит примерно так.
1. Компилируем программу.
2. Редактируем связи.
3. Выполняем программу.
Обычно эта последовательность операций выполняется снова и снова: для действительно крупных программ этот процесс повторяется сотни и тысячи раз год за годом. Каждый раз что-то работает не так, как ожидалось, и приходится исправлять какую-то ошибку. Я считаю отладку наиболее утомительной и затратной по времени частью программирования и потратил много времени на то, чтобы минимизировать количество времени, затрачиваемого на отладку. Другие считают, что отладка — это захватывающее занятие, суть программирования, которое затягивает, как видеоигры, и удерживает программиста у компьютера многие дни и ночи (я могу засвидетельствовать это по собственному опыту).
Почему мы так беспокоимся об этом? Описанный выше плохой алгоритм отладки слабо гарантирует успех. К сожалению, это описание — не совсем карикатура. Именно так поступают многие люди, допоздна засиживающиеся за компьютером и ощущающие собственную неполноценность.
Основной вопрос отладки звучит так:
Как понять, что программа действительно работает правильно?
5.9.1. Практические советы по отладке
• Хорошо комментируйте свою программу. Это не значит просто: “Добавьте много комментариев”. Вы не можете сформулировать смысл операции на естественном языке лучше, чем на языке программирования. В комментариях следует ясно и коротко указать то, что невозможно выразить в коде.
• Название программы.
• Цель программы.
• Кто написал программу и зачем.
• Номера версий.
• Какие фрагменты кода могут вызвать сложности.
• Основные идеи.
• Как организован код.
• Какие предположения сделаны относительно вводных данных.
• Каких фрагментов кода пока не хватает и какие варианты еще не обработаны.
• Используйте осмысленные имена.
• Это не значит: “Используйте длинные имена”.
• Используйте логичную схему кода.
• Ваша интегрированная среда программирования может помочь, но она не может сделать за вас всю работу.
• Воспользуйтесь стилем, принятым в книге.
• Разбивайте программу на небольшие фрагменты, каждый из которых выражает определенную логическую операцию.
• Старайтесь, чтобы функция не превышала больше одной-двух страниц; большинство функций будет намного короче.
• Избегайте сложных выражений.
• Пытайтесь избегать вложенных циклов, вложенных инструкций if, сложных условий и т.д. К сожалению, иногда они необходимы, поэтому помните, что в сложном коде легче всего спрятать ошибку.
• Используйте, где только можно, библиотечные функции, а не собственный код.
• Библиотеки, как правило, лучше продуманы и протестированы, чем ваши собственные программы.
Пока все эти советы звучат довольно абстрактно, но скоро мы покажем примеры их применения.
Скомпилируйте программу. Разумеется, для этого понадобится компилятор. Его сообщения обычно весьма полезны, даже если мы хотели бы лучшего, и если вы не профессионал, то должны считать, что компьютер всегда прав. Если же вы реальный эксперт, то закройте книгу — она написана не для вас. Иногда программисту кажется, что правила компилятора слишком тупые и слишком строгие (как правило, это не так), и многие вещи можно было бы сделать проще (как бы не так). Однако, как говорится, “свой инструмент проклинает только плохой мастер”. Хороший мастер знает сильные и слабые стороны своего инструмента и соответственно его настраивает. Рассмотрим наиболее распространенные ошибки компиляции.
• Закрыта ли кавычка строки литералов?
• Закрыта ли кавычка отдельного литерала?
• Закрыта ли фигурная скобка блока?