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

UptoLike

Глава 3.
Common Intermediate Language
3.1. Поток инструкций языка CIL
Язык CIL (Common Intermediate Language) является независимым от
аппаратной платформы объектно-ориентированным ассемблером, исполь-
зуемым на платформе .NET для представления исполняемого кода. Для вы-
полнения сборки .NET содержащийся в ней CIL-код переводится JIT-ком-
пилятором, входящим в состав CLR, в код конкретного процессора.
Инструкции CIL можно разделить на четыре основные группы.
В первую группу входят инструкции общего назначения, которые служат
для организации вычислений. Вторая группа содержит инструкции для
работы с объектной моделью. Третья служит для генерации и обработки
исключений. В четвертую мы относим неверифицируемые инструкции,
которые генерируются, главным образом, компилятором языка C для
представления небезопасных конструкций языка.
Разработчики набора инструкций CIL уделили большое внимание
компактности CIL-кода. Для этого в набор инструкций было введено
большое количество сокращенных вариантов инструкций, представляю-
щих собой частные случаи других инструкций и кодирующихся меньшим
количеством байт.
3.1.1. Формат потока инструкций
Тело метода в сборке .NET закодировано в виде потока инструкций язы-
ка CIL. Поток инструкций представляет собой массив байт, в котором разме-
щены последовательности байт, кодирующие каждую инструкцию. При этом
инструкции размещаются последовательно друг за другом без промежутков.
Если сравнить поток инструкций CIL с потоком инструкций обыч-
ного процессора, можно заметить одно очень существенное отличие. Де-
ло в том, что обычный процессор занимается непосредственным выпол-
нением инструкций, то есть в каждый конкретный момент времени его
интересует только та инструкция, которую он в этот момент выполняет.
Это означает, что поток инструкций для обычного процессора может со-
держать последовательности байт, не являющиеся правильными кодами
инструкций, при условии, что на эти последовательности никогда не будет
передано управление. Такие «неправильные» последовательности зачас-
тую представляют собой некоторые данные (или места, зарезервирован-
ные для данных), используемые программой. Так как поток инструкций
CIL предназначен для JIT-компиляции, он не может содержать «непра-
Common Intermediate Language
83
2.3.3. Общая спецификация языков
Различные языки программирования, которые уже реализованы или
могут быть реализованы на платформе .NET, используют общую систему
типов (CTS) в качестве модели данных. Общая система типов поддержи-
вает все типы, с которыми работают распространенные в настоящее время
языки программирования, но не каждый язык поддерживает все типы, ре-
ализованные в общей системе типов. Например, Visual Basic допускает ти-
пизированные ссылки в качестве параметров методов, и эти типизирован-
ные ссылки реализованы в общей системе типов, но C# их не понимает и,
соответственно, не может использовать методы с такими параметрами.
Для того, чтобы любую библиотеку классов можно было использо-
вать из любого языка платформы .NET, разработчики .NET придумали об-
щую спецификацию языков (Common Language Specification – CLS).
В этой спецификации оговариваются правила, которым должны следовать
разработчики языков и библиотек. То есть она описывает некоторое под-
множество общей системы типов, и если некий язык реализует хотя бы это
подмножество, а библиотека использует только входящие в это подмноже-
ство типы, то такая библиотека может быть использована из этого языка.
В терминологии CLS библиотеки, соответствующие спецификации
CLS, называются средами (frameworks), но мы будем называть их CLS-би-
блиотеками. Компиляторы, генерирующие код, из которого можно полу-
чить доступ к CLS-библиотекам, называются потребителями (consumers).
Компиляторы, которые являются потребителями, но, к тому же, способны
создавать новые CLS-библиотеки, называются расширителями (extenders).
Приведем основные правила общей спецификации языков:
1. Спецификация распространяется только на доступные извне
части экспортируемых из библиотеки типов. То, что остается
внутри библиотеки, может использовать любые типы, не огля-
дываясь на спецификацию.
2. Упакованные типы-значения, неуправляемые указатели и типи-
зированные ссылки не должны использоваться. Дело в том, что
отнюдь не во всех языках, реализованных на платформе .NET,
есть соответствующие понятия, и, более того, добавление этих
понятий во все языки представляется нецелесообразным.
3. Регистр букв в идентификаторах не имеет значения. Это прави-
ло объясняется тем, что в некоторых языках программирования
(например, в Паскале) регистр букв не различается.
4. Методы не должны иметь переменного количества параметров.
5. Глобальные поля и методы не поддерживаются спецификацией.
6. Объекты исключений должны наследовать от System.Exception.
82
CIL и системное программирование в Microsoft .NET
82                         CIL и системное программирование в Microsoft .NET   Common Intermediate Language                                          83


2.3.3. Общая спецификация языков
                                                                               Глава 3.
     Различные языки программирования, которые уже реализованы или
могут быть реализованы на платформе .NET, используют общую систему             Common Intermediate Language
типов (CTS) в качестве модели данных. Общая система типов поддержи-
вает все типы, с которыми работают распространенные в настоящее время          3.1. Поток инструкций языка CIL
языки программирования, но не каждый язык поддерживает все типы, ре-
ализованные в общей системе типов. Например, Visual Basic допускает ти-             Язык CIL (Common Intermediate Language) является независимым от
пизированные ссылки в качестве параметров методов, и эти типизирован-          аппаратной платформы объектно-ориентированным ассемблером, исполь-
ные ссылки реализованы в общей системе типов, но C# их не понимает и,          зуемым на платформе .NET для представления исполняемого кода. Для вы-
соответственно, не может использовать методы с такими параметрами.             полнения сборки .NET содержащийся в ней CIL-код переводится JIT-ком-
     Для того, чтобы любую библиотеку классов можно было использо-             пилятором, входящим в состав CLR, в код конкретного процессора.
вать из любого языка платформы .NET, разработчики .NET придумали об-                Инструкции CIL можно разделить на четыре основные группы.
щую спецификацию языков (Common Language Specification – CLS).                 В первую группу входят инструкции общего назначения, которые служат
В этой спецификации оговариваются правила, которым должны следовать            для организации вычислений. Вторая группа содержит инструкции для
разработчики языков и библиотек. То есть она описывает некоторое под-          работы с объектной моделью. Третья служит для генерации и обработки
множество общей системы типов, и если некий язык реализует хотя бы это         исключений. В четвертую мы относим неверифицируемые инструкции,
подмножество, а библиотека использует только входящие в это подмноже-          которые генерируются, главным образом, компилятором языка C для
ство типы, то такая библиотека может быть использована из этого языка.         представления небезопасных конструкций языка.
     В терминологии CLS библиотеки, соответствующие спецификации                    Разработчики набора инструкций CIL уделили большое внимание
CLS, называются средами (frameworks), но мы будем называть их CLS-би-          компактности CIL-кода. Для этого в набор инструкций было введено
блиотеками. Компиляторы, генерирующие код, из которого можно полу-             большое количество сокращенных вариантов инструкций, представляю-
чить доступ к CLS-библиотекам, называются потребителями (consumers).           щих собой частные случаи других инструкций и кодирующихся меньшим
Компиляторы, которые являются потребителями, но, к тому же, способны           количеством байт.
создавать новые CLS-библиотеки, называются расширителями (extenders).
     Приведем основные правила общей спецификации языков:                      3.1.1. Формат потока инструкций
        1. Спецификация распространяется только на доступные извне                  Тело метода в сборке .NET закодировано в виде потока инструкций язы-
           части экспортируемых из библиотеки типов. То, что остается          ка CIL. Поток инструкций представляет собой массив байт, в котором разме-
           внутри библиотеки, может использовать любые типы, не огля-          щены последовательности байт, кодирующие каждую инструкцию. При этом
           дываясь на спецификацию.                                            инструкции размещаются последовательно друг за другом без промежутков.
        2. Упакованные типы-значения, неуправляемые указатели и типи-               Если сравнить поток инструкций CIL с потоком инструкций обыч-
           зированные ссылки не должны использоваться. Дело в том, что         ного процессора, можно заметить одно очень существенное отличие. Де-
           отнюдь не во всех языках, реализованных на платформе .NET,          ло в том, что обычный процессор занимается непосредственным выпол-
           есть соответствующие понятия, и, более того, добавление этих        нением инструкций, то есть в каждый конкретный момент времени его
           понятий во все языки представляется нецелесообразным.               интересует только та инструкция, которую он в этот момент выполняет.
        3. Регистр букв в идентификаторах не имеет значения. Это прави-        Это означает, что поток инструкций для обычного процессора может со-
           ло объясняется тем, что в некоторых языках программирования         держать последовательности байт, не являющиеся правильными кодами
           (например, в Паскале) регистр букв не различается.                  инструкций, при условии, что на эти последовательности никогда не будет
        4. Методы не должны иметь переменного количества параметров.           передано управление. Такие «неправильные» последовательности зачас-
        5. Глобальные поля и методы не поддерживаются спецификацией.           тую представляют собой некоторые данные (или места, зарезервирован-
        6. Объекты исключений должны наследовать от System.Exception.          ные для данных), используемые программой. Так как поток инструкций
                                                                               CIL предназначен для JIT-компиляции, он не может содержать «непра-