Common Intermediate Language и системное программирование в Microsoft.Net. Макаров А.В - 96 стр.

UptoLike

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, транслирующих деревья абстрактного син-            ществляется только для переменных, адреса которых не используются.
таксиса в последовательности инструкций.