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

UptoLike

Динамическая генерация кода
171
Таблица 5.1. Результаты измерений эффективности трех способов вы-
числения выражений
Результаты показывают, что динамическая генерация кода может на
два порядка уменьшить время работы программы.
5.2. Генерация линейных участков кода для
стековой машины
В этом разделе мы рассмотрим специфику генерации линейных уча-
стков кода на языке CIL.
Линейными участками мы будем называть участки кода, не содержа-
щие развилок и защищенных блоков.
5.2.1. Генерация кода для выражений
Вообще говоря, линейные участки кода получаются, главным обра-
зом, в процессе генерации кода для выражений. Естественно, выражения
бывают разные, и заранее неизвестно, какого именно типа выражения
придется генерировать в различных задачах, связанных с динамической ге-
нерацией кода. Поэтому мы рассмотрим некоторый тип выражений, наи-
более часто встречающийся на практике, и покажем, как для выражений
этого типа порождать линейные последовательности инструкций CIL.
5.2.1.1. Абстрактный синтаксис выражений
Пусть наши выражения оперируют с константами, переменными и
параметрами. Разрешим использование в выражениях как значений при-
митивных типов, так и объектов (в частности, массивов). В качестве опе-
раций мы будем использовать четыре арифметические бинарные опера-
ции, унарный минус, обращение к полю объекта, доступ к элементу мас-
сива и вызов экземплярного метода объекта.
Пусть абстрактный синтаксис для наших выражений содержит пра-
вила, приведенные в таблице 5.2.
170
CIL и системное программирование в Microsoft .NET
Способ вычисления Время на создание Время вычисления
значения функции динамической сборки, мс интеграла функции, мс
Интерпретация 29422
дерева выражения
Предварительная 547 172
компиляция в C#
Предварительная 63 172
компиляция в CIL
Правило Описание
Expr ::= const c Некоторая константа. Мы не уточ-
няем тип константы, так как для
дальнейшего изложения это несу-
щественно. Это может быть целое
число, число с плавающей запятой,
строка, значение null
Expr ::= local x Локальная переменная с именем x
Expr ::= arg x Параметр метода с именем x
Expr ::= Expr index Expr Доступ к элементу массива. Здесь пер-
вое выражение должно возвращать
ссылку на массив, а второе – целое
число, означающее индекс элемента
Expr ::= Expr field f Доступ к полю f объекта
Expr ::= minus Expr Унарный минус
Expr ::= Expr BinOp Expr Бинарная арифметическая операция
Expr ::= local x assign Expr Операция присваивания
переменной x значения выражения
Expr ::= arg x assign Expr Операция присваивания параметру
x значения выражения
Expr ::= Expr index Expr Операция присваивания элементу
assign Expr массива значения выражения
Expr ::= Expr field f Операция присваивания полю f
assign Expr объекта значения выражения
Expr ::= Expr call s ArgList Вызов экземплярного метода s для
некоторого объекта с передачей
списка фактических параметров
ArgList ::= Expr ArgList Непустой список фактических па-
раметров метода
ArgList ::= пусто Пустой список фактических пара-
метров
BinaryOp ::= plus Сложение
BinaryOp ::= minus Вычитание
BinaryOp ::= mul Умножение
BinaryOp ::= div Деление
Таблица 5.2. Абстрактный синтаксис выражений
170                         CIL и системное программирование в Microsoft .NET   Динамическая генерация кода                                          171


      Таблица 5.1. Результаты измерений эффективности трех способов вы-              Таблица 5.2. Абстрактный синтаксис выражений
      числения выражений                                                        Правило                            Описание
Способ вычисления     Время на создание            Время вычисления             Expr ::= const c                   Некоторая константа. Мы не уточ-
значения функции      динамической сборки, мс      интеграла функции, мс                                           няем тип константы, так как для
Интерпретация                    –                          29422                                                  дальнейшего изложения это несу-
дерева выражения                                                                                                   щественно. Это может быть целое
Предварительная                 547                           172                                                  число, число с плавающей запятой,
компиляция в C#                                                                                                    строка, значение null
Предварительная                  63                           172               Expr ::= local x                   Локальная переменная с именем x
компиляция в CIL                                                                Expr ::= arg x                     Параметр метода с именем x
                                                                                Expr ::= Expr index Expr           Доступ к элементу массива. Здесь пер-
     Результаты показывают, что динамическая генерация кода может на                                               вое выражение должно возвращать
два порядка уменьшить время работы программы.                                                                      ссылку на массив, а второе – целое
                                                                                                                   число, означающее индекс элемента
5.2. Генерация линейных участков кода для                                       Expr   ::=   Expr field f          Доступ к полю f объекта
стековой машины                                                                 Expr   ::=   minus Expr            Унарный минус
     В этом разделе мы рассмотрим специфику генерации линейных уча-             Expr   ::=   Expr BinOp Expr       Бинарная арифметическая операция
стков кода на языке CIL.                                                        Expr   ::=   local x assign Expr   Операция присваивания
     Линейными участками мы будем называть участки кода, не содержа-                                               переменной x значения выражения
щие развилок и защищенных блоков.                                               Expr ::= arg x assign Expr         Операция присваивания параметру
5.2.1. Генерация кода для выражений                                                                                x значения выражения
     Вообще говоря, линейные участки кода получаются, главным обра-             Expr ::= Expr index Expr           Операция присваивания элементу
зом, в процессе генерации кода для выражений. Естественно, выражения              assign Expr                      массива значения выражения
бывают разные, и заранее неизвестно, какого именно типа выражения               Expr ::= Expr field f              Операция присваивания полю f
придется генерировать в различных задачах, связанных с динамической ге-           assign Expr                      объекта значения выражения
нерацией кода. Поэтому мы рассмотрим некоторый тип выражений, наи-              Expr ::= Expr call s ArgList       Вызов экземплярного метода s для
более часто встречающийся на практике, и покажем, как для выражений
                                                                                                                   некоторого объекта с передачей
этого типа порождать линейные последовательности инструкций CIL.
                                                                                                                   списка фактических параметров
5.2.1.1. Абстрактный синтаксис выражений                                        ArgList ::= Expr ArgList           Непустой список фактических па-
     Пусть наши выражения оперируют с константами, переменными и                                                   раметров метода
параметрами. Разрешим использование в выражениях как значений при-              ArgList ::= пусто                  Пустой список фактических пара-
митивных типов, так и объектов (в частности, массивов). В качестве опе-                                            метров
раций мы будем использовать четыре арифметические бинарные опера-
                                                                                BinaryOp     ::=   plus            Сложение
ции, унарный минус, обращение к полю объекта, доступ к элементу мас-
сива и вызов экземплярного метода объекта.                                      BinaryOp     ::=   minus           Вычитание
     Пусть абстрактный синтаксис для наших выражений содержит пра-              BinaryOp     ::=   mul             Умножение
вила, приведенные в таблице 5.2.                                                BinaryOp     ::=   div             Деление