2009-04-05 6 views
4

In der Compiler-Datenflussanalyse, was ist der Unterschied zwischen einem Live-Bereich einer Variablen und es erreicht die Definition? Beide scheinen sich auf das Gleiche zu beziehen ...Live Range vs Reaching Definitionen

Antwort

2

Sie sind sehr unterschiedliche Dinge und ich schlage vor, dass Sie zurückgehen und die Definitionen lesen, die Sie verwirrt haben. Eine reichende Definition einer Variablen für einen Punkt, der die gegebene Variable verwendet, muss unter anderem eine Definition dieser Variablen sein. Die Lebensdauer einer Variablen ist der Teil des Programms, in dem sie verwendet werden kann, der andere Dinge als Definitionen enthält, z. B. Lesen.

Siehe zum Beispiel des 1986 Drachen Buch, Seiten 534 (vielleicht zu allgemein nützlich zu sein) und 610.

3

Erreichen Definitionen werden in Bezug auf eine bestimmte Stelle in einem Programm definiert. Zum Beispiel ist es in Zeile 10 mit dem Code "a = b + c" nützlich für den Compiler zu wissen, was die erreichende Definition von "c" ist, oder mit anderen Worten die Frage zu beantworten "in welcher Aussage hat Variable c a erhalten Wert, der Linie 10 erreichen kann? ".

Live-Bereich ist in Bezug auf eine Variable definiert. Der Lebendbereich von Variable c beginnt bei einer Definition von Variable c und geht bis zur nächsten Definition der Variablen (an der Stelle, an der die Variable gelöscht wird oder als eine andere Variable definiert wird, wenn Sie SSA verwenden) oder am Ende der Variablen Gültigkeitsbereich (Block, Funktion oder Programm) dieser Variablen c existiert.

Die beiden Konzepte sind ähnlich, aber sie sind nicht das Gleiche.

+0

Um @ Anthony's Antwort hinzuzufügen. Live-Bereich ist auch abhängig von dem Teil des Programms, in dem die Variable verwendet wird. Wenn eine Variable definiert und dann mehrmals verwendet wird. Dann für eine lange Strecke des Programms wird es nicht verwendet, bis es getötet wird Ich glaube nicht, Live-Bereich sollte den Teil des Programms enthalten, wo es nicht verwendet wird. –

+0

Wenn Sie den Crontrol-Flow-Graph rückwärts laufen lassen, wird eine Variable als aktiv zwischen einer Verwendung dieser Variablen und ihrer letzten Definition (Zuweisung) vor dieser Verwendung betrachtet. Es ist der Bereich (def, use) nicht der Bereich (def, def). Eine Variable, die niemals verwendet wird, wird überhaupt nicht als lebendig betrachtet, obwohl sie millionenfach definiert ist. –