• Название:

    2006 328 с Макаров CIL и системное программиро..


  • Размер: 0.85 Мб
  • Формат: PDF
  • или
  • Сообщить о нарушении / Abuse

Установите безопасный браузер



    Предпросмотр документа

    Редакционная коллегия:
    В.В. Борисенко
    В.С. Люцарев
    И.В. Машечкин
    А.А. Михалев
    Е.В. Панкратьев
    А.М. Чеповский
    В.Г. Чирский
    А.В. Шкред

    Главный редактор серии:
    А.В. Михалев

    МОСКОВСКИМ ГОСУДАРСТВЕННЫМ УНИВЕРСИТЕТОМ
    имени М.В. Ломоносова
    и
    Интернет-Университетом
    Информационных Технологий
    при поддержке корпорации
    Microsoft

    Серия издается совместно

    ОСНОВЫ ИНФОРМАТИКИ И МАТЕМАТИКИ

    Серия учебных пособий по информатике и ее математическим основам открыта в 2005 году с целью современного изложения широкого спектра направлений информатики на базе соответствующих разделов математических курсов, а также примыкающих вопросов, связанных с информационными технологиями.
    Особое внимание предполагается уделять возможности использования материалов публикуемых пособий в преподавании
    информатики и ее математических основ для непрофильных специальностей. Редакционная коллегия также надеется представить вниманию читателей широкую гамму практикумов по информатике и ее математическим основам, реализующих основные алгоритмы и идеи теоретической информатики.
    Выпуск серии начат при поддержке корпорации Microsoft
    в рамках междисциплинарного научного проекта МГУ имени
    М.В. Ломоносова.

    Информация о серии

    Интернет-университет информационных технологий
    Москва • 2006

    Допущено учебно-методическим объединением вузов
    по университетскому политехническому образованию
    в качестве учебного пособия для студентов высших
    учебных заведений, обучающихся по направлению
    «Информатика и вычислительная техника»

    Common Intermediate
    Language и
    системное
    программирование в
    Microsoft .NET

    А.В. Макаров,
    С.Ю. Скоробогатов,
    А.М. Чеповский

    А.В. Макаров, С.Ю. Скоробогатов, А.М. Чеповский
    Common Intermediate Language и системное программирование в
    Microsoft.NET : учеб. пособие для студентов вузов, обучающихся по
    направлению «Информатика и вычисл. техника» / А. В. Макаров,
    С. Ю. Скоробогатов, А. М. Чеповский. – М. : Интернет-Ун-т Информ.
    Технологий, 2006. – 328 с. : ил. – ISBN 5-9556-0055-8.

    © Текст: А.В. Макаров, С.Ю. Скоробогатов, А.М. Чеповский, 2006
    © Оформление: Интернет-университет информационных технологий, 2006

    ISBN 5-9556-0055-8

    Допущено учебно-методическим объединением вузов по университетскому
    политехническому образованию в качестве учебного пособия для
    студентов высших учебных заведений, обучающихся по направлению
    «Информатика и вычислительная техника»

    В книге описаны основы архитектуры платформы .NET и промежуточный язык
    этой платформы – Common Intermediate Language (CIL). Подробно рассмотрен
    прием программирования, называемый динамической генерацией кода. Дано
    введение в многозадачность и описаны подходы к разработке параллельных приложений на базе платформы .NET.
    Адресовано всем изучающим вопросы создания метаинструментария и разработки компиляторов для различных операционных систем.
    Для студентов и преподавателей университетов, а также для специалистов, повышающих свою квалификацию.

    М15

    УДК 004.72(075.8)
    ББК 32.973.202-018
    М15

    Основой данной книги явился учебный курс, задачей которого было
    изучение достижений компьютерных наук в области системного программного обеспечения на примере революционных для практического
    программирования технологий, реализованных в платформе .NET.
    Курс читается на дополнительном образовании механико-математического факультета МГУ им. М.В. Ломоносова и для студентов одной из
    программистских специальностей МГТУ им. Н.Э. Баумана.
    Наш учебник посвящен системному программированию в .NET. Это
    означает, что в нем мы в основном будем затрагивать вопросы, существенные для разработчиков системного программного обеспечения. Поэтому
    из нашего учебника вы ничего не узнаете о технологиях ASP .NET и ADO
    .NET и не научитесь использовать очень удобную библиотеку
    Windows.Forms для создания графического пользовательского интерфейса.
    Кроме всего прочего, языки программирования C# и Visual Basic .NET тоже останутся за кадром нашего изложения. Однако многие примеры в
    учебнике будут написаны на C#, так как мы исходим из предположения,
    что вы уже знакомы с этим языком или способны достаточно легко понять
    примеры на объектно-ориентированном языке программирования.
    Вместо этого книга поможет изучить архитектуру платформы .NET и
    промежуточный язык этой платформы – Common Intermediate Language
    (сокращенно CIL). Реализация концепции промежуточного языка является наиболее интересным достижением современной компьютерной технологии. Именно эта технология и сам промежуточный язык рассматривается в нашей книге.
    Кроме того, мы подробно рассматриваем прием программирования,
    называемый динамической генерацией кода. Этот прием широко использовался еще 10-15 лет назад, но потом в силу некоторых причин стал менее
    популярен. Его смысл заключается в том, что код программы порождается
    прямо во время ее выполнения! Технология .NET, похоже, способна дать
    новый импульс этому направлению программирования, так как в .NET
    включены специальные средства для поддержки динамической генерации
    кода.
    В заключительных двух главах книги обсуждается параллельное программирование, которое становится все более популярным в программистском сообществе из-за бурного развития «материальной части» для высокопроизводительных вычислений. Рассматриваются механизмы многоза-

    ПРЕДИСЛОВИЕ

    дачности и создание приложений с параллельным выполнением операций,
    предоставляемых ядром операционной системы Windows. Обсуждается реализация параллельного выполнения кода в .NET, использование библиотечных средств платформы .NET для создания параллельных приложений.
    Изложение материала основывается на документированной спецификации [1 - 5]. В краткий список русскоязычной литературы [6 – 11] внесены книги, которые можно использовать для углубления знаний по рассмотренным темам.
    Материалы книги могут использоваться в соответствии с требованиями «Совокупности знаний по информатики» рекомендаций Компьютерного общества Института инженеров по электротехнике и электронике
    (IEEE-CS) и Ассоциации по вычислительной технике (ACM) «Computing
    Curricula 2001 Computer Science» (CC2001) [перевод: Рекомендации по преподаванию информатики в университетах/ Пер. с англ.: СПб.: Издательство СПбГУ, 2002. – 372 с.] в таких областях знаний как Операционные системы (OS), Языки программирования (PL) и Программная инженерия
    (SE). Перечислим разделы «Совокупности знаний по информатики» документа CC2001, которым соответствует содержание книги:
    OS2. Основы операционных систем;
    OS3. Параллелизм;
    OS4. Планирование и диспетчеризация;
    OS5. Управление памятью;
    PL2. Виртуальные машины;
    PL4. Переменные и типы данных;
    PL5. Механизмы абстракции;
    PL6. Объектно-ориентированное программирование;
    PL8. Системы трансляции;
    PL9. Системы типов;
    PL11. Разработка языков программирования;
    SE2. Использование программных интерфейсов приложений (API);
    SE3. Программные средства и окружения.
    Книга печатается в серии, открытой публикацией отечественных рекомендаций по преподаванию информатики:
    Преподавание информатики и математических основ информатики для
    непрофильных специальностей классических университетов: [учеб. пособие]/В. В. Борисенко [и др.]; [ред. А.В. Михалев]. – М.: Интернет-Ун-т Информ. Технологий, 2005. – 144 с.: ил., табл. – (Основы информатики и математики).
    Приведем разделы «Совокупность знаний по математике и информатике» вышеупомянутой разработки, которым соответствует содержание
    книги:

    vi

    P3. Операционные системы;
    P4. Низкоуровневое программирование;
    P7. Объектно-ориентированное программирование;
    IT1. Языки программирования.
    Книга и сопутствующие ей учебные курсы появились при поддержке
    корпорации Microsoft.
    Авторы надеются, что данная книга поможет в освоении последних
    достижений практического программирования студентам самых различных специальностей, преподавателям программирования и людям, самостоятельно изучающим современные компьютерные технологии.

    vii

    ОБ АВТОРАХ

    Чеповский Андрей Михайлович – доцент, к.т.н. Преподает в МГТУ
    им. Н.Э. Баумана и на дополнительном образовании механико-математического факультета МГУ им. М.В. Ломоносова, консультант МГУП. На протяжении
    многих лет читал различные курсы по программированию: алгоритмические
    языки, функциональное программирование, теоретическое программирование, теория формальных языков, информационные системы и базы данных,
    распределенные системы обработки информации, параллельное программирование.

    Скоробогатов Сергей Юрьевич – ассистент МГТУ им. Н.Э. Баумана.
    Ведет занятия по курсам алгоритмических языков, функциональному программированию, разработке программного обеспечения.

    Макаров Андрей Владимирович – старший преподаватель МГТУ
    им. Н.Э. Баумана. В течении многих лет читает курсы по архитектуре компьютеров, операционным системам, системному программированию, программированию под ОС Windows.

    viii

    Глава 2. Структура программных компонентов . . . . . . . . . . . . . . . . . . . . . 32
    2.1. Формат исполняемых файлов . . . . . . . . . . . . . . . . . . . . . . . . . . 32
    2.1.1. Управление памятью в Windows . . . . . . . . . . . . . . . . . . . 34
    2.1.2. Обзор структуры PE-файла . . . . . . . . . . . . . . . . . . . . . . 36
    2.1.3. Заголовки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
    2.1.4. Особые секции PE-файла . . . . . . . . . . . . . . . . . . . . . . . . 49
    2.1.5. Заголовок CLI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
    2.1.6. Пример генерации PE-файла . . . . . . . . . . . . . . . . . . . . . 53
    2.2. Формат метаданных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
    2.2.1. Расположение метаданных и кода внутри сборки . . . . 65
    2.2.2. Структура метаданных . . . . . . . . . . . . . . . . . . . . . . . . . . 67
    2.2.3. Таблицы метаданных . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
    2.3. Взаимодействие программных компонентов . . . . . . . . . . . . . . 72
    2.3.1. Обзор компонентных технологий . . . . . . . . . . . . . . . . . 73
    2.3.2. Взаимодействие компонентов в среде .NET . . . . . . . . 76
    2.3.3. Общая спецификация языков . . . . . . . . . . . . . . . . . . . . 82

    Глава 1. Введение в архитектуру Microsoft .NET Framework . . . . . . . . . . . 1
    1.1. Знакомство с .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
    1.1.1. Главные темы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
    1.1.2. Предшественники платформы .NET . . . . . . . . . . . . . . . 3
    1.1.3. Обзор архитектуры .NET . . . . . . . . . . . . . . . . . . . . . . . . . 5
    1.2. Общая система типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
    1.2.1. Ядро системы типов .NET . . . . . . . . . . . . . . . . . . . . . . . 11
    1.2.2. Дополнительные элементы системы типов .NET . . . . 17
    1.3. Виртуальная система выполнения . . . . . . . . . . . . . . . . . . . . . . 21
    1.3.1. Состояние виртуальной машины . . . . . . . . . . . . . . . . . 21
    1.3.2. Состояние метода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
    1.4. Автоматическое управление памятью . . . . . . . . . . . . . . . . . . . . 28
    1.4.1. Выделение памяти в управляемой куче . . . . . . . . . . . . 28
    1.4.2. Алгоритм сборки мусора . . . . . . . . . . . . . . . . . . . . . . . . . 29
    1.4.3. Основные приемы повышения эффективности сборки
    мусора . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

    Оглавление

    ix

    Глава 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

    Глава 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

    x

    Глава 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

    Глава 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

    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

    xi

    Приложение B. Исходный код программы Integral . . . . . . . . . . . . . . . . 302
    B.1. Expr.cs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
    B.2. Integral.cs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308

    Приложение Б. Исходный код программы CilCodec . . . . . . . . . . . . . . . 291

    Приложение A. Исходный код программы pegen . . . . . . . . . . . . . . . . . . 274
    A.1. macros.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
    A.2. pe.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
    A.3. pe.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
    A.4. main.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288

    Литература . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273

    Глава 7. Разработка параллельных приложений для ОС Windows . . . . . . 218
    7.1. Применение потоков и волокон . . . . . . . . . . . . . . . . . . . . . . . 218
    7.1.1. Пулы потоков, порт завершения ввода-вывода . . . . . 218
    7.1.2. Память, локальная для потоков и волокон . . . . . . . . . 225
    7.1.3. Привязка к процессору и системы с неоднородным
    доступом к памяти . . . . . . . . . . . . . .