Компьютерная техника и компьютерная технология прочно вошли в человеческую жизнь. Развитие научно-технического прогресса невозможно без автоматизации вычислительных процессов. Именно потребность в автоматизации вычислительных процессов стала первоначальным импульсом в развитии программирования.
Традиционная технология программирования формировалась на заре вычислительной техники, когда в распоряжении пользователей были ограниченные ресурсы ЭВМ, а разработчик программ был в то же время и главным ее пользователем. В этих условиях главное внимание обращалось на получение эффективных программ в смысле оптимального использования ресурсов ЭВМ.
В настоящее время, когда сфера применения компьютеров чрезвычайно расширилась, разработка и эксплуатация программ осуществляется, как правило, разными людьми. Поэтому наряду с эффективностью на первый план выдвигаются и другие важные характеристики программ такие, как понятность, хорошая документированность, надежность, гибкость, удобство сопровождения и т.п. Проблема разработки программ, обладающих такими качествами, объясняется трудоемкостью процесса программирования.
ОТЛАДКА В ЛЮБОЙ IDE ЗА 8 МИНУТ // Важнейший навык
Для создания программы появляется необходимость придерживаться определенных принципов и новых технологий программирования.
В наше время из-за постоянного прогресса компьютерных технологий программирование играет важнейшую роль в жизнедеятельности человека.
Чтобы компьютер выполнил решение, какой либо задачи ему необходимо получить от человека инструкцию, как ее решать, набор таких инструкций для компьютера, направленной на решение какой-либо задачи называется – программой.
Программирование – процесс создания компьютерных программ или программного обеспечения с помощью языков программирования. Программирование сочетает в себе элементы фундаментальных наук, таких как математика, высшая математика и инженерия.
Язык программирования – формальная знаковая система, предназначенная для записи программ. Со времени создания первых программируемых машин человечество придумало уже более восьми с половиной тысяч языков программирования. Каждый год их число пополняется новыми. Некоторыми языками умеет пользоваться только небольшое число их собственных разработчиков, другие становятся известны миллионам людей. Профессиональные программисты иногда применяют в своей работе более десятка разнообразных языков программирования.
В процессе создания любой программы можно выделить следующую последовательность этапов:
1 этап. Постановка задачи: на этом этапе участвует человек хорошо представляющий предметную область задачи. Он должен четко определить цель, задачи, дать словесное описание содержания задачи и предложить общий подход к ее решению, анализируются характер и сущность всех величин, используемых в задаче, и определяются условия, при которых она решается, иначе говоря, на этом этапе формируется условие задачи. Этот этап очень важен, так как от правильного понимания целей и требований зависит в основном успех реализации создаваемой программы.
Урок 16 (часть 1): Отладка программ с помощью дебагера
2 этап. Анализ задачи и моделирования: целью этого этапа является математическая модель или математическая постановка. На этом этапе выполняются следующие пункты
1) Определяются исходные данные и их типы.
2) Решение задачи описывается в виде аналитических зависимостей (уравнения, функции).
3) Определяются конечные данные и их типы.
Таким образом формируется математическая модель с определенной точностью, допущениями и ограничениями. При этом в зависимости от специфики решаемой задачи могут быть использованы различные разделы математики и других дисциплин.
3 этап. Алгоритмизация задачи и составление блок-схемы: выполняется на основе математического описания программы. На данном этапе составляется алгоритм решения задачи согласно действиям, задаваемым выбранным методом решения. Процесс обработки данных разбивается на отдельные относительно самостоятельные блоки, и устанавливается последовательность выполнения блоков. Разрабатывается блок-схема алгоритма.
4 этап. Программирование: на этом этапе алгоритм решения задачи переводится на конкретный язык программирования. Для программирования обычно используются языки высокого уровня, поэтому составленная программа требует перевода ее на машинный язык. После такого перевода выполняется уже соответствующая машинная программа.
5 этап. Отладка и тестирование программы: заключается в поиске и устранении синтаксических и логических ошибок в программе.
В ходе синтаксического контроля программы транслятором выявляются конструкции и сочетания символов, недопустимые с точки зрения правил их построения или написания, принятых в данном языке. Сообщения об ошибках компьютер выдает программисту, при этом вид и форма выдачи подобных сообщений зависят от вида языка и версии используемого транслятора. После устранения синтаксических ошибок проверяется логика работы программы в процессе ее выполнения с конкретными исходными данными.
6 этап. Исполнение отлаженной программы и анализ результатов: после отладки программы ее можно использовать для решения прикладной задачи. При этом обычно выполняется многократное решение задачи на компьютере для различных наборов исходных данных. Получаемые результаты интерпретируются и анализируются специалистом или пользователем, поставившим задачу.
Несмотря на то, что создание программы происходит в несколько этапов, наиболее важным и трудоемким является этап отладки и тестирования программы. Именно на этом этапе устраняются все логические и синтетические ошибки в создаваемой программе.
Отладка – это деятельность, направленная на обнаружение и исправление ошибок в программе.
Тестирование – это процесс выполнения программы на некотором наборе данных, для которого заранее известен результат применения или известны правила поведения этих программ. Таким образом, отладку можно представить в виде многократного повторения трех процессов: тестирования, в результате которого может быть констатировано наличие ошибки, поиска места ошибки в программе и редактирования программы и документации с целью устранения обнаруженной ошибки. Таким образом, все вышесказанное можно представить формулой:
Отладка = Тестирование + Поиск ошибок + Редактирование.
Успех отладки в значительной степени предопределяет рациональная организация тестирования. При отладке отыскиваются и устраняются, в основном, те ошибки, наличие которых устанавливается при тестировании. Как было уже отмечено, тестирование не может доказать правильность программы, в лучшем случае оно может продемонстрировать наличие в нем ошибки.
Поэтому возникает две задачи. Первая: подготовить такой набор тестов, чтобы обнаружить в нем по возможности большее число ошибок. Однако чем дольше продолжается процесс тестирования, тем большей становится стоимость программы. Отсюда вторая задача: определить момент окончания отладки. Признаком возможности окончания отладки является полнота охвата пропущенными через программу тестами, и относительно редкое проявление ошибок в проверяемой программе на последнем отрезке процесса тестирования.
Есть различные подходы и средства отладки; в качестве основного средства используются встроенные программные отладчики, которые включают в себя пользовательский интерфейс для пошагового выполнения программы: оператор за оператором, функция за функцией, с остановками на некоторых строках исходного кода или при достижении определённого условия.
Кроме использования встроенных программных отладчиков существуют и другие методы отладок программы: использование внутрисхемного эмулятора, отладка при помощи внешних программных отладчиков и отлаживаемым устройством с записанным в память программ двоичным кодом программы.
Внутрисхемный эмулятор с отображением переменных языка программирования на дисплее компьютера оказывает значительную помощь при отладке программ непосредственно на разрабатываемой аппаратуре. Этот метод отладки предоставляет наиболее удобную среду, когда можно непосредственно в отлаживаемом устройстве останавливать программу, контролировать выполнение программы непосредственно по исходному тексту программы, состояние внешних портов и внутренних переменных, как входящих в состав микросхемы, так и объявленных при написании исходного текста программы. До недавнего времени внутрисхемный эмулятор являлся отдельным устройством, подключаемым к разрабатываемой плате.
Встроенный программный отладчик, входящий в состав интегрированной среды программирования значительно упрощает процесс отладки программы. Но в тоже время она значительно замедляется.
Внешний программный отладчик. В некоторых случаях используется не интегрированная среда программирования, а отдельный транслятор с выбранного языка программирования. Так как объектные форматы различных трансляторов несколько отличаются друг от друга, то в качестве входного файла используется загрузочный модуль в двоичном формате.
Отладка программ заключается в проверке правильности работы программы и аппаратуры. Программа, не содержащая синтаксических ошибок, тем не менее, может содержать логические ошибки, не позволяющие программе выполнять заложенные в ней функции. Логические ошибки могут быть связаны с алгоритмом программы или с неправильным пониманием работы аппаратуры, подключённой к портам микроконтроллера.
Источник: smekni.com
Отладка программы
Это самый трудоемкий этап. Его цель – проверка синтаксической и логической правильности программы, а также определение того, что программа функционирует на всем диапазоне допустимых данных.
В процессе отладки программы выделяются этапы:
1. трансляция исходного текста программы;
2. компоновка программы;
3. выполнение программы с целью определения логических ошибок;
4. тестирование программы.
При трансляции выполняется перевод программы, понятной человеку, на язык, понятный компьютеру. Если цель трансляции – преобразование всего исходного текста на внутренний язык компьютера (т.е. получение некоторого нового кода) и только, то такая трансляция называется также компиляцией. Исходный текст называется также исходной программой или исходным модулем, а результат компиляции – объектным кодом или объектным модулем. Если же трансляции подвергаются отдельные операторы исходных текстов и при этом полученные коды сразу выполняются, такая трансляция называется интерпретацией. Поскольку трансляция выполняется специальными программными средствами, последние носят название компилятора или интерпретатора, соответственно.
В процессе компиляции последовательно выполняются лексический, синтаксический, семантический анализ, генерация промежуточного кода, оптимизация промежуточного кода, генерация внутреннего представления.
Пример 1. Лексический анализ фрагмента программы на Турбо-Паскале, содержащего только один правильно записанный оператор ввода:
где 1 – код названия оператора;
4 – код знака препинания.
Пример 2. Лексический анализ фрагмента программы на Турбо-Паскале, содержащего только один неправильно записанный оператор ввода:
Определяется синтаксическая правильность закодированной в результате лексического анализа цепочки лексем. Например, определяется парность скобок, наличие в нужном месте требуемого знака препинания, соответствие исходного текста структурным правилам того или иного языка программирования, средствами которого была составлена программа. Для решения задачи в исходной (закодированной) цепочке выделяются подструктуры, соответствующие некоторым фрагментам оператора. Например, для оператора ввода в Турбо-Паскале можно определить структуру, представленную на рисунке 1 и соответствующую правилам из примера1 раздела Структурно-стилизованный способ описания алгоритма:
В то же время структура «правильного» оператора ввода определяется схемой:
Поскольку представленные структуры идентичны, оператор read (NABOR,CHISLO); при синтаксическом анализе определяется как правильный.
Именно на этом шаге выявляются ошибки в написании названий операторов: они ведут к некорректной структуре всего оператора. Так, примеру с «неправильным» оператором ввода соответствует структура, показанная на рисунке:
Поскольку структура этого рисунка не соответствует структуре рисунка 1, оператор rread (NABOR,CHISLO); расценивается как синтаксически некорректный: компилятор не найдет в анализируемом фрагменте требуемого действия, которое задается названием оператора, и сообщит об этом программисту.
На этом шаге выявляются ошибки, допущенные программистом в нарушение правил составления программ, например, следующего вида: все переменные и константы перед употреблением в операторах языка должны быть описаны; каждое имя (переменной или константы) должно быть описано только один раз; требуется согласование типов переменных с использующими их функциями и т.д. Так, если вся программа состоит только из оператора
она будет определена как семантически некорректная, поскольку в ней отсутствуют описания вводимых переменных.
Пример 3. Программа
var NABOR, CHISLO: integer;
read (NABOR, CHISLO);
расценивается семантическим анализатором как семантически корректная.
Пример 4. Программа
var CHISLO: integer;
расценивается семантическим анализатором как семантически корректная.
Генерация промежуточного кода
Закодированная цепочка лексем преобразуется в некоторое промежуточное представление, принятое на том или ином компьютере, например, в программу на языке ассемблера (для простоты используем некоторый условный ассемблер).
Пример 5. Программа из примера 4 преобразуется в промежуточный код на условном ассемблере:
$1 DD?; операторы DD описывают переменные: каждый из них
$2 DD?; отводит под переменную 2 байта памяти;
$3 DD?; переменные $1 — $3 вводятся генератором кода как
CHISLO DD?; вспомогательные переменные;
MOVE 1, $1; в операторах MOVE константы или содержимое
MOVE CHISLO, $2; переменных слева от запятой помещаются в переменные и
MOVE $1, AX; регистры процессора (АХ и СХ), указанные справа;
ADD AX, CX; выполняется сложение содержимого регистров АХ и СХ,
; результат остается в регистре АХ
MOVE AX, $3; выполняются перемещения значений, находящихся в
MOVE $3, CHISLO; регистре и переменной, в соответствующие переменные
Полученный код избыточен: в самом деле, выполняется бессмысленная пересылка константы 1 и значения переменной CHISLO сначала в дополнительные переменные $1 и $2, а затем уже в регистры АХ и СХ, которые и используются при сложении. Аналогичные бессмысленные действия выполняются и с результатом сложения. Однако уменьшение размеров кода осуществляется на следующем этапе.
Оптимизация промежуточного кода
Из программы, полученной на предыдущем шаге, устраняются «лишние» операторы, переменные и константы, использование которых не влияет на корректность выполняемых действий.
Пример 6. Оптимизация промежуточного кода для программы из примера 5 приводит ее к виду:
Такой результат связан с тем, что ряд операторов выполняли лишние перемещения данных из одного места хранения в другое. Удаление этих операторов повлекло удаление вспомогательных переменных.
Генерация объектного кода
Программа, полученная в результате оптимизации, преобразуется в машинный код (так называемый объектный модуль), в котором использованы относительные, а не абсолютные адреса основной памяти. Как правило, для получения объектного модуля применяется условная память с начальным адресом 1. Каждый оператор программы преобразуется в машинную команду и размещается, начиная с начального адреса, в той последовательности, в которой он следует в программе. При этом учитывается размер каждого оператора. Пусть командам программы из примера 6 соответствуют машинные команды:
код объем действие
124 1 б сложить содержимое регистров АХ и СХ, результат – в регистре АХ,
125 3 б поместить содержимое регистра АХ по адресу,
126 2 б поместить константу в регистр АХ,
127 3 б поместить содержимое адреса в регистр СХ.
Оператор DD выделяет объем памяти в 2 байта для описываемой переменной. Тогда схема размещения объектного кода имеет вид, представленный в таблице:
Адрес (байт) | Команда | Комментарий |
внутреннее представление | объем (байт) | |
— | Память для переменной CHISLO – результат действия команды DD | |
126 1 | В регистр АХ помещается 1 | |
127 1 | Содержимое адреса 1 помещается в регистр СХ | |
Соответствует действию CHISLO + 1 | ||
125 1 | Содержимое регистра АХ помещается по адресу 1, т.е. выполняется действие CHISLO = CHISLO+1 |
Этот код еще не готов к выполнению: для этого требуется его «ориентация» на те адреса основной памяти, где он будет выполняться.
Следует отметить, что при интерпретации анализу подвергается не вся программа, а отдельные операторы. При этом из названных шагов выполняются лишь первые четыре.
Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:
Источник: studopedia.ru
Отладка программ
Если ошибка очевидна, то можно исправить ее, прекратив выполнение программы. Происходит переход в режим конструктора , в котором вносятся изменения в программу, и программа запускается заново. При перезапуске программа вновь возвращается к начальному состоянию, восстанавливаются исходные значения всех переменных, и из памяти удаляются все приостановленные процедуры.
В режиме отладки программы можно продолжить или прервать выполнение программы, используя кнопки и
или соответствующие команды меню Run. Можно выполнять программу по шагам. При корректировке текста программы в режиме прерывания редактор VB иногда выдает сообщение о невозможности продолжения программы.
Время отладки программ можно существенно сократить, если пользоваться различными средствами VBA , предназначенными для обнаружения ошибок в программах.
17.1. Ошибки и их обнаружение
Ошибки делятся на три категории: ошибки разработки (синтаксические ошибки), ошибки компиляции, ошибки выполнения.
Синтаксическая ошибка – нарушение правил языка VBA. Это может быть некорректный оператор, неверно введенное имя переменной, если объявление переменных обязательно, отсутствие разделителей между аргументами, несоответствие открывающих и закрывающих скобок, отсутствие закрывающих операторных скобок ( End If , Next и др.), неуникальное название процедуры и т.п.
При разработке программ рекомендуется включать опцию автоматической проверки синтаксиса – Auto Syntax Check ; пользоваться контекстно-зависимой подсказкой, которая возникает при наборе имен объектов, их свойств или методов и устанавливается опцией Auto Quick info (см. рис. 15.4).
Для уточнения правил синтаксиса при записи функций и конструкций языка в окне программы можно выделить ключевое слово и нажать клавишу F1. Появится окно справочной системы, которое соответствует выделенному фрагменту кода и показывает допустимую форму записи.
При наборе текста процедур редактор VB немедленно реагирует на синтаксическую ошибку: некорректный оператор выделяется цветом (по умолчанию красным) и причина возникновения ошибки поясняется сообщением. Невозможно запустить процедуру, если в какой-нибудь процедуре любого открытого проекта обнаружена синтаксическая ошибка.
При запуске процедуры происходит процесс проверки уже не отдельных строк, а программы в целом. Вначале выявляются ошибки компиляции, например, повторное объявление переменной в одной процедуре, несоответствие типов переменных присваиваемым значениям.
На этапе выполнения программы выявляются ошибки выполнения, которые не могли быть обнаружены редактором Visual Basic, например, логические ошибки или ошибки вычислений. Примерами логических ошибок могут служить неверные имена или типы переменных, бесконечные циклы, ошибочные условия или неверные размеры массивов. Ошибки вычислений возникают при попытке выполнить недопустимую операцию, например, деление на нуль.
При выявлении ошибки происходит прерывание программы и возникает диалог (рис.17.1), если на вкладке General диалогового окна Options (рис. 15.4) установлена опция Break on All Errors (останов при любой ошибке). Нажатие кнопки Debug переводит программу в режим отладки . Оператор, на котором произошло прерывание, т. е. возникла ошибка, подсвечивается.
Рис. 17.1. Прерывание программы и сообщение об ошибке
Окна отладчика
При отладке программ рекомендуется активно использовать окна Visual Basic.
Окно проверки Immediate Window (иначе «оперативная панель») выводится на экран одноименной командой из меню View или клавишами Ctrl+G и используется для целей:
- отображения информации, получаемой в результате выполнения операторов ( отладочная печать );
- тестирования команд, вводимых непосредственно в этом окне;
- получения или изменения значений переменных или свойств объектов, доступных в выполняемой процедуре.
Окно Immediate полезно при проверке работы однострочных команд. В этом окне доступны те же переменные, которые были доступны выполняемой процедуре в момент прерывания программы, а операторы, вводимые в окне проверки, выполняются в контексте, т. е. так, как если бы они вводились в выполняемую процедуру. Любой оператор, записанный в строке окна или скопированный в это окно из текста процедуры, будет выполнен после нажатия клавиши Enter.
Оператор Debug.Print используется для организации вывода в окно Immediate в режиме выполнения программы ( отладочная печать ). Синтаксис оператора:
- outputlist – список распечатываемых переменных или выражений (указывать необязательно). Если аргумент опущен, выводится пустая строка.
Ссылка на объект Debug является обязательной. В результате выполнения оператора данные отображаются в окне Immediate с учетом национальной настройки, т. е. используется соответствующее форматирование. Значения типа Date выводятся в стандартном кратком формате дат, установленном в системе. Логические значения распечатываются как True или False.
Например, оператор ? 355/113 рассчитает приблизительное значение числа pi, а оператор Debug.Print «value of a», a, расположенный в теле процедуры, распечатает текст «value of a» и значение переменной a на одной строке.
Если во время прерывания программы подвести курсор к идентификатору переменной внутри выполняемой процедуры, рядом с текстовым курсором появится текущее значение переменной в виде контекстной подсказки . Это окно значения переменной. На рис.17.2 показано значение переменной Var_A, равное 2.
Рис. 17.2. Окно значения переменной
На рис.17.3 показано окно локальных переменных (Locals Window), которое отображает все описанные в текущей процедуре Value_A переменные и их значения. Окно высвечивается командой Locals Window из меню View.
В окне локальных переменных можно:
- просмотреть значения любой переменной выполняемых процедур, локальных или определенных на уровне модуля;
- изменить значения переменных.
Когда окно локальных переменных открыто, его обновление происходит автоматически при каждом переключении из режима выполнения в режим прерывания, при пошаговом выполнении процедуры, а также при перемещении по стеку вызова процедур (кнопка Call Stack на рис.17.3).
Рис. 17.3. Окно локальных переменных
Окно контрольных значений (Watches) (рис.17.4) применяется для отслеживания значений переменных или выражений. Можно одновременно задавать несколько контрольных выражений. Можно использовать контрольные значения для задания моментов остановки программы.
Определенное пользователем контрольное выражение позволяет следить в процессе пошагового выполнения программы за изменением значения этого выражения. Контрольные выражения не сохраняются вместе с программой. Для задания и модификации контрольных выражений используются команды Add Watch, Edit Watch и Quick Watch из меню Debug. В команде Add Watch можно задать контекст контрольного выражения (Context), т. е. имя процедуры, имя модуля, имя текущего проекта, для которых будет вычисляться введенное выражение. Таким образом, контекст выводимого значения выражения определяется процедурой и модулем.
Рис. 17.4. Окно контрольных значений
Значения автоматически обновляются в окне Watches при прерывании программы, при переходе к следующему шагу, а также после выполнения каждой инструкции в окне Immediate.
Контрольная точка или точка останова ( Breakpoint ) представляет собой строку процедуры, на которой разработчик во время отладки планирует остановить выполнение программы. Обычно точки останова используются в больших программах с целью определения их поведения. Имеет смысл устанавливать контрольные точки там, где предположительно может возникнуть ошибка, или в местах, которые отмечают прохождение логических частей программы, например, окончание ввода данных, расчет промежуточных результатов и т. п.
При достижении точки останова программа не прерывается, а переходит в режим отладки , который позволяет посмотреть возможное место ошибки и исправить ее.
Поскольку последовательность выполнения операторов программы не всегда очевидна, можно выполнять программу по шагам – команду за командой или процедуру за процедурой. Такой способ выполнения программы носит название трассировка программы. Пошаговое выполнение программы позволяет отследить порядок выполнения операторов и наблюдать реакцию программы на выполнение каждого оператора.
Для запуска пошагового режима можно нажать одну из кнопок панели инструментов Debug (рис. 15.8) или выполнить соответствующие команды из меню Debug. Трассировку можно выполнять с начала программы или с точки останова после прерывания программы. При трассировке на вертикальной полосе слева от выполняемого оператора расположена стрелка – указатель выполняемого оператора.
Источник: intuit.ru