﻿# Intermediate Language \(IL\)

Intermediate Language \(IL\), также известный как Common Intermediate Language \(CIL\) — низкоуровневый язык программирования, разработанный компанией Microsoft\. Этот язык, являющийся неотъемлемой частью архитектуры Common Language Runtime \(CLR\), служит посредником между кодом высокого уровня, написанным разработчиком, и машинным кодом, который исполняется процессором\.

Рассмотрим этапы компиляции, через которые проходят \.NET приложения\.

## Схема компиляции приложений \.NET

![IL_code_ru/image1.png](https://import.viva64.com/docx/blog/IL_code_ru/image1.png)

1. Компилятор языка переводит исходный код \(C\#, VB\.NET, F\#, C\+\+/CLI\) в IL\-код с метаданными\.
1. JIT/AOT компилятор переводит IL\-код с метаданными в конечный машинный код\.
1. Машинный код начинает исполнение под управлением CLR\.

## Преимущества IL\-кода

Использование механизма промежуточного кода обладает следующими преимуществами:

* **Платформонезависимость\.** IL работает с любой платформой, для которой есть среда выполнения \.NET\.
* **Межъязыковая совместимость\.** Компиляция в промежуточный код позволяет \.NET языкам взаимодействовать друг с другом\. Например, библиотека, написанная на C\#, может без проблем подключаться и использоваться в проекте на F\#\.
* **Безопасность\.** В процессе компиляции промежуточного кода в машинные инструкции выполняется процедура, называемая проверкой, — анализ высокоуровневого промежуточного кода и проверка безопасности всех операций\.
* **Оптимизация исполняемого кода\.** Преобразование IL\-кода в машинный код с помощью JIT\-компилятора позволяет учитывать архитектуру и специфику используемого процессора и операционной системы\. Благодаря этому машинный код будет быстрее и эффективнее работать на любой платформе\.
* **Работа с памятью\.** Среда выполнения \.NET \(CLR\) управляет памятью приложения с помощью сборщика мусора \(Garbage Collector\)\. IL\-код универсально интегрирован с CLR, что позволяет эффективно работать с памятью в приложении, минимизируя утечки и ошибки управления памятью\.

## Пример IL\-кода

Рассмотрим пример IL\-кода для простейшей C\# программы:

```cpp
class Program
{
    public static void Main()
    {
        Console.WriteLine("Hello World!");
    }
}
```

IL\-код будет выглядеть следующим образом, но может отличаться в зависимости от версии \.NET:

```cpp
.class private auto ansi beforefieldinit Program
       extends [System.Runtime]System.Object
{
  .method public hidebysig static void  Main() cil managed
  {
    .entrypoint
    // Code size       13 (0xd)
    .maxstack  8
    IL_0000:  nop
    IL_0001:  ldstr      "Hello World!"
    IL_0006:  call       void [System.Console]System.Console::WriteLine(string)
    IL_000b:  nop
    IL_000c:  ret
  } // end of method Program::Main

  .method public hidebysig specialname rtspecialname 
          instance void  .ctor() cil managed
  {
    // Code size       8 (0x8)
    .maxstack  8
    IL_0000:  ldarg.0
    IL_0001:  call       instance void [System.Runtime]System.Object::.ctor()
    IL_0006:  nop
    IL_0007:  ret
  } // end of method Program::.ctor

} // end of class Program
```

Также IL\-код помогает в понимании неочевидных тонкостей языка\. Пример использования IL\-кода: "[Хорошо ли вы помните nullable value types? Заглядываем "под капот"](https://pvs-studio.ru/ru/blog/posts/csharp/0772/)" и "[Всегда ли в C\# есть упаковка при конкатенации со строкой и интерполяции?](https://pvs-studio.ru/ru/blog/posts/csharp/1060/)"\.

```cpp
```