А.О. Крючков, В.А. Крищенко
14
процедур, объединяются в одно множество. Это и будет срез про-
граммы по заданному критерию.
Ограничения метода.
Траектория выполнения программы в опи-
санном методе составляется для одного потока выполнения; соответ-
ственно, описанный метод не применим для многопоточных про-
грамм. Расширить метод до многопоточного варианта можно добавле-
нием идентификатора потока
thread_id
в каждую запись траектории.
Проблемы синхронизации потоков для составления единой траектории
либо сопоставления последовательности записей в различных траек-
ториях во времени в данной работе не рассматриваются.
Способ определения зависимостей по управлению, примененный
в описанном методе, надежно работает только со структурированным
потоком управления. Можно расширить метод для использования с
операторами break и continue, используя результаты работы [10], если
используемое промежуточное представление программы позволяет
отличить break и goto от других типов безусловных переходов. Одна-
ко использование нелокальных переходов в форме выброса исключе-
ний или остановки программы представляет проблему.
Результаты применения метода.
Описанный в работе метод по-
строения срезов программ был реализован для динамического языка
Lua. Для реализации метода был модифицирован стандартный ин-
терпретатор Lua 5.1, использующий байт-код в качестве промежу-
точного представления.
Опыт № 1.
В качестве входа используется традиционно приво-
димая в публикациях по срезам программа, вычисляющая сумму и
произведение чисел от 1 до
N
. Реализация этой программы на языке
Lua выглядит следующим образом.
local i, n, sum, product:
n = io.read(’*number’)
sum = 0
product = 1;
for i = 1, n do
sum = sum + i
product = product * i
end
print(sum)
print(product)
Обработка траектории для
N
= 3 в качестве входных данных дает
ГПЗ, показанный на рис. 9. Зависимости по управлению показаны
прерывистыми стрелками, по данным — сплошными. Результат по-
строения среза по строке
print
(
sum
) в построенном ГПЗ показан на
рис. 10.
Опыт № 2.
В этом опыте продемонстрируем программу, исполь-
зующую вызовы процедур и генерацию кода. Для генерации кода в