Промежуточный язык Microsoft (Microsoft Intermediate Language — MSIL, или просто IL) определяет систему команд, которая используется всеми компиляторами, транслирующими на язык платформы .NET. Этот промежуточный язык не зависит от используемой платформы. Код на языке MSIL затем преобразуется во внутренний (собственный) код платформы.
Возможности: IL — язык более высокого уровня в сравнении с большинством других машинных языков. Он позволяет работать с объектами и имеет команды для создания и инициализации объектов, вызова виртуальных методов и непосредственного манипулирования элементами массивов. Он даже имеет команды генерации и захвата исключений для обработки ошибок. IL можно рассматривать как объектно-ориентированный машинный язык.
IL открывает доступ ко всем возможностям CLR. IL не привязан к какой-либо конкретной аппаратной платформе. Это значит, что управляемый модуль, содержащий IL-код, может исполняться на любой аппаратной платформе. Разработка приложений с управляемым IL делает программиста более независимым от архитектуры процессора.
Особенности: Язык IL имеет все недостатки, которые присущи другим низкоуровневым языкам программирования: сложность и высокую трудоемкость программирования, трудность модификации написанных на нем программ, малую степень «видимого» соответствия исходного текста программы и решаемой задачи.
Ввиду своей ненаглядности, IL практически не используется для программирования комплексных алгоритмов
Структура типов Object |
|||||
(reference types) |
Value Type (value types) |
||||
Class Interface Array String Delegate |
Byte Char |
Int16 Int32 Int64 Decimal Boolean |
Unit16 Unit32 Unit64 Structure Others |
Single Double Enum |
|
|
|||||
|
|||||
Для выполнения какого-либо метода его IL-код должен быть преобразован в команды процессора. Этим занимается JIT-компилятор CLR. Непосредственно перед исполнением Main CLR находит все типы, на которые ссылается код Main. При этом CLR выделяет внутренние структуры данных, используемые для управления доступом к типам, на которые есть ссылки. JITCompiler ищет в метаданных соответствующей сборки IL-код вызываемого метода. Затем JITCompiler проверяет и компилирует IL-код в собственные команды процессора, которые сохраняются в динамически выделенном блоке памяти. После этого JITCompiler возвращается к внутренней структуре данных типа и заменяет адрес вызываемого метода адресом блока памяти, содержащего собственные команды процессора. В завершение JITCompiler передает управление коду в этом блоке памяти.