Введение

В компьютерном программировании, выделение программы (program slicing) – это вычисление множества операторов программы, называемого срезом программы, которые могут влиять на значения в определенной точке интереса, именуемой критерием выделения. Выделение программы может использоваться при отладке для более легкого определения источника ошибок. Другие области применения выделения включают в себя сопровождение программного обеспечения, оптимизацию, анализ программ и контроль информационных потоков. Методы выделения активно развиваются с момента первоначального определения Марком Вейзером. Изначально выделение было только статическим, то есть применялось к исходному коду без какой-либо информации, кроме самого исходного кода. Богдан Корель и Януш Ласки представили динамическое выделение, которое работает на конкретном выполнении программы (для заданного следа выполнения). Существуют и другие формы выделения, например, выделение по пути.

Статика

Основываясь на первоначальном определении Вайзера, неформально, статический программный срез S состоит из всех операторов в программе P, которые могут повлиять на значение переменной v в операторе x. Срез определяется для критерия выделения C=(x,v), где x – оператор в программе P, а v – переменная в x. Статический срез включает в себя все операторы, которые могут повлиять на значение переменной v в операторе x для любого возможного ввода. Статические срезы вычисляются путем прослеживания зависимостей между операторами в обратном направлении. В частности, для вычисления статического среза для (x,v) мы сначала находим все операторы, которые могут непосредственно повлиять на значение v до того, как будет достигнут оператор x. Рекурсивно, для каждого оператора y, который может повлиять на значение v в операторе x, мы вычисляем срезы для всех переменных z в y, которые влияют на значение v. Объединение всех этих срезов и является статическим срезом для (x,v).

Легкий передовый статический подход к резке

Очень быстрый и масштабируемый, но несколько менее точный метод нарезки (slicing) чрезвычайно полезен по ряду причин. Разработчики получат недорогой и практичный способ оценить влияние изменения за минуты вместо дней. Это очень важно для планирования реализации новых функций и понимания взаимосвязи изменения с другими частями системы. Он также предоставит недорогой способ определить, оправдана ли более полная и дорогостоящая аналитика системы. Быстрый метод нарезки откроет новые направления исследований в области метрик и извлечения информации из истории изменений на основе нарезки. Иными словами, теперь нарезку можно проводить на очень больших системах и по всей истории версий за приемлемое время. Это открывает возможности для ряда экспериментов и эмпирических исследований, которые ранее были слишком затратными.

Динамическое нарезание

Динамическое срезание использует информацию о конкретном выполнении программы. Динамический срез содержит все операторы, которые фактически влияют на значение переменной в заданной точке программы для конкретного выполнения программы, а не все операторы, которые могли повлиять на значение переменной в заданной точке программы для любого произвольного выполнения программы. Рассмотрим пример, чтобы прояснить разницу между статическим и динамическим срезанием. Представим небольшой фрагмент программного модуля, содержащий цикл с блоком if-else. В обоих блоках, if и else, есть несколько операторов, которые влияют на переменную. В случае статического срезания, поскольку рассматривается весь программный модуль вне зависимости от конкретного выполнения программы, в срез будут включены операторы из обоих блоков. Однако, в случае динамического срезания мы рассматриваем конкретное выполнение программы, при котором выполняется блок if, а операторы в блоке else не выполняются. Поэтому, в данном конкретном случае, динамический срез будет содержать только операторы из блока if.