Программа нарезки - Program slicing
Эта статья включает в себя список общих Рекомендации, но он остается в основном непроверенным, потому что ему не хватает соответствующих встроенные цитаты.Август 2012 г.) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
В компьютерное программирование, программа нарезки вычисление набора программных операторов, программный фрагмент, который может повлиять на значения в некоторой интересующей вас точке, называемой критерий нарезки. Программа нарезки может использоваться в отладка чтобы легче было найти источник ошибок. Другие применения нарезки включают: обслуживание программного обеспечения, оптимизация, программный анализ, и управление информационным потоком.
Методы нарезки быстро развивались с момента первоначального определения Марк Вайзер. Сначала нарезка была только статической, то есть применялась к исходному коду без какой-либо другой информации, кроме исходного кода. Богдан Корель и Януш Ласки представил динамическая нарезка, который работает с конкретным выполнением программы (для данной трассировки выполнения).[1] Существуют и другие формы нарезки, например нарезка пути.[2]
Статическая нарезка
Основываясь на первоначальном определении Вайзера,[3] неформально статический программный фрагмент 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) .
Пример
Например, рассмотрим приведенную ниже программу C. Давайте вычислим срез для (запись (сумма), сумма). На значение суммы напрямую влияют утверждения «sum = sum + i + w», если N> 1, и «int sum = 0», если N <= 1. Итак, slice (write (sum), sum) - это объединение трех срезов и оператора int sum = 0, у которого нет зависимостей:
- срез (сумма = сумма + я + ш, сумма) ,
- срез (сумма = сумма + я + ш, я) ,
- срез (сумма = сумма + я + ш, ш) , и
- {int sum = 0}.
Довольно легко увидеть, что slice (sum = sum + i + w, sum) состоит из «sum = sum + i + w» и «int sum = 0», потому что это единственные два предшествующих утверждения, которые могут повлиять на значение суммы в «сумма = сумма + я + ш». Аналогично, slice (sum = sum + i + w, i) содержит только "for (i = 1; i Когда мы объединяем все эти операторы, у нас нет исполняемого кода, поэтому, чтобы сделать фрагмент исполняемым фрагментом, мы просто добавляем конечную скобку для цикла for и объявление i. Результирующий статический исполняемый фрагмент показан ниже исходного кода. Статический исполняемый фрагмент для критериев ( Фактически, большинство техник статической нарезки, включая собственную технику Вайзера, также удаляют Очень быстрый и масштабируемый, но немного менее точный подход нарезки чрезвычайно полезен по ряду причин. Разработчики будут иметь очень низкие затраты и практичные средства для оценки воздействия изменения в течение нескольких минут, а не дней. Это очень важно для планирования внедрения новых функций и понимания того, как изменение связано с другими частями системы. Он также предоставит недорогой тест, чтобы определить, оправдан ли полный, более дорогой анализ системы. Подход с быстрым срезанием откроет новые возможности для исследования показателей и анализа историй на основе срезов. То есть теперь нарезку можно проводить на очень больших системах и на всей истории версий в очень практичные временные рамки. Это открывает двери для ряда экспериментов и эмпирических исследований, которые ранее были слишком дорогостоящими.[4] Использует информацию о конкретном выполнении программы. Динамический срез содержит все операторы, которые фактически влияют на значение переменной в точке программы для конкретного выполнения программы, а не все операторы, которые могли повлиять на значение переменной в точке программы при любом произвольном выполнении программы. Пример, поясняющий разницу между статической и динамической нарезкой. Рассмотрим небольшой фрагмент программного модуля, в котором есть блок итераций, содержащий блок if-else. В обоих int я;int сумма = 0;int товар = 1;int ш = 7;за(я = 1; я < N; ++я) { сумма = сумма + я + ш; товар = товар * я;}записывать(сумма);записывать(товар);
написать (сумма)
, сумма) - это новая программа, показанная ниже.int я;int сумма = 0;int ш = 7;за(я = 1; я < N; ++я) { сумма = сумма + я + ш;}записывать(сумма);
написать (сумма)
утверждение. Поскольку при заявлении написать (сумма)
, значение сумма
не зависит от самого утверждения. Часто срез для конкретного оператора x будет включать более одной переменной. Если V - это набор переменных в операторе x, то срез для (x, V) - это объединение всех срезов с критериями (x, v), где v - переменная в множестве V.Облегченный подход к статической нарезке вперед
Динамическая нарезка
если
и еще
блоки, которые влияют на переменную. В случае статического среза, поскольку весь программный модуль просматривается независимо от конкретного выполнения программы, затронутые операторы в обоих блоках будут включены в срез. Но в случае динамической нарезки мы рассматриваем конкретное выполнение программы, в котором если
блок выполняется, и затронутые операторы в еще
блок не выполняется. Вот почему в этом конкретном случае выполнения динамический срез будет содержать только операторы в если
блокировать.Смотрите также
Примечания
Рекомендации
внешняя ссылка