А.О. Крючков, В.А. Крищенко
4
ции. Динамическая типизация реализуется путем добавления к каж-
дому значению некоторого набора метаданных. Не зная, какому
классу принадлежит объект, нельзя сказать, какой именно код вы-
полнится при вызове метода этого объекта или при обращении к его
свойству. Следовательно, статическое построение графа зависимо-
стей по управлению невозможно.
Модификация типов данных и объектов
во время выполнения
программы в общем случае означает, что нельзя делать каких-либо
утверждений о типе объекта в произвольный момент времени, если
мы располагаем только информацией о типе в момент его создания.
Эта особенность также означает, что одного идентификатора типа
значения недостаточно, чтобы определить его поведение в качестве
объекта. При использовании программистом модификации типов
данных прослеживание каких-либо зависимостей может осуществ-
ляться только в момент выполнения кода.
Генерация программного кода «на лету»
является наиболее
очевидным препятствием для статического анализа программ на ди-
намических языках, поскольку интересующий нас программный код
буквально отсутствует до начала выполнения программы. Типичной
реализацией генерации кода «на лету» является функция
eval
, при-
нимающая на вход исходный код. После формирования промежуточ-
ного представления сгенерированный код ничем не отличается от
остального кода программы.
Интерпретация
является основным способом выполнения про-
грамм на большинстве динамических языков. Различные виды дина-
мического поведения, описанные выше, делают статическую компи-
ляцию программ на динамических языках в машинный код затрудни-
тельной или невозможной. Вместо этого компиляция обычно осу-
ществляется в некоторое промежуточное представление — байт-код
виртуальной машины языка или абстрактное дерево синтаксиса
(AST) — которое затем подвергается интерпретации.
При наличии интерпретатора для языка появляется возможность
перенести обязанность ведения траектории на интерпретатор, допол-
нив его цикл выполнения инструкций. При наличии исходных тек-
стов интерпретатора можно расширить набор используемых интер-
претатором метаданных, включив в него некоторую информацию,
используемую при построении срезов.
Метод построения срезов.
Для программ на динамических язы-
ках собирать информацию о зависимостях до выполнения программы
не имеет смысла, поэтому приходится получать ее непосредственно
во время выполнения программы. Поскольку для работы метода не-
обходим запуск анализируемой программы, то метод позволяет по-
лучать только динамические срезы.