Нашли ошибку или опечатку? Выделите текст и нажмите

Поменять цветовую

гамму сайта?

Поменять
Обновления сайта
и новые разделы

Рекомендовать в Google +1

Промежуточный язык CIL

56

Промежуточный язык Microsoft очевидно играет фундаментальную роль в среде .NET. Теперь имеет смысл внимательнее рассмотреть основные характеристики CIL, поскольку логично, что любой язык, предназначенный для .NET, также должен поддерживать эти основные характеристики CIL.

Важнейшие свойства CIL могут быть сформулированы следующим образом:

  • объектная ориентация и применение интерфейсов
  • строгое различие между типами значений и типами ссылок
  • строгая типизация данных
  • обработка ошибок через использование исключений
  • применение атрибутов

Давайте рассмотрим первые два свойства более подробно:

Поддержка объектной ориентации и интерфейсов

Независимость .NET от языка имеет некоторые практические ограничения. IL неизбежно должен воплощать некоторую определенную методологию программирования, а это означает, что исходный язык также должен быть совместим с этой методологией. Принцип, которым руководствовались в Microsoft при создании IL: классическое объектно-ориентированное программирование с реализацией одиночного наследования классов.

В дополнение к классической объектной ориентации в языке IL также введено понятие интерфейсов, которые впервые были реализованы под Windows с появлением СОМ. Интерфейсы, построенные с использованием .NET — это не то же самое, что интерфейсы СОМ; им не требуется поддержка со стороны инфраструктуры СОМ (так, например, они не наследуются от IUnknown и не имеют ассоциированных глобальных идентификаторов GUID). Однако они разделяют с интерфейсами СОМ идею предоставления контракта, и классы, реализующие заданный интерфейс, должны предлагать реализацию методов и свойств, специфицированных этим интерфейсом.

Так же, язык CIL имеет способность языкового взаимодействия, под которой подразумевается возможность для классов, написанных на одном языке, напрямую обращаться к классам, написанным на другом языке, т.е.:

  • класс, написанный на одном языке, может быть унаследован от класса, реализованного на другом языке

  • класс может содержать экземпляр другого класса, независимо от того, на каких языках написан каждый из них

  • объект может напрямую вызывать методы другого объекта, написанного на другом языке

  • объекты (или ссылки на объекты) могут передаваться между методами

  • при вызове методов между языками можно шагать в отладчике по вызовам, даже если это означает необходимость перемещения между фрагментами исходного кода, написанными на разных языках

Различие типов значений и типов ссылок

Как и любой язык программирования, IL предлагает множество предопределенных примитивных типов данных. Одна из особенностей IL, однако, заключается в том, что он делает четкое различие между значениями и ссылочными типами. Типы значений — это те переменные, которые непосредственно хранят данные, в то время как ссылочные типы — это те переменные, которые просто хранят адрес, по которому соответствующие данные могут быть найдены.

В терминах С++ ссылочные типы можно рассматривать, как будто они обращаются к переменным через указатель, в то время как для Visual Basic лучшая аналогия для ссылочных типов — это объекты, обращение к которым в Visual Basic 6 всегда осуществляется по ссылке. В языке IL также установлена своя спецификация относительно хранения данных: экземпляры ссылочных типов всегда хранятся в области памяти, известной как managed heap, в то время как типы значений обычно хранятся в стеке (хотя, если типы значений объявлены как поля внутри ссылочных типов, то они также будут сохранены в managed heap).

Утилита ildasm.exe

Утилита ildasm.exe (Intermediate Language Disassembler — дизассемблер промежуточного языка), которая поставляется в составе пакета .NET Framework 4.0 SDK, позволяет загружать любую сборку .NET и изучать ее содержимое, в том числе ассоциируемый с ней манифест, CIL-код и метаданные типов. По умолчанию эта утилита установлена в каталоге С:\Program Files\Microsoft SDKs\Windows\v7.0A\bin (если здесь ее нет, поищите на компьютере файл по имени ildasm.exe).

Утилиту ildasm.exe также легко запустить, открыв в Visual Studio 2010 окно Command Prompt (Командная строка), введя в нем слово ildasm и нажав клавишу Enter:

Вызов утилиты ildasm.exe

Давайте сначала составим простейшую сборку:

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 10;
            Console.WriteLine(a);
            Console.ReadLine();
        }
    }
}

Скомпилируем и откроем .exe файл через утилиту ildasm.exe:

Утилита ildasm.exe

Помимо содержащихся в сборке пространств имен, типов и членов, утилита ildasm.ехе также позволяет просматривать и CIL-инструкции, которые лежат в основе каждого конкретного члена. Например, в результате двойного щелчка на методе Main в классе Program открывается отдельное окно с CIL-кодом, лежащим в основе этого метода.

CIL-код сборки

Для просмотра метаданных типов, которые содержатся в загруженной в текущий момент сборке, необходимо нажать комбинацию клавиш <Ctrl+M>.

Метаданные типов

И, наконец, чтобы просмотреть содержимое манифеста сборки, необходимо дважды щелкнуть на значке MANIFEST.

Данные манифеста

Несомненно, утилита ildasm.ехе обладает большим, чем было показано здесь количеством функциональных возможностей; все остальные функциональные возможности этой утилиты будут демонстрироваться позже в данном руководстве при рассмотрении соответствующих аспектов.

Пройди тесты