Составители:
Рубрика:
Динамическая генерация кода
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 Деление
Страницы
- « первая
- ‹ предыдущая
- …
- 90
- 91
- 92
- 93
- 94
- …
- следующая ›
- последняя »