Составители:
Рубрика:
считается имеющим тип &, а любая объектная ссылка представляется ти-
пом 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 не имеет значения, какой точный тип имеют уп- ласть невозможно использовать для реализации менеджера памяти обще- равляемые указатели и объектные ссылки. Любой управляемый указатель го назначения.
Страницы
- « первая
- ‹ предыдущая
- …
- 18
- 19
- 20
- 21
- 22
- …
- следующая ›
- последняя »