Достигающие определения (англ. Reaching definition) — одна из наиболее распространенных и полезных схем потока данных. Зная, где именно в программе может быть определена каждая переменная x при достижении потоком управления каждой точки p, можно получить много информации об этой переменной. В частности, компилятор может выяснить, является ли x константой в точке p, а отладчик может сообщить о возможном использовании в точке p не инициализированной переменной x[1].

Значение термина править

Мы говорим, что определение d достигает точки p, если существует путь от точки, непосредственно следующей за d, к точке p, такой, что d не уничтожается вдоль этого пути. Мы уничтожаем определение переменной x, если существует иное определение x где-то вдоль пути. Интуитивно понятно, что, если определение d некоторой переменной x достигает точки p, то d может быть местом, где последний раз определяется значение x, используемое в p.

Определением переменной x является инструкция, которая присваивает или может присваивать значение переменной x. Анализ программы должен быть консервативным: если мы не знаем, присваивает ли инструкция s значение переменной x, то мы должны считать, что она может сделать это, т.е. что переменная x после инструкции s может иметь либо исходное значение, бывшее у неё до инструкции s, либо новое значение, созданное s[1].

Пример править

Для примера рассмотрим следующий код:

d1 : y := 3
d2 : x := y

где определение d1 достигает определение d2. Однако, в следующем примере:

d1 : y := 3
d2 : y := 4
d3 : x := y

определение d1 не достигает определения d3, потому что определение d2 уничтожает определение переменной y в d1.

Примечания править

Литература править

  • Альфред Ахо, Моника Лам, Рави Сети, Джеффри Ульман. Компиляторы: принципы, технологии и инструментарий = Compilers: Principles, Techniques, and Tools. — 2-е издание. — М.: «Вильямс», 2008. — 1184 с. — 1500 экз. — ISBN 978-5-8459-1349-4.