Построение срезов для программ на динамических языках
5
Метод (рис. 2) предполагает формирование траектории выполне-
ния программы — последовательности записей о каждом выполнен-
ном операторе вместе с информацией о том, от каких других опера-
торов зависел (по данным или управлению) результат выполнения в
каждом конкретном случае.
Рис. 2.
Функциональная схема метода построения срезов
Зависимости по данным прослеживаются на уровне значений
языка. Предполагается, что каждый выполняемый оператор исполь-
зует ноль или более значений, полученных при выполнении других
операторов, и сам вычисляет ноль или более новых значений либо
модифицирует старые значения. Множество операторов, от которого
данный оператор зависит по данным, определяется, таким образом,
через множество использованных им значений.
В динамических языках каждое значение в памяти сопровождается
набором метаданных; наш метод предполагает включение в этот набор
нового поля
DEF_AT
— идентификатора оператора, вычислившего
или последним модифицировавшего это значение. Траектория также
будет содержать информацию о зависимостях по управлению.
Далее подробно рассмотрены основные этапы метода.
Построение траектории.
Для построения траектории выполне-
ния программы нужен модифицированный интерпретатор языка.
Схема измененного процесса выполнения представлена на рис. 3, а
детализация изменений, сделанных в основном цикле интерпретато-
ра, — на рис. 4. Блоки, выделенные серым, не были подвержены из-
менениям.
Формируемая траектория содержит записи нескольких типов, не-
сущих следующую информацию об отношениях между операторами:
зависимость по данным, зависимость по управлению, вызов проце-
дур. Записи о вызовах процедур необходимы для построения меж-
процедурных срезов, где недостаточно одних зависимостей по дан-
ным и управлению [8].