Для чего нужен Intermediate Language (IL) в .NET?

«Для чего нужен Intermediate Language (IL) в .NET?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Intermediate Language (IL, или CIL/MSIL) — это низкоуровневый, платформенно-независимый язык ассемблера, в который компилируется исходный код .NET (C#, F#, VB.NET). IL является ключевым компонентом для обеспечения переносимости, безопасности и производительности.

Основные задачи IL:

  1. Платформенная независимость: Один и тот же IL-код может выполняться на любой платформе, где есть реализация CLR (Windows, Linux, macOS).
  2. Языковая интеграция: Разные языки .NET компилируются в единый IL, что позволяет им беспрепятственно взаимодействовать в одной сборке.
  3. JIT-компиляция и оптимизация: Во время выполнения CLR компилирует IL в нативный машинный код, специфичный для текущего процессора и контекста, что часто дает лучшую оптимизацию, чем статическая компиляция.
  4. Верификация и безопасность: CLR проверяет IL-код на типобезопасность и корректность перед выполнением, предотвращая многие ошибки и уязвимости.

Пример IL для простого метода C#:

Код C#:

public int Add(int a, int b) => a + b;

Соответствующий IL (упрощенно):

.method public hidebysig instance int32 Add(int32 a, int32 b) cil managed
{
    .maxstack 2
    ldarg.1  // Загружаем первый параметр 'a' в стек
    ldarg.2  // Загружаем второй параметр 'b' в стек
    add      // Складываем два верхних значения стека
    ret      // Возвращаем результат из стека
}

Итог: IL служит промежуточным, унифицированным представлением кода, которое отделяет высокоуровневые языки .NET от конкретной машинной архитектуры.