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

UptoLike

цию о количестве и типах локальных переменных и об обработ-
чиках исключений.
Описатель метода доступен из кода метода, но в основном он
используется системой выполнения при сборке мусора и обра-
ботке исключений.
Описатель безопасности (Security Descriptor).
Используется системой безопасности CLI и недоступен из кода
метода.
Состояние возврата (Return State Handle).
Служит для организации списка состояний методов внутри сис-
темы выполнения и недоступно из кода метода. Фактически
представляет собой указатель на состояние метода, из тела кото-
рого был вызван текущий метод.
1.3.2.1. Стек вычислений
Итак, несмотря на то, что большинство современных процессоров
для организации вычислений используют регистры, в виртуальной систе-
ме выполнения вместо регистров применяется стек вычислений. Это свя-
зано, скорее всего, с тем, что стековые вычисления достаточно легко мож-
но отобразить на регистры процессора, так как модель, использующая
стек, более абстрактна, чем регистровая модель.
Стек вычислений в VES состоит из слотов. При этом глубина стека
(максимальное количество слотов) всегда ограничена и задается статиче-
ски в заголовке метода. Решение ограничить глубину стека было принято
разработчиками спецификации CLI для того, чтобы облегчить создание
JIT-компиляторов.
На входе метода стек вычислений всегда пуст. Затем он используется
для передачи операндов инструкциям CIL, для передачи фактических пара-
метров вызываемым методам, а также для получения результатов выполне-
ния инструкций и вызываемых методов. Если метод возвращает какое-то
значение, то оно кладется на стек вычислений перед завершением метода.
Важной особенностью организации стека вычислений является то
обстоятельство, что его слоты не адресуются, то есть мы не можем полу-
чить указатель на какой-либо слот и записать в него значение.
Каждый слот стека вычислений может содержать ровно одно значе-
ние одного из следующих типов:
int64 – 8-байтовое целое со знаком;
int32 – 4-байтовое целое со знаком;
native int – знаковое целое, разрядность которого зависит от
аппаратной платформы (может быть 4 или 8 байт);
F – число с плавающей точкой, разрядность которого зависит от
аппаратной платформы (не может быть меньше 8 байт);
Введение в архитектуру Microsoft .NET Framework
25
Давайте перечислим элементы состояния метода, входящие в группу
изменяемых данных:
Указатель инструкции (Instruction Pointer).
Содержит адрес следующей инструкции в теле метода, которая
будет выполнена системой выполнения. (Когда мы говорим, что
указатель инструкции относится к изменяемым данным, мы
имеем в виду, что его значение изменяется при переходе от ин-
струкции к инструкции.)
Стек вычислений (Evaluation Stack).
Виртуальная система выполнения работает по принципу стеко-
вого процессора. Это означает, что операнды инструкций, а так-
же возвращаемые инструкциями значения хранятся в специаль-
ной области памяти, а именно на стеке вычислений.
Каждое состояние метода имеет собственный стек вычислений,
содержимое которого сохраняется при вызове методов (то есть,
если наш метод вызывает другой метод, то по завершении рабо-
ты вызванного метода содержимое стека никуда не денется).
Локальные переменные (Local Variable Array).
Для хранения локальных переменных в состоянии метода пред-
усмотрена отдельная область памяти, состоящая из так называ-
емых слотов (slots). Каждой локальной переменной соответству-
ет свой слот. Значения локальных переменных сохраняются при
вызове методов аналогично содержимому стека вычислений.
Параметры (Argument Array).
Фактические параметры, переданные методу, записываются в
специальную область памяти, которая организована так же, как
и область локальных переменных.
Область локальных данных (Local Memory Pool).
В языке CIL предусмотрена инструкция localloc, которая поз-
воляет динамически размещать объекты в области памяти, ло-
кальной для метода. Объекты в этой области живут до тех пор
пока метод не завершится.
Обратите внимание, что стек вычислений, локальные переменные и
параметры, а также локальные данные метода представляют собой логиче-
ски отдельные области памяти. Каждая конкретная реализация CLI само-
стоятельно решает вопрос, где размещать эти области.
В группу неизменяемых данных входят следующие элементы состоя-
ния метода:
Описатель метода (methodInfo handle).
Содержит сигнатуру метода, в которую входят количество и ти-
пы формальных параметров, а также тип возвращаемого значе-
ния. Кроме этого, описатель метода включает в себя информа-
24
CIL и системное программирование в Microsoft .NET
24                          CIL и системное программирование в Microsoft .NET   Введение в архитектуру Microsoft .NET Framework                       25


     Давайте перечислим элементы состояния метода, входящие в группу                      цию о количестве и типах локальных переменных и об обработ-
изменяемых данных:                                                                        чиках исключений.
        • Указатель инструкции (Instruction Pointer).                                     Описатель метода доступен из кода метода, но в основном он
          Содержит адрес следующей инструкции в теле метода, которая                      используется системой выполнения при сборке мусора и обра-
          будет выполнена системой выполнения. (Когда мы говорим, что                     ботке исключений.
          указатель инструкции относится к изменяемым данным, мы                        • Описатель безопасности (Security Descriptor).
          имеем в виду, что его значение изменяется при переходе от ин-                   Используется системой безопасности CLI и недоступен из кода
          струкции к инструкции.)                                                         метода.
        • Стек вычислений (Evaluation Stack).                                           • Состояние возврата (Return State Handle).
          Виртуальная система выполнения работает по принципу стеко-                      Служит для организации списка состояний методов внутри сис-
          вого процессора. Это означает, что операнды инструкций, а так-                  темы выполнения и недоступно из кода метода. Фактически
          же возвращаемые инструкциями значения хранятся в специаль-                      представляет собой указатель на состояние метода, из тела кото-
          ной области памяти, а именно на стеке вычислений.                               рого был вызван текущий метод.
          Каждое состояние метода имеет собственный стек вычислений,
          содержимое которого сохраняется при вызове методов (то есть,          1.3.2.1. Стек вычислений
          если наш метод вызывает другой метод, то по завершении рабо-               Итак, несмотря на то, что большинство современных процессоров
          ты вызванного метода содержимое стека никуда не денется).             для организации вычислений используют регистры, в виртуальной систе-
        • Локальные переменные (Local Variable Array).                          ме выполнения вместо регистров применяется стек вычислений. Это свя-
          Для хранения локальных переменных в состоянии метода пред-            зано, скорее всего, с тем, что стековые вычисления достаточно легко мож-
          усмотрена отдельная область памяти, состоящая из так называ-          но отобразить на регистры процессора, так как модель, использующая
          емых слотов (slots). Каждой локальной переменной соответству-         стек, более абстрактна, чем регистровая модель.
          ет свой слот. Значения локальных переменных сохраняются при                Стек вычислений в VES состоит из слотов. При этом глубина стека
          вызове методов аналогично содержимому стека вычислений.               (максимальное количество слотов) всегда ограничена и задается статиче-
        • Параметры (Argument Array).                                           ски в заголовке метода. Решение ограничить глубину стека было принято
          Фактические параметры, переданные методу, записываются в              разработчиками спецификации CLI для того, чтобы облегчить создание
          специальную область памяти, которая организована так же, как          JIT-компиляторов.
          и область локальных переменных.                                            На входе метода стек вычислений всегда пуст. Затем он используется
        • Область локальных данных (Local Memory Pool).                         для передачи операндов инструкциям CIL, для передачи фактических пара-
          В языке CIL предусмотрена инструкция localloc, которая поз-           метров вызываемым методам, а также для получения результатов выполне-
          воляет динамически размещать объекты в области памяти, ло-            ния инструкций и вызываемых методов. Если метод возвращает какое-то
          кальной для метода. Объекты в этой области живут до тех пор           значение, то оно кладется на стек вычислений перед завершением метода.
          пока метод не завершится.                                                  Важной особенностью организации стека вычислений является то
     Обратите внимание, что стек вычислений, локальные переменные и             обстоятельство, что его слоты не адресуются, то есть мы не можем полу-
параметры, а также локальные данные метода представляют собой логиче-           чить указатель на какой-либо слот и записать в него значение.
ски отдельные области памяти. Каждая конкретная реализация CLI само-                 Каждый слот стека вычислений может содержать ровно одно значе-
стоятельно решает вопрос, где размещать эти области.                            ние одного из следующих типов:
     В группу неизменяемых данных входят следующие элементы состоя-                      • int64 – 8-байтовое целое со знаком;
ния метода:                                                                              • int32 – 4-байтовое целое со знаком;
        • Описатель метода (methodInfo handle).                                          • native int – знаковое целое, разрядность которого зависит от
          Содержит сигнатуру метода, в которую входят количество и ти-                     аппаратной платформы (может быть 4 или 8 байт);
          пы формальных параметров, а также тип возвращаемого значе-                     • F – число с плавающей точкой, разрядность которого зависит от
          ния. Кроме этого, описатель метода включает в себя информа-                      аппаратной платформы (не может быть меньше 8 байт);