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

UptoLike

считается имеющим тип &, а любая объектная ссылка представляется ти-
пом O. Это означает, что согласно спецификации CLI система выполнения
не обязана отслеживать правильность типов управляемых указателей и
объектных ссылок. Действительно, контроль за правильностью типов на-
ходится в компетенции верификатора.
1.3.2.2. Локальные переменные и параметры
Для хранения локальных переменных и параметров метода использу-
ются два массива, которые, как и стек вычислений, состоят из слотов. При
этом каждой переменной и каждому параметру соответствует ровно один
слот.
Для доступа к локальным переменным и параметрам используются
их индексы в массивах переменных и параметров. При этом нумерация
осуществляется с нуля.
Если один и тот же слот стека вычислений в разные моменты време-
ни может содержать данные разных типов, то слоты, используемые для
хранения переменных и параметров, строго типизированы, но зато под-
держивают все типы, определенные в спецификации CTS. Типы локаль-
ных переменных и параметров задаются в заголовке метода и доступны во
время выполнения программы через описатель метода. Специальный
флаг, также находящийся в заголовке метода, показывает, нужно ли обну-
лять локальные переменные при входе в метод.
Слоты, из которых состоят массивы переменных и параметров, адре-
суемы. Это означает, что в языке CIL существуют специальные инструк-
ции, позволяющие получить адрес локальной переменной или параметра
метода в виде управляемого указателя.
Компилятор, генерирующий CIL-код, не должен делать никаких
предположений о том, как переменные и параметры размещены в памяти.
Дело в том, что реализации CLI могут любым образом переупорядочивать
переменные и параметры, могут произвольно выравнивать их в памяти и
даже использовать для их хранения регистры процессора.
1.3.2.3. Область локальных данных
Область локальных данных является составной частью состояния ме-
тода и используется для размещения объектов, тип и/или размер которых
неизвестен на этапе компиляции, но которые по тем или иным причинам
нежелательно размещать в куче.
Память из области локальных данных может быть явно выделена с
помощью инструкции localloc. Так как в языке CIL не существует инст-
рукции, освобождающей память в области локальных данных, то эту об-
ласть невозможно использовать для реализации менеджера памяти обще-
го назначения.
Введение в архитектуру Microsoft .NET Framework
27
& – управляемый указатель;
O – объектная ссылка;
Пользовательский тип-значение.
Таким образом, слоты стека вычислений могут иметь различный раз-
мер в зависимости от типов записанных в них значений.
Также мы можем видеть, что допустимые типы значений для стека вы-
числений не совпадают с общей системой типов CTS. Например, в CTS су-
ществуют целые типы разрядности 1 и 2 байта, которые не могут содержать-
ся на стеке вычислений. И наоборот, тип F стека вычислений не имеет ана-
лога в CTS. Кроме того, для стека вычислений все управляемые указатели и
объектные ссылки отображаются в два типа: & и O соответственно.
Давайте обсудим, как в VES осуществляется работа с типами данных,
не поддерживаемыми напрямую стеком вычислений.
Во-первых, короткие целые типы (bool, char, int8, int16, unsigned
int8, unsigned int16) при загрузке на стек вычислений расширяются до
int32. При этом знаковые короткие целые типы (int8, int16) расширяют-
ся с сохранением знака, а беззнаковые расширяются путем добавления ну-
левых битов. При сохранении значения со стека вычислений в перемен-
ной, параметре, поле объекта или элементе массива происходит обратное
сужающее преобразование.
Во-вторых, беззнаковый тип unsigned int32 при загрузке на стек вы-
числений становится знаковым int32, и аналогично, беззнаковый
unsigned int64 становится знаковым int64. При этом, естественно, ника-
ких преобразований не происходит – просто последовательность бит, ко-
торая раньше считалась беззнаковым целым, копируется на стек вычисле-
ний. Вообще говоря, утверждение, что целые типы int32, int64 и native
int на стеке вычислений имеют знак, достаточно спорно. Правильнее бы-
ло бы сказать, что они могут представлять как знаковые, так и беззнако-
вые целые числа в зависимости от того, какие инструкции CIL использу-
ются для их обработки.
В-третьих, типы float32 и float64 при копировании на стек вычисле-
ний преобразуются к типу F. Разрядность этого типа определяется кон-
кретной реализацией CLI, которая, однако, должна гарантировать, что
точность типа F не ниже, чем точность типа float64.
В-четвертых, типы-перечисления при копировании на стек вычисле-
ний автоматически превращаются в целые типы. Вообще, VES устроена
таким образом, что типы-перечисления и целые типы являются совмести-
мыми по присваиванию. Этим они отличаются от обычных типов-значе-
ний, которые при копировании на стек сохраняют свой тип и не совмес-
тимы с целыми типами.
И, наконец, для VES не имеет значения, какой точный тип имеют уп-
равляемые указатели и объектные ссылки. Любой управляемый указатель
26
CIL и системное программирование в Microsoft .NET
26                          CIL и системное программирование в Microsoft .NET   Введение в архитектуру Microsoft .NET Framework                       27


        • & – управляемый указатель;                                            считается имеющим тип &, а любая объектная ссылка представляется ти-
        • O – объектная ссылка;                                                 пом O. Это означает, что согласно спецификации CLI система выполнения
        • Пользовательский тип-значение.                                        не обязана отслеживать правильность типов управляемых указателей и
      Таким образом, слоты стека вычислений могут иметь различный раз-          объектных ссылок. Действительно, контроль за правильностью типов на-
мер в зависимости от типов записанных в них значений.                           ходится в компетенции верификатора.
      Также мы можем видеть, что допустимые типы значений для стека вы-
числений не совпадают с общей системой типов CTS. Например, в CTS су-           1.3.2.2. Локальные переменные и параметры
ществуют целые типы разрядности 1 и 2 байта, которые не могут содержать-              Для хранения локальных переменных и параметров метода использу-
ся на стеке вычислений. И наоборот, тип F стека вычислений не имеет ана-        ются два массива, которые, как и стек вычислений, состоят из слотов. При
лога в CTS. Кроме того, для стека вычислений все управляемые указатели и        этом каждой переменной и каждому параметру соответствует ровно один
объектные ссылки отображаются в два типа: & и O соответственно.                 слот.
      Давайте обсудим, как в VES осуществляется работа с типами данных,               Для доступа к локальным переменным и параметрам используются
не поддерживаемыми напрямую стеком вычислений.                                  их индексы в массивах переменных и параметров. При этом нумерация
      Во-первых, короткие целые типы (bool, char, int8, int16, unsigned         осуществляется с нуля.
int8, unsigned int16) при загрузке на стек вычислений расширяются до                  Если один и тот же слот стека вычислений в разные моменты време-
int32. При этом знаковые короткие целые типы (int8, int16) расширяют-           ни может содержать данные разных типов, то слоты, используемые для
ся с сохранением знака, а беззнаковые расширяются путем добавления ну-          хранения переменных и параметров, строго типизированы, но зато под-
левых битов. При сохранении значения со стека вычислений в перемен-             держивают все типы, определенные в спецификации CTS. Типы локаль-
ной, параметре, поле объекта или элементе массива происходит обратное           ных переменных и параметров задаются в заголовке метода и доступны во
сужающее преобразование.                                                        время выполнения программы через описатель метода. Специальный
      Во-вторых, беззнаковый тип unsigned int32 при загрузке на стек вы-        флаг, также находящийся в заголовке метода, показывает, нужно ли обну-
числений становится знаковым int32, и аналогично, беззнаковый                   лять локальные переменные при входе в метод.
unsigned int64 становится знаковым int64. При этом, естественно, ника-                Слоты, из которых состоят массивы переменных и параметров, адре-
ких преобразований не происходит – просто последовательность бит, ко-           суемы. Это означает, что в языке CIL существуют специальные инструк-
торая раньше считалась беззнаковым целым, копируется на стек вычисле-           ции, позволяющие получить адрес локальной переменной или параметра
ний. Вообще говоря, утверждение, что целые типы int32, int64 и native           метода в виде управляемого указателя.
int на стеке вычислений имеют знак, достаточно спорно. Правильнее бы-                 Компилятор, генерирующий CIL-код, не должен делать никаких
ло бы сказать, что они могут представлять как знаковые, так и беззнако-         предположений о том, как переменные и параметры размещены в памяти.
вые целые числа в зависимости от того, какие инструкции CIL использу-           Дело в том, что реализации CLI могут любым образом переупорядочивать
ются для их обработки.                                                          переменные и параметры, могут произвольно выравнивать их в памяти и
      В-третьих, типы float32 и float64 при копировании на стек вычисле-        даже использовать для их хранения регистры процессора.
ний преобразуются к типу F. Разрядность этого типа определяется кон-
кретной реализацией CLI, которая, однако, должна гарантировать, что             1.3.2.3. Область локальных данных
точность типа F не ниже, чем точность типа float64.                                  Область локальных данных является составной частью состояния ме-
      В-четвертых, типы-перечисления при копировании на стек вычисле-           тода и используется для размещения объектов, тип и/или размер которых
ний автоматически превращаются в целые типы. Вообще, VES устроена               неизвестен на этапе компиляции, но которые по тем или иным причинам
таким образом, что типы-перечисления и целые типы являются совмести-            нежелательно размещать в куче.
мыми по присваиванию. Этим они отличаются от обычных типов-значе-                    Память из области локальных данных может быть явно выделена с
ний, которые при копировании на стек сохраняют свой тип и не совмес-            помощью инструкции localloc. Так как в языке CIL не существует инст-
тимы с целыми типами.                                                           рукции, освобождающей память в области локальных данных, то эту об-
      И, наконец, для VES не имеет значения, какой точный тип имеют уп-         ласть невозможно использовать для реализации менеджера памяти обще-
равляемые указатели и объектные ссылки. Любой управляемый указатель             го назначения.