5.2.5.4. Системы построения срезов программы
Программный срез состоит из всех операторов программы, которые могут влиять на значение некоторой переменной в некоторой позиции. Срезы были введены для использования:
в отладке программ;
в тестировании программ;
в понимании смысла программ.
Причины возникновения данного направления очевидны. При работе с исходным текстом программы часто необходимо проследить формирование значения некоторой переменной. Это особенно актуально. при отладке и. сопровождении программ. В этом случае получение среза приносит существенное облегчение работы, поскольку резко снижается объем исследуемого кода. Предположим, что во время тестирования мы установили, что некоторая переменная в некоторой позиции содержит неверное значение. Получив соответствующий срез, мы локализуем проблему. В дополнение к сказанному, срезы позволяют разбить большую программу на небольшие компоненты. Это способствует более простому пониманию смысла программы, что очень актуально при сопровождении программных продуктов. Впоследствии часть этих компонентов может быть использована при создании новой программы. Бадгер и Вейзер продемонстрировали [Badger, Weiser 1988], как срезы могут быть использованы для автоматической параллелизации. Однако основной областью применения срезов остается отладка и сопровождение программ.
В начальном понимании понятие срез (статический срез) учитывает все возможные пути исполнения программы. Однако обычно на практике мы имеем дело с частным случаем, в котором программа работает некорректно, и, естественно, нас интересует причина происходящего. Таким образом, вместо того, чтобы отслеживать все множество входных данных, мы будем рассматривать срез, который сохранит свойства программы для определенного входа. Такой тип среза был обозначен термином динамический срез.
Большинство существующих методов вычисления динамического среза основано на так называемом обратном анализе, когда после исполнения программы записывается ее трассировка, и затем алгоритм отслеживает эту трассировку в обратном направлении для получения зависимостей по данным и по контролю, которые в свою очередь используются для вычисления динамического среза. Существуют методы, вычисляющие динамический срез в процессе исполнения программы и не записывающие трассировку.
Практически все существующие методы вычисления динамического среза рассчитаны на работу с программами, написанными в стиле структурного программирования. Бол и Хорвиц [Ball, Horwitz 1993] предложили подход для вычисления статических срезов для неструктурированных программ, модифицировав понятие зависимости по контролю для данного случая.
В существующих алгоритмах основной целью вычисления динамического среза является определение той части кода, которая влияет на значение интересующей переменной, путем выявления зависимостей по данным и по контролю (см. разд. 4.3.3.6) в трассировке. При определении динамического среза важно найти не только части, влияющие на процесс вычисления интересующей переменной, но также и части, не влияющие на него. Чем больше таких не влияющих частей будет найдено, тем меньший динамический срез может быть получен.
- 5. Системы программирования
- 5.1. Введение в системы программирования
- 5.1.1. Основные понятия и определения
- 5.1.2. История и эволюция
- 5.1.2.1. Некоторые важные даты
- 5.1.2.2. Основные этапы в формировании состава систем программирования
- 5.1.2.3. История развития системы программирования компании Borland Inc. На базе языка Pascal
- 5.1.3. Классификация
- 5.1.3.1. Классификация по ориентации на поддержку процессов
- 5.1.3.2. Функциональная классификация
- 5.1.3.3. Классификация по категориям
- 5.1.3.4. Классификация по предоставляемому интерфейсу
- 5.1.4. Проблемы и перспективы развития
- 5.1.5. Рекомендации по литературе
- 5.2. Процесс-ориентированный инструментарий
- 5.2.1. Возникновение и исследование идеи
- 5.2.2. Управление
- 5.2.2.1. Системы управления проектами
- 5.2.2.2. Организационные средства
- 5.2.2.3. Средства оценки качества
- 5.2.3. Анализ требований и проектирование
- 5.2.3.1. Системы на основе структурной методологии
- 5.2.3.2. Системы на основе объектно-ориентированной методологии
- 5.2.4. Программирование (реализация)
- 5.2.4.1. Трансляторы
- 5.2.4.2. Компиляторы
- 5.2.4.3. Системы генерации трансляторов
- 5.2.4.4. Системы анализа корректности программного кода
- 5.2.4.5. Интерпретаторы
- 5.2.4.6. Декомпиляторы
- 5.2.4.7. Усложнители декомпиляции (шифраторы, обфускаторы)
- 5.2.4.8. Системы управления компиляцией и построением программ
- 5.2.5. Тестирование и отладка
- 5.2.5.1. Тестовые мониторы
- 5.2.5.2. Средства отслеживания тестового покрытия
- 5.2.5.3. Средства динамического построения профиля программы
- 5.2.5.4. Системы построения срезов программы
- 5.2.5.5. Отладчики
- 5.2.5.6. Системы отслеживания проблем (ошибок)
- 5.2.6. Ввод в действие
- 5.2.7. Сопровождение
- 5.2.8. Завершение эксплуатации
- 5.3. Универсальный инструментарий
- 5.3.1. Инструменты работы с текстом
- 5.3.1.1. Средства, базирующиеся на регулярных выражениях
- 5.3.1.2. Средства поиска различий
- 5.3.1.3. Средства поиска на основе шаблонов
- 5.3.1.4. Обозреватели и базы данных программ
- 5.3.1.5. Средства обнаружения плагиата
- 5.3.1.6. Текстовые редакторы
- 5.3.1.7. Синтаксически-ориентированные редакторы
- 5.3.1.8. Гипертекстовые средства
- 5.3.2. Системы документирования
- 5.3.3. Системы разработки интерфейсов
- 5.3.4. Системы управления базами данных
- 5.3.5. Системы управления базами знаний и экспертные системы
- 5.3.5.1. Системы искусственного интеллекта
- 5.3.5.2. Механизмы выводов на знаниях
- 5.3.5.3. Неточный вывод на знаниях
- 5.3.6. Электронные библиотеки и инструментарий Интернета
- 5.3.6.1. Парадигма усиления информации
- 5.3.6.2. Профессиональный поиск информации
- 5.3.6.3. Проблемы работы с информационными ресурсами Интернета
- 5.3.6.4. Коллекции информационных ресурсов в Интернете
- 5.3.6.5. Базы данных в Интернете
- 5.3.6.6. Краткая история поисковых средств Интернета
- 5.3.6.7. Искусственный интеллект и задача поиска в Интернете
- 5.4. Инструментарий поддержки процессов некоторых технологических подходов
- 5.4.1. Системы формального преобразования и верификации программ
- 5.4.2. Средства сборочного программирования
- 5.5. Инструментальные системы
- 5.5.1. Инструментальные среды программирования
- 5.5.2. Средства автоматизации разработки программ (case-средства)
- 5.5.3. Интегрированные среды
- 5.5.4. Репозитории проекта
- 5.6. Средства поддержки коллективной разработки
- 5.6.1. Системы разделения файлов
- 5.6.1.1. Система управления версиями файлов
- 5.6.1.2. Система управления пространствами
- 5.6.1.3. Система синхронизации удаленных пространств
- 5.6.2. Системы поддержки работы виртуальных групп
- 5.7. Естественно-языковый интерфейс
- 5.7.1. Диалоговые системы
- 5.7.2. Вопросно-ответные системы
- 5.7.3. Автоматизированные обучающие системы и системы контроля знаний
- 5.7.4. Системы искусственного интеллекта