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

UptoLike

xi
x
4.3. Верификация CIL-кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
4.3.1. Классификация применяемых на практике
алгоритмов верификации . . . . . . . . . . . . . . . . . . . . . . . 147
4.3.2. Особенности верификатора кода, используемого
в .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
4.3.3. Алгоритм верификации . . . . . . . . . . . . . . . . . . . . . . . . 149
4.4. Библиотеки для создания метаинструментов . . . . . . . . . . . . 152
4.4.1. Metadata Unmanaged API . . . . . . . . . . . . . . . . . . . . . . . 153
4.4.2. Reflection API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
4.4.3. Сравнение возможностей библиотек . . . . . . . . . . . . . 162
Глава 5. Динамическая генерация кода . . . . . . . . . . . . . . . . . . . . . . . . . . 163
5.1. Введение в динамическую генерацию кода . . . . . . . . . . . . . . 163
5.1.1. Обобщенный алгоритм интегрирования . . . . . . . . . . . 164
5.1.2. Представление выражений . . . . . . . . . . . . . . . . . . . . . . 165
5.1.3. Трансляция выражений в C# . . . . . . . . . . . . . . . . . . . . 166
5.1.4. Трансляция выражений в CIL . . . . . . . . . . . . . . . . . . . 168
5.1.5. Сравнение эффективности трех способов
вычисления выражений . . . . . . . . . . . . . . . . . . . . . . . . 169
5.2. Генерация линейных участков кода для стековой машины . 170
5.2.1. Генерация кода для выражений . . . . . . . . . . . . . . . . . . 170
5.2.2. Оптимизация линейных участков кода . . . . . . . . . . . . 173
5.3. Генерация развилок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
5.3.1. Генерация кода для логических выражений . . . . . . . . 175
5.3.2. Генерация кода для управляющих конструкций . . . . 178
5.3.3. Оптимизация кода, содержащего развилки . . . . . . . . 179
Глава 6. Основы многозадачности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
6.1. Многозадачность в Windows . . . . . . . . . . . . . . . . . . . . . . . . . . 183
6.1.1. Основные понятия . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
6.1.2. Реализация в Windows . . . . . . . . . . . . . . . . . . . . . . . . . . 194
6.2. Общие подходы к реализации приложений с параллельным
выполнением операций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
6.2.1. Асинхронный ввод-вывод . . . . . . . . . . . . . . . . . . . . . . . 202
6.2.2. Асинхронные вызовы процедур . . . . . . . . . . . . . . . . . . 207
6.2.3. Процессы, потоки и объекты ядра . . . . . . . . . . . . . . . 207
6.2.4. Основы использования потоков и волокон . . . . . . . . 212
Глава 3. Common Intermediate Language . . . . . . . . . . . . . . . . . . . . . . . . . . 83
3.1. Поток инструкций языка CIL . . . . . . . . . . . . . . . . . . . . . . . . . . 83
3.1.1. Формат потока инструкций . . . . . . . . . . . . . . . . . . . . . . 83
3.2. Язык CIL: инструкции общего назначения . . . . . . . . . . . 88
3.2.1. Инструкции для загрузки и сохранения значений . . . 88
3.2.2. Арифметические инструкции . . . . . . . . . . . . . . . . . . . . 91
3.2.3. Инструкции для организации передачи управления . 100
3.3. Язык CIL: инструкции для поддержки объектной модели . . 105
3.3.1. Инструкции для работы с объектами . . . . . . . . . . . . . 105
3.3.2. Инструкции для работы с массивами . . . . . . . . . . . . . 108
3.3.3. Инструкции для работы с типами-значениями . . . . . 111
3.3.4. Инструкции для работы с типизированными
ссылками . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
3.4. Язык CIL: обработка исключений . . . . . . . . . . . . . . . . . . . . . 116
3.4.1. Предложения обработки исключений в заголовках
методов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
3.4.2. Инструкции CIL для обработки исключений . . . . . . 119
3.4.3. Правила размещения областей . . . . . . . . . . . . . . . . . . 121
3.4.4. Ограничения на передачу управления . . . . . . . . . . . . 122
3.4.5. Семантика обработки исключений . . . . . . . . . . . . . . . 123
3.5. Синтаксис ILASM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
3.5.1. Основные элементы лексики . . . . . . . . . . . . . . . . . . . . 124
3.5.2. Синтаксис . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
3.5.3. Пример программы . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Глава 4. Анализ кода на CIL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
4.1. Граф потока управления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
4.1.1. Основные элементы графа потока управления . . . . . 133
4.1.2. Блоки обработки исключений в графе потока
управления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
4.1.3. Дерево блоков в графе потока управления . . . . . . . . . 138
4.2. Преобразование линейной последовательности
инструкций в граф потока управления . . . . . . . . . . . . . . . . . . 140
4.2.1. Создание массива узлов . . . . . . . . . . . . . . . . . . . . . . . . 141
4.2.2. Создание дерева блоков . . . . . . . . . . . . . . . . . . . . . . . . 142
4.2.3. Присвоение родительских блоков узлам графа . . . . . 145
4.2.4. Формирование дуг . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
x                                                                                                                                                                                                                         xi


Глава 3. Common Intermediate Language . . . . . . . . . . . . . . . . . . . . . . . . . . 83                      4.3. Верификация CIL-кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
     3.1. Поток инструкций языка CIL . . . . . . . . . . . . . . . . . . . . . . . . . . 83                             4.3.1. Классификация применяемых на практике
           3.1.1. Формат потока инструкций . . . . . . . . . . . . . . . . . . . . . . 83                                      алгоритмов верификации . . . . . . . . . . . . . . . . . . . . . . . 147
           3.2. Язык CIL: инструкции общего назначения . . . . . . . . . . . 88                                         4.3.2. Особенности верификатора кода, используемого
                                                                                                                               в .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
           3.2.1. Инструкции для загрузки и сохранения значений . . . 88
                                                                                                                        4.3.3. Алгоритм верификации . . . . . . . . . . . . . . . . . . . . . . . . 149
           3.2.2. Арифметические инструкции . . . . . . . . . . . . . . . . . . . . 91
                                                                                                                  4.4. Библиотеки для создания метаинструментов . . . . . . . . . . . . 152
           3.2.3. Инструкции для организации передачи управления . 100
                                                                                                                        4.4.1. Metadata Unmanaged API . . . . . . . . . . . . . . . . . . . . . . . 153
     3.3. Язык CIL: инструкции для поддержки объектной модели . . 105
                                                                                                                        4.4.2. Reflection API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
           3.3.1. Инструкции для работы с объектами . . . . . . . . . . . . . 105
                                                                                                                        4.4.3. Сравнение возможностей библиотек . . . . . . . . . . . . . 162
           3.3.2. Инструкции для работы с массивами . . . . . . . . . . . . . 108
                                                                                                            Глава 5. Динамическая генерация кода . . . . . . . . . . . . . . . . . . . . . . . . . . 163
           3.3.3. Инструкции для работы с типами-значениями . . . . . 111
                                                                                                                 5.1. Введение в динамическую генерацию кода . . . . . . . . . . . . . . 163
           3.3.4. Инструкции для работы с типизированными
                  ссылками . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115                 5.1.1. Обобщенный алгоритм интегрирования . . . . . . . . . . . 164
     3.4. Язык CIL: обработка исключений . . . . . . . . . . . . . . . . . . . . . 116                                 5.1.2. Представление выражений . . . . . . . . . . . . . . . . . . . . . . 165
           3.4.1. Предложения обработки исключений в заголовках                                                        5.1.3. Трансляция выражений в C# . . . . . . . . . . . . . . . . . . . . 166
                  методов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117              5.1.4. Трансляция выражений в CIL . . . . . . . . . . . . . . . . . . . 168
           3.4.2. Инструкции CIL для обработки исключений . . . . . . 119                                              5.1.5. Сравнение эффективности трех способов
           3.4.3. Правила размещения областей . . . . . . . . . . . . . . . . . . 121                                         вычисления выражений . . . . . . . . . . . . . . . . . . . . . . . . 169
           3.4.4. Ограничения на передачу управления . . . . . . . . . . . . 122                                 5.2. Генерация линейных участков кода для стековой машины . 170
           3.4.5. Семантика обработки исключений . . . . . . . . . . . . . . . 123                                     5.2.1. Генерация кода для выражений . . . . . . . . . . . . . . . . . . 170
     3.5. Синтаксис ILASM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123                    5.2.2. Оптимизация линейных участков кода . . . . . . . . . . . . 173
           3.5.1. Основные элементы лексики . . . . . . . . . . . . . . . . . . . . 124                          5.3. Генерация развилок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
           3.5.2. Синтаксис . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125                5.3.1. Генерация кода для логических выражений . . . . . . . . 175
           3.5.3. Пример программы . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128                         5.3.2. Генерация кода для управляющих конструкций . . . . 178
Глава 4. Анализ кода на CIL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132                    5.3.3. Оптимизация кода, содержащего развилки . . . . . . . . 179
     4.1. Граф потока управления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132            Глава 6. Основы многозадачности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
           4.1.1. Основные элементы графа потока управления . . . . . 133                                        6.1. Многозадачность в Windows . . . . . . . . . . . . . . . . . . . . . . . . . . 183
           4.1.2. Блоки обработки исключений в графе потока                                                            6.1.1. Основные понятия . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
                  управления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134                 6.1.2. Реализация в Windows . . . . . . . . . . . . . . . . . . . . . . . . . . 194
           4.1.3. Дерево блоков в графе потока управления . . . . . . . . . 138                                  6.2. Общие подходы к реализации приложений с параллельным
     4.2. Преобразование линейной последовательности                                                             выполнением операций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
          инструкций в граф потока управления . . . . . . . . . . . . . . . . . . 140                                  6.2.1. Асинхронный ввод-вывод . . . . . . . . . . . . . . . . . . . . . . . 202
           4.2.1. Создание массива узлов . . . . . . . . . . . . . . . . . . . . . . . . 141                           6.2.2. Асинхронные вызовы процедур . . . . . . . . . . . . . . . . . . 207
           4.2.2. Создание дерева блоков . . . . . . . . . . . . . . . . . . . . . . . . 142                           6.2.3. Процессы, потоки и объекты ядра . . . . . . . . . . . . . . . 207
           4.2.3. Присвоение родительских блоков узлам графа . . . . . 145                                             6.2.4. Основы использования потоков и волокон . . . . . . . . 212
           4.2.4. Формирование дуг . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145