Достигающие определения (reaching definition)• Достигающее определение (reaching definition) для данного оператора A – это
оператор B, в котором изменяется значение некоторой переменной х и существует путь из A в B, при котором отсутствует присвоение значений переменной x.
• int i = 0;• while (i)• {
• i ++;• i = i;• Null;
• }• Null;
Анализ жизни переменных (liveness analysis)• Переменная жива, если в ней находится значение, которое может
понадобиться далее по ходу выполнения программы.
• int i = 0;• while (i)• {
• i ++;• i = i;• Null;
• }• Null;
• - множество переменных в операторе S, которые используются до присвоения
• - множество переменных в операторе S, которым присваивается значение
Инициализированность переменных (Definite assignment analysis)Анализ используется для поиска переменных, значения которых используются до присвоения.Анализ входит в стандарты языков Java и C#.
• Any expression or statement e that does not affect the set of variables definitely assigned: after(e) = before(e)
• Let e be the assignment expression loc = v. Then before(v) = before(e), and after(e) = after(v) U {loc}.
• Let e be the expression true. Then true(e) = before(e) and false(e) = vars(e). In other words, if e evaluates to false, all variables are (vacuously) definitely assigned, because e does not evaluate to false.
• Since method arguments are evaluated left to right, before(argi + 1) = after(argi). After a method completes, out parameters are definitely assigned.
• Let s be the conditional statement if (e) s1 else s2. Then before(e) = before(s), before(s1) = true(e), before(s2) = false(e), and after(s) = after(s1) intersect after(s2).
• Let s be the while loop statement while (e) s1. Then before(e) = before(s), before(s1) = true(e), and after(s) = false(e).
• And so on.
- Пересечение множеств переменных
- "Standard ECMA-334, C# Language Specification". ECMA International. pp. Section 12.3 (pp.122–133). Retrieved December 2, 2008.-http://www.ecma-international.org/publications/standards/Ecma-334.htm
Available expression
Анализ направлен для определения для каждой точки программы множества выражений, не требующих перевычисления
Сonstant propagation (распространение констант)
int a = 30; int b = 9 - (a / 5); int c; c = b * 4;
if (c > 10) { c = c - 10; }
return c * (60 / a);
return 4;
Для каждой точки программы определяет переменные, имеющие константные значения.
Copy propagation
y = x z = 3 + y
z = 3 + x
Для каждой точки программы определяет переменные, значения которых совпадают со значениями других переменных
Points-to analysis (pointer analysis)
int x; int y; int* p = unknown() ? &x : &y;
Для каждой точки программы определение для всех указателей переменных (участков памяти), на которые они могут указывать.
Andersen’s algorithm
• Сложность – );• Andersen, Lars Ole (1994).
Program Analysis and Specialization for the C Programming Language (PhD thesis).
while(something()){
list.next = new List();list = list.next;a[i++] = malloc(1);
a[i++] = malloc(2); }
Steensgaard’s algorithm
• Bjarne Steensgaard (1996). "Points-to analysis in almost linear time". "POPL '96: Proceedings of the 23rd ACM SIGPLAN-SIGACT symposium on Principles of programming languages". ACM. pp. 32–41. ISBN 0-89791-769-3.
Alias analysis (анализ псевдонимов)Два указателя являются псемданимами, если они могут указывать на один и тот же участок памяти.
Escape analysis (анализ выходов)
Анализ переменных, значения которых доступны после выхода из функции.
Shape analysis
• Mooly Sagiv; Thomas Reps, Reinhard Wilhelm (May 2002). "Parametric shape analysis via 3-valued logic". ACM Transactions on Programming Languages and Systems (TOPLAS) (ACM) 24 (3): 217–298. doi:10.1145/292540.292552.
Bounds analysis (анализ границ)
Анализ границ, в пределах которых находятся значения переменных.
char c[100];int i=0;for(; i<100; i++)
c[i] = 1;c[i] = 2;