Составители:
Рубрика:
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
- …
- следующая ›
- последняя »
