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

UptoLike

1.3. Виртуальная система выполнения
Виртуальная система выполнения (Virtual Execution System – VES)
представляет собой абстрактную виртуальную машину, способную выпол-
нять управляемый код. Можно сказать, что виртуальная система выполне-
ния существует только «на бумаге», потому что ни одна из реализаций CLI
не содержит интерпретатора CIL-кода (вместо этого используется JIT-
компилятор, транслирующий инструкции CIL в команды процессора).
Другими словами, виртуальная система выполнения не зря называется
виртуальной (то есть мнимой), ее предназначение – служить образцом,
которому должна соответствовать любая реализация CLI. Какую бы тех-
нологию ни использовала эта реализация для выполнения программ, эта
технология должна работать так же, как работала бы виртуальная система
выполнения.
Если сравнить CLI с ее ближайшим конкурентом – платформой Java,
можно прийти к выводу, что VES является значительно более абстрактной
моделью, чем виртуальная машина Java (Java Virtual Machine – JVM). При-
чина такого отличия кроется в том, что изначально Java была ориентиро-
вана на реализацию в бытовых приборах. При этом, естественно, подразу-
мевалось, что байт-код Java будет непосредственно выполняться специ-
альными процессорами, и поэтому JVM является фактически специфика-
цией такого процессора. Аппаратная реализация VES никогда даже не
предполагалась, и это позволило избежать при составлении ее специфика-
ции ненужных деталей, дав тем самым каждой реализации CLI большую
свободу выбора наиболее оптимальной стратегии выполнения CIL-кода.
1.3.1. Состояние виртуальной машины
Изучение работы виртуальной машины CLI заключается в том, что-
бы понять, что представляет собой состояние виртуальной машины и как
это состояние меняется во времени. В этом разделе мы не будем затраги-
вать вопрос изменения состояния, так как оно связано с выполнением ин-
струкций языка CIL, разговор о котором мы отложим до третьей главы на-
шего учебника.
На рис. 1.9 показана схема состояния виртуальной машины, из кото-
рой видно, что виртуальная машина может выполнять сразу несколько
нитей (threads). Как уже говорилось ранее, виртуальная машина является
всего лишь моделью поведения конкретных реализаций CLI, поэтому мы
будем предполагать, что все нити выполняются параллельно. На самом де-
ле, нити могут работать как параллельно, так и в режиме вытесняющей
многозадачности, могут отображаться на процессы или на нити операци-
Введение в архитектуру Microsoft .NET Framework
21
управляемые указатели могут содержать адрес, непосредственно
следующий за последним элементом массива.
2. За каждым указателем закреплен тип ячейки, на которую он мо-
жет указывать. Другими словами, void-указатели запрещены.
3. Указатели могут храниться только в локальных переменных и
параметрах методов.
4. Запрещены указатели на указатели.
На использование неуправляемых указателей никаких ограничений
не накладывается, то есть они могут содержать абсолютно любой адрес.
Программа, в которой используются неуправляемые указатели, автомати-
чески считается небезопасной и не может пройти верификацию.
1.2.2.3. Упакованные типы-значения
Наличие в общей системе типов структур, которые во многом напо-
минают классы, но в действительности классами не являются, в некото-
рых случаях вызывает некоторые неудобства. Например, в библиотеке
классов .NET существуют достаточно удобные контейнерные классы
(наиболее часто используется класс ArrayList, представляющий массив с
динамически меняющимся размером). Эти классы могут хранить ссылки
на любые объекты, но не могут работать с типами-значениями.
Для решения этой проблемы в общей системе типов предусмотрены
так называемые упакованные типы-значения. Эти типы являются ссылоч-
ными и самоописывающими. Объекты этих типов предназначены для хра-
нения значений типов-значений.
Упакованные типы-значения не могут быть объявлены программи-
стом. Система автоматически определяет такой тип для любого типа-зна-
чения.
Получение объекта упакованного типа-значения осуществляется пу-
тем упаковки (boxing). Упаковка заключается в том, что в куче создается
пустой объект нужного размера, а затем значение копируется внутрь этого
объекта.
С помощью упаковки мы можем превратить значение любого типа-
значения (встроенного примитивного типа, структуры, перечисления) в
объект и в дальнейшем работать с этим значением как с настоящим объе-
ктом (в том числе, мы можем положить его в ArrayList).
Если же нам требуется произвести обратное действие, мы можем осу-
ществить распаковку (unboxing). Распаковка заключается в том, что мы
получаем управляемый указатель на содержимое объекта упакованного
типа-значения.
20
CIL и системное программирование в Microsoft .NET
20                         CIL и системное программирование в Microsoft .NET   Введение в архитектуру Microsoft .NET Framework                      21


          управляемые указатели могут содержать адрес, непосредственно
          следующий за последним элементом массива.                            1.3. Виртуальная система выполнения
       2. За каждым указателем закреплен тип ячейки, на которую он мо-
          жет указывать. Другими словами, void-указатели запрещены.                 Виртуальная система выполнения (Virtual Execution System – VES)
       3. Указатели могут храниться только в локальных переменных и            представляет собой абстрактную виртуальную машину, способную выпол-
          параметрах методов.                                                  нять управляемый код. Можно сказать, что виртуальная система выполне-
       4. Запрещены указатели на указатели.                                    ния существует только «на бумаге», потому что ни одна из реализаций CLI
     На использование неуправляемых указателей никаких ограничений             не содержит интерпретатора CIL-кода (вместо этого используется JIT-
не накладывается, то есть они могут содержать абсолютно любой адрес.           компилятор, транслирующий инструкции CIL в команды процессора).
Программа, в которой используются неуправляемые указатели, автомати-           Другими словами, виртуальная система выполнения не зря называется
чески считается небезопасной и не может пройти верификацию.                    виртуальной (то есть мнимой), ее предназначение – служить образцом,
                                                                               которому должна соответствовать любая реализация CLI. Какую бы тех-
1.2.2.3. Упакованные типы-значения                                             нологию ни использовала эта реализация для выполнения программ, эта
     Наличие в общей системе типов структур, которые во многом напо-           технология должна работать так же, как работала бы виртуальная система
минают классы, но в действительности классами не являются, в некото-           выполнения.
рых случаях вызывает некоторые неудобства. Например, в библиотеке                   Если сравнить CLI с ее ближайшим конкурентом – платформой Java,
классов .NET существуют достаточно удобные контейнерные классы                 можно прийти к выводу, что VES является значительно более абстрактной
(наиболее часто используется класс ArrayList, представляющий массив с          моделью, чем виртуальная машина Java (Java Virtual Machine – JVM). При-
динамически меняющимся размером). Эти классы могут хранить ссылки              чина такого отличия кроется в том, что изначально Java была ориентиро-
на любые объекты, но не могут работать с типами-значениями.                    вана на реализацию в бытовых приборах. При этом, естественно, подразу-
     Для решения этой проблемы в общей системе типов предусмотрены             мевалось, что байт-код Java будет непосредственно выполняться специ-
так называемые упакованные типы-значения. Эти типы являются ссылоч-            альными процессорами, и поэтому JVM является фактически специфика-
ными и самоописывающими. Объекты этих типов предназначены для хра-             цией такого процессора. Аппаратная реализация VES никогда даже не
нения значений типов-значений.                                                 предполагалась, и это позволило избежать при составлении ее специфика-
     Упакованные типы-значения не могут быть объявлены программи-              ции ненужных деталей, дав тем самым каждой реализации CLI большую
стом. Система автоматически определяет такой тип для любого типа-зна-          свободу выбора наиболее оптимальной стратегии выполнения CIL-кода.
чения.
     Получение объекта упакованного типа-значения осуществляется пу-           1.3.1. Состояние виртуальной машины
тем упаковки (boxing). Упаковка заключается в том, что в куче создается             Изучение работы виртуальной машины CLI заключается в том, что-
пустой объект нужного размера, а затем значение копируется внутрь этого        бы понять, что представляет собой состояние виртуальной машины и как
объекта.                                                                       это состояние меняется во времени. В этом разделе мы не будем затраги-
     С помощью упаковки мы можем превратить значение любого типа-              вать вопрос изменения состояния, так как оно связано с выполнением ин-
значения (встроенного примитивного типа, структуры, перечисления) в            струкций языка CIL, разговор о котором мы отложим до третьей главы на-
объект и в дальнейшем работать с этим значением как с настоящим объе-          шего учебника.
ктом (в том числе, мы можем положить его в ArrayList).                              На рис. 1.9 показана схема состояния виртуальной машины, из кото-
     Если же нам требуется произвести обратное действие, мы можем осу-         рой видно, что виртуальная машина может выполнять сразу несколько
ществить распаковку (unboxing). Распаковка заключается в том, что мы           нитей (threads). Как уже говорилось ранее, виртуальная машина является
получаем управляемый указатель на содержимое объекта упакованного              всего лишь моделью поведения конкретных реализаций CLI, поэтому мы
типа-значения.                                                                 будем предполагать, что все нити выполняются параллельно. На самом де-
                                                                               ле, нити могут работать как параллельно, так и в режиме вытесняющей
                                                                               многозадачности, могут отображаться на процессы или на нити операци-