Построение срезов для программ на динамических языках - page 12

А.О. Крючков, В.А. Крищенко
12
Эта проблема продемонстрирована на рис. 7 (показаны только зави-
симости по данным), где видна ложная транзитивная зависимость
между операторами
write
(
m
) и
read
(
i
).
Рис. 7.
Ложные зависимости при отсутствии специального подхода
к построению ГПЗ процедур
Проблема решается вводом отдельных подграфов для каждой про-
цедуры и соединением их с вершинами вызова особыми дугами — ду-
гами вызова и дугами возврата (рис. 8, показаны линиями с точками).
Такой подход описан в работе [8] для статических срезов, но мы вве-
дем отдельный подграф для каждого вызова процедуры, поскольку в
динамических языках структура зависимостей внутри одной проце-
дуры может меняться от вызова к вызову.
Рис. 8.
Дуги вызова и возврата
Для управления подграфами процедур организуем стек подгра-
фов
subgraph_stack
. Изначально в нем содержится пустой подграф
основной программы. Все действия по добавлению вершин и дуг
проводятся с подграфом на вершине стека. Манипуляции со стеком
проводятся при обработке записей
FUNCALL
и
RETURN
.
Дополнительно будем хранить для каждого подграфа
G
i
в стеке
вершину, в которой был сделан вызов процедуры. Далее по тексту
эта вершина обозначается как
LAST_CALL_SITE
(
G
i
). Также в каждом
1...,2,3,4,5,6,7,8,9,10,11 13,14,15,16,17
Powered by FlippingBook