Системы интерактивной отладки
Системы интерактивной отладки призваны помочь программистам в тестировании и отладке их программ. В настоящее время существует ряд интерактивных отладчиков; однако широкое распространение получили лишь некоторые из них. Значение подобного программного изделия оценивается противоречиво. Неясно, в какой степени низкий процент использования отладочных средств объясняется функциями и поведением самих отладчиков, а в какой − незнанием их возможностей пользователями. Тем не менее, очевидно, что практически любой пользователь испытывает нужду в удобных средствах интерактивной отладки.
Рассмотрим наиболее важные функции систем интерактивной отладки. Наиболее очевидными являются требования, предъявляемые к функциям тестирования устройств (unit test functions) и функциям, связанным со слежением за выполнением, т.е. за наблюдением и контролем за ходом выполнения программы. Например, программист может установить точки останова, по достижении которых происходит останов программы. В результате появится возможность проанализировать ее состояние и провести диагностику обнаруженных ошибок. Затем выполнение программы может быть продолжено. Или же программист может задать условные выражения, которые затем непрерывно вычисляются в процессе выполнения. Как только какое-нибудь из них приобретает значение «истина», выполнение программы останавливается. Аналогично может быть реализован останов программы в результате выполнения заданной последовательности команд. Если же функционирование программы может быть представлено графически, имеет смысл попробовать прогнать ее с различными скоростями, называемыми аллюром (gaits).
В системах отладки должны быть реализованы и такие функции, как трассировка и обратная трассировка. Трассировка (tracing) позволяет следить за ходом выполнения логических операций и за изменением данных. Она может осуществляться на разных уровнях детализации: модульном, подпрограмм, команд ветвлений и т.п. Трассировка может также основываться на вычислении условных выражений, о чем говорилось выше. Обратная трассировка (traceback) может показать маршрут, который привел к текущему оператору. С ее помощью можно увидеть, какой оператор изменил значение данной переменной или параметра. Такая информация должна быть представлена в символической форме. Например, выдавать номера операторов.
В отладочной системе важно иметь также хорошие средства отображения программ. Должна существовать и возможность вывода отлаживаемой программы вместе с номерами операторов. Пользователю следует разрешить задавать уровень отображения. Например, программа может быть выведена в том виде, как она написана, после макрорасширения и т.п. Полезно также иметь средства модификации и пошаговой перекомпиляции в процессе отладки. При этом система должна сохранять все заданные отладочные спецификации (точки останова, режимы отображения и т.д.), с тем, чтобы программисту не пришлось заново выполнять отладочные команды. Нужно, чтобы существовала и возможность вывода любых переменных и констант в символьном виде и их модификации с последующим продолжением выполнения программы. Тем самым вне зависимости от средств, используемых в действительности, достигается эффект интерпретации.
При реализации в отладочной системе описанных выше функций должен учитываться язык, на котором создана отлаживаемая программа. Многие прикладные системы и средства, предоставляемые пользователю, допускают использование различных языков программирования, при работе с которыми хотелось бы иметь единый отладочный инструмент. Команды отладчика, активизирующие действия и инициирующие сбор данных о выполнении программы, должны быть общими для всех языков. Однако специфику языка тоже нужно принимать во внимание, чтобы процедуры, арифметические и логические операции могли кодироваться с учетом синтаксиса этого языка.
Реализация этих требований оказывает влияние и на отладчик, и на остальное программное обеспечение. При передаче управления отладчику выполнение отлаживаемой программы временно приостанавливается. После этого отладчик должен суметь определить, на каком языке написана программа, и соответствующим образом осуществить настройку. Более того, он должен изменять настройку всякий раз, когда программа, написанная на одном языке, вызывает программу, написанную на другом языке. Чтобы избежать недоразумений, отладчику следует информировать об этом пользователя.
Система обозначений, используемая при задании определенных отладочных функций, соответствует языку отлаживаемой программы. Однако сами функции, по существу, не зависят от исходного языка программирования. Для выполнения операторов отладчик должен иметь доступ к информации, собранной языковым транслятором. Однако внутренние форматы словарей символов у различных трансляторов сильно различаются; это касается и информации по расположению операторов. Трансляторы будущего должны быть настроены на единый интерфейс с системой отладки. Это можно осуществить за счет создания языковыми трансляторами не зависящей от их внутреннего представления и оформляемой в стандартной внешней форме информации для отладчика. Другой способ заключается в создании на этапе трансляции интерфейсных модулей отладчика, которые осуществят преобразование запрашиваемой информации к стандартному виду, не зависящему от языка, на котором написана отлаживаемая программа.
Различного рода проблемы возникают и с памятью, отводимой для переменных. Когда программа транслируется, каждой переменной в основной памяти отводится своя ячейка (home location). Однако, значения переменных в целях увеличения скорости доступа к ним могут время от времени храниться в регистрах. Операторы, обращающиеся к этим переменным, используют значения, находящиеся в регистрах, а не в ячейках памяти. При такой оптимизации не возникает проблем с отображением значений этих переменных. Однако если в процессе отладки пользователь изменит значение переменной в памяти, то оно при возобновлении выполнения программы, вероятно, не будет использовано. Аналогично в случае глобальной оптимизации значение переменной может быть все время присвоено регистру. Тогда соответствующая ей ячейка памяти может вообще не существовать
При разработке программ, а тем более - сложных, используется принцип модульности, разбиения сложной программы на составные части, каждая из которых может подготавливаться отдельно. Модульность является основным инструментом структурирования программного изделия, облегчающим его разработку, отладку и сопровождение.
Программа пишется в виде исходного модуля. Исходный модуль (ИМ) - программный модуль на исходном языке, обрабатываемый транслятором и представляемый для него как целое, достаточное для проведения трансляции.
Первым (не для всех языков программирования обязательным) этапом подготовки программы является обработка ее Макропроцессором (или Препроцессором). Макропроцессор обрабатывает текст программы и на выходе его получается новая редакция текста (на рис. - ИМ'). В большинстве систем программирования Макропроцессор совмещен с транслятором, и для программиста его работа и промежуточный ИМ' "не видны". Следует иметь в виду, что Макропроцессор выполняет обработку текста, это означает, с одной стороны, что он "не понимает" операторов языка программирования и "не знает" переменных программы, с другой, что все операторы и переменные Макроязыка (тех выражений в программе, которые адресованы Макропроцессору) в промежуточном ИМ' уже отсутствуют и для дальнейших этапов обработки "не видны". Так, если Макропроцессор заменил в программе некоторый текст A на текст B, то транслятор уже видит только текст B, и не знает, был этот текст написан программистом "своей рукой" или подставлен Макропроцессором.
Следующим этапом является трансляция.
Трансляция - преобразование программы, представленной на одном языке программирования, в программу на другом языке программирования, в определенном смысле равносильную первой.
Как правило, выходным языком транслятора является машинный язык целевой вычислительной системы.
Машинный язык - язык программирования, предназначенный для представления программы в форме, позволяющей выполнять ее непосредственно техническими средствами обработки информации.
Язык Ассемблера - язык программирования, который представляет собой символьную форму машинного языка с рядом возможностей, характерных для языка высокого уровня (обычно включает в себя макросредства).
Объектный модуль - программный модуль, получаемый в результате трансляции исходного модуля.
На рисунке 3.1 показаны этапы, которые проходит программа от своего написания до выполнения
Рисунок 3.1. Этапы, которые проходит программа от своего написания до выполнения
Дата добавления: 2018-11-25; просмотров: 590;