А.О. Крючков, В.А. Крищенко
2
Межоператорные зависимости и срезы.
Выделяют два типа за-
висимостей между операторами: по данным и по управлению. Зави-
симость по данным оператора
O
2
от
O
1
возникает, когда при выпол-
нении
O
2
используются значения, полученные в
O
1
. Многие работы
по срезам (в частности [1]) определяют эту зависимость через нали-
чие пересечения двух множеств: переменных, значение которых
устанавливается одним оператором (
DEF
(
O
1
)), и переменных, на ко-
торые ссылается другой оператор (
REF
(
O
2
)). В динамических языках
понятие «переменной» зачастую отсутствует, вместо этого исполь-
зуются понятия «значение» и «имя значения», поэтому далее зависи-
мость по данным будет определяться в терминах значений.
Оператор
O
2
зависит от оператора
O
1
по управлению, если ре-
зультат выполнения оператора
O
1
определяет, будет ли выполнен
оператор
O
2
или нет. Зависимости по управлению в структурирован-
ных программах возникают в пределах одной процедуры. Это также
верно для неструктурированных программ, не использующих нело-
кальную передачу управления в форме операторов halt или механиз-
ма исключений и ограничивающихся конструкциями break, continue и
локальным оператором goto. Оператор goto, позволяющий перейти к
произвольной метке в любой части программы, отсутствует в совре-
менных динамических языках.
Зависимости в программе можно представить несколькими спо-
собами, наиболее распространенный среди которых — граф про-
граммных зависимостей (ГПЗ) [6]. Это ориентированный граф, вер-
шинами которого являются множества операторов программы, а дуги
соответствуют зависимостям по данным и управлению (рис. 1).
Рис. 1.
Граф программных зависимостей