Какой компонент компилирует код C# в промежуточный язык (IL, байт-код)?

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

Ответ

Основным компилятором, преобразующим исходный код C# в промежуточный язык (Intermediate Language, IL или байт-код .NET), является Roslyn (также известный как .NET Compiler Platform).

Как это работает:

  1. Roslyn (компилятор csc.exe или его API-аналог) анализирует синтаксис и семантику C#-кода.
  2. В результате компиляции создается сборка (.dll или .exe), содержащая IL-код и метаданные.
  3. Во время выполнения JIT-компилятор (Just-In-Time), входящий в состав CLR (Common Language Runtime), преобразует IL-код в машинный код, специфичный для текущей процессорной архитектуры.

Пример: Исходный код C#:

public class HelloWorld
{
    public static void Main() => Console.WriteLine("Hello from IL!");
}

После компиляции Roslyn генерирует IL-код (упрощенно):

.method public hidebysig static void Main() cil managed
{
  .entrypoint
  ldstr      "Hello from IL!"
  call       void [System.Console]System.Console::WriteLine(string)
  ret
}

Ключевые особенности Roslyn:

  • Открытый исходный код и полное API для анализа кода, что позволяет создавать анализаторы, рефакторинги и инструменты.
  • Инкрементальная компиляция для повышения производительности в IDE.
  • Генерация IL, который является платформенно-независимым, что является основой кроссплатформенности .NET.