Высокоуровневые методы информатики и программирования. Тузовский А.Ф. - 11 стр.

UptoLike

Составители: 

11
команды сложения двух значений (ADD) или перехода, если два значе-
ния равны (BEQ). Другие, более высокого уровня, редко встречаются в
аппаратных наборах команд. Так, NEWOBJ создает экземпляр объекта, а
THROW генерирует исключение. Благодаря таким большим возможно-
стям команд CIL, код на языке высокого уровня, таком как С# или Visu-
al Basic .NET, зачастую порождает при компиляции достаточно малое
число команд.
Язык CIL использует стековую модель исполнения. Если процес-
соры х86 для обработки значений загружают их в регистры, то CLR по-
мещает их в вычислительный стек. Чтобы сложить два числа, они копи-
руются в стек, вызывается ADD, и результат считывается из стека. Копи-
рование значения из памяти в стек называется загрузкой (loading), а ко-
пирование в обратном направлении – сохранением (storing).
В CIL есть несколько команд загрузки и сохранения. Например,
LDLOC загружает в стек значение по некоторому адресу в памяти, a
STLOC копирует значение из стека в память, удаляя его из стека.
В качестве примера работы языка CIL, можно рассмотреть фраг-
мент программы С#, в котором объявляются и инициализируются две
переменные, затем они суммируются, и результат записывается в тре-
тью переменную:
int а = 3;
int b = 7;
int с = а + b;
Ниже приведен набор команд CIL, сгенерированный компилято-
ром Microsoft C# (с поясняющими комментариями):
ldc.i4.3 // Загрузить в стек 32-разрядное (i4) число 3.
stloc.0 // Сохранить его в локальной переменной 0 (a).
ldc.i4.7 // Загрузить на стек 32-разрядное (i4) число 7,
stloc.1 // Сохранить его в локальной переменной 1 (b).
ldloc.0 // Загрузить в стек локальную переменную 0.
ldloc.1 // Загрузить в стек локальную переменную 1.
add // Сложить два числа и получить сумму в стеке.
stloc.2 // Сохранить сумму в локальной переменной 2 (c).
1.5. Новый тип программ – сборки
Компиляторы .NET Framework создают управляемые модули, ко-
торые содержат код на промежуточном языке CIL и метаданные. Одна-
ко CLR не может непосредственно использовать управляемые модули.
Базовой единицей защиты, управления версиями и развертывания в
.NET Framework является не управляемый модуль, а сборка (assembly).