Составители:
Рубрика:
GenStatement[Expr] =
GenExpr[Expr],
pop;
GenStatement[if LogExpr StatementList1 else StatementList2] =
GenLogExpr[LogExpr],
brfalse LABEL1,
GenStatementList[StatementList1],
br LABEL2,
LABEL1: GenStatementList[StatementList2],
LABEL2: ;
GenStatement[while LogExpr StatementList] =
LABEL1: GenLogExpr[LogExpr],
brfalse LABEL2,
GenStatementList[StatementList],
br LABEL1,
LABEL2: ;
GenStatement[do StatementList while LogExpr] =
LABEL: GenStatementList[StatementList],
GenLogExpr[LogExpr],
brtrue LABEL;
GenStatementList[Statement StatementList] =
GenStatement[Statement],
GenStatementList[StatementList];
GenStatementList[пусто] = ;
5.3.3. Оптимизация кода, содержащего развилки
Рассмотрим несколько простых методов оптимизации кода, содер-
жащего развилки, а именно:
• удаление избыточных инструкций сохранения значений в пере-
менных;
• удаление псевдонимов переменных;
• воспроизведение констант;
• удаление неиспользуемых переменных.
Хороших результатов можно достичь, если применять эти методы в со-
вокупности с peephole-оптимизацией. При этом получаемая цепочка опти-
мизирующих преобразований должна выполняться над одним и тем же ко-
дом многократно до тех пор, пока не будет достигнута неподвижная точка.
5.3.3.1. Удаление избыточных инструкций сохранения значений в переменных
Это преобразование уменьшает количество присваиваний. Оно осу-
ществляется только для переменных, адреса которых не используются.
Динамическая генерация кода
179
5.3.2. Генерация кода для управляющих конструкций
Воспользовавшись уже отработанной схемой генерации кода, перей-
дем на уровень выше и рассмотрим генерацию основных структурных уп-
равляющих конструкций.
5.3.2.1. Абстрактный синтаксис управляющих конструкций
В таблице 5.5 приведен абстрактный синтаксис для последовательно-
сти, выбора и циклов с предусловием и постусловием. При записи абст-
рактного синтаксиса используется определенный ранее нетерминал
LogExpr для представления условий выбора и циклов.
5.3.2.2. Отображение абстрактного синтаксиса управляющих
конструкций в CIL
Как уже говорилось, структурные управляющие конструкции допус-
кают рекурсивный алгоритм генерации. Поэтому мы можем определить
набор функций GenStatement, транслирующих деревья абстрактного син-
таксиса в последовательности инструкций.
178
CIL и системное программирование в Microsoft .NET
Правило Описание
Statement ::= Expr Предложение является выражени-
ем. Это может быть, например, вы-
ражение, содержащее операцию
присваивания или вызов метода
объекта
Statement ::= if LogExpr Выбор с двумя альтернативами
StatementList else
StatementList
Statement ::= while Цикл с предусловием
LogExpr StatementList
Statement ::= do Цикл с постусловием
StatementList
while LogExpr
StatementList ::= Непустая последовательность
Statement StatementList предложений
StatementList ::= пусто Пустая последовательность предло-
жений
Таблица 5.5. Абстрактный синтаксис управляющих конструкций
178 CIL и системное программирование в Microsoft .NET Динамическая генерация кода 179 5.3.2. Генерация кода для управляющих конструкций GenStatement[Expr] = GenExpr[Expr], Воспользовавшись уже отработанной схемой генерации кода, перей- pop; дем на уровень выше и рассмотрим генерацию основных структурных уп- GenStatement[if LogExpr StatementList1 else StatementList2] = равляющих конструкций. GenLogExpr[LogExpr], brfalse LABEL1, 5.3.2.1. Абстрактный синтаксис управляющих конструкций GenStatementList[StatementList1], В таблице 5.5 приведен абстрактный синтаксис для последовательно- br LABEL2, сти, выбора и циклов с предусловием и постусловием. При записи абст- LABEL1: GenStatementList[StatementList2], рактного синтаксиса используется определенный ранее нетерминал LABEL2: ; LogExpr для представления условий выбора и циклов. GenStatement[while LogExpr StatementList] = LABEL1: GenLogExpr[LogExpr], Таблица 5.5. Абстрактный синтаксис управляющих конструкций brfalse LABEL2, GenStatementList[StatementList], Правило Описание br LABEL1, Statement ::= Expr Предложение является выражени- LABEL2: ; ем. Это может быть, например, вы- GenStatement[do StatementList while LogExpr] = ражение, содержащее операцию LABEL: GenStatementList[StatementList], присваивания или вызов метода GenLogExpr[LogExpr], объекта brtrue LABEL; GenStatementList[Statement StatementList] = Statement ::= if LogExpr Выбор с двумя альтернативами GenStatement[Statement], StatementList else GenStatementList[StatementList]; StatementList GenStatementList[пусто] = ; Statement ::= while Цикл с предусловием 5.3.3. Оптимизация кода, содержащего развилки LogExpr StatementList Statement ::= do Цикл с постусловием Рассмотрим несколько простых методов оптимизации кода, содер- жащего развилки, а именно: StatementList • удаление избыточных инструкций сохранения значений в пере- while LogExpr менных; StatementList ::= Непустая последовательность • удаление псевдонимов переменных; Statement StatementList предложений • воспроизведение констант; StatementList ::= пусто Пустая последовательность предло- • удаление неиспользуемых переменных. жений Хороших результатов можно достичь, если применять эти методы в со- вокупности с peephole-оптимизацией. При этом получаемая цепочка опти- мизирующих преобразований должна выполняться над одним и тем же ко- 5.3.2.2. Отображение абстрактного синтаксиса управляющих дом многократно до тех пор, пока не будет достигнута неподвижная точка. конструкций в CIL Как уже говорилось, структурные управляющие конструкции допус- 5.3.3.1. Удаление избыточных инструкций сохранения значений в переменных кают рекурсивный алгоритм генерации. Поэтому мы можем определить Это преобразование уменьшает количество присваиваний. Оно осу- набор функций GenStatement, транслирующих деревья абстрактного син- ществляется только для переменных, адреса которых не используются. таксиса в последовательности инструкций.
Страницы
- « первая
- ‹ предыдущая
- …
- 94
- 95
- 96
- 97
- 98
- …
- следующая ›
- последняя »