Реферат: Оптимизация программ
4.4.2. Замена переменных в операторах условного перехода и устранение неиспользуемых определений
В результате сокращения глубины операции рекурсивная программная переменая (определенная через саму себя), являющаяся управляющей в операторе условного перехода, может быть заменена в нем генерируемой переменной t(mt- идентификатором).
Это в свою очередь может привести к тому, что рекурсивно определенная программная переменная использоваться в блоке не будет и само определение может быть устранено.
Определение не используется и может быть устранено, если результат определения не является операндом ни одного оператора рекурсивного определения и результат этого последнего не используется ни в каком другом операторе.
Существование неиспользуемых определений до оптимизации является ошибкой программиста. Но после оптимизации такие определения могут возникнуть как результат перестановки и изменения отдельных операторов в процессе оптимизации.
Для данного определения в данном блоке производится поиск использования этого определения во всех последующих командах блока и во всех блоках, которые могут следовать за ним.Поиск прекращается, когда находится оператор, использующий данное определение в качестве аргумента. Если такой оператор в данном и последующих блоках найден не будет, то определение считается неиспользуемым и устраняется.
Как только неиспользуемое определение устранено, все операторы, от которых зависел устраненный оператор, если они нигде больше не используются, могут быть устранены.
4.4.3 Устранение бесполезных операторов и переменных
Если блок содержит такой оператор S, что переменная, которой присваивается значение в S, не является активной после этого оператора, то S - бесполезный оператор. Иными словами,S
- бесполезный оператор, если он присваивает значение переменной, которая не является выходной и на которую нет ссылки в последующих операторах.
Переменная А называется активной после выполнения оператора Si, если
- ей присвоено значение оператором Si;
- ей не присвоены значения операторами Si+1,...Sj;
- на нее ссылается оператор Sj+1.
Если оператор Si присваивает значение переменной А и она неактивна после момента i, то
- при i>0 можно удалить Si из P
- при i=0 можно удалить A из I
Например, пусть B=(P,I,U), где I= A,B,C , U= F,C и P состоит из
F:=A+A
G:=F*C
F:=A+B
G:=A*B
Второй оператор бесполезен, т. к. его область действия пуста. Таким образом, одно применение преобразования устранения бесполезных операторов отображает B в B1=(P1,I,U), где P1 состоит из
F:=A+A
F:=A+B
G:=A*B
Теперь в B1 бесполезна входная переменная C и первый оператор. Применив то же преобразование, можно получить B2=(P2,A,B,U), где P2 состоит из
F:=A+B
G:=A*B
4.5. Экономия памяти