Что такое Common Language Runtime (CLR) и какие функции она выполняет
Что проверяют
Понимаете ли вы, что именно исполняет ваш код и откуда берутся привычные свойства C#: сборка мусора, исключения, рефлексия, использование библиотек с других языков платформы. Вопрос базовый, поэтому ценится точность формулировок, а не длина ответа.
Как отвечать
CLR это среда выполнения .NET. Компилятор переводит C# не в машинный код, а в промежуточный язык IL вместе с метаданными и складывает всё в сборку. При запуске JIT компилирует IL в машинный код целевой платформы, метод за методом, по мере первого вызова.
Что берёт на себя среда:
- исполнение кода: многоуровневая компиляция (быстрый код сразу, оптимизированный для горячих методов), а также варианты заранее скомпилированного кода и публикации в машинный код;
- управление памятью: сборщик мусора по поколениям и отдельная куча больших объектов, финализаторы;
- типобезопасность: проверка IL и общая система типов, за счёт которой библиотека на одном языке платформы используется из другого;
- исключения со стеком вызовов, поддержка отладки и профилирования;
- метаданные и рефлексия, на которых стоят сериализация и внедрение зависимостей;
- потоки, пул потоков, синхронизация и вызов неуправляемого кода.
Уместно добавить, что в современных выпусках .NET среда называется CoreCLR и работает не только на Windows, а прежний .NET Framework остался привязанным к системе.
Где спотыкаются
Называют CLR интерпретатором. IL не интерпретируется, он компилируется в машинный код перед исполнением, и разница между первым и последующими вызовами метода объясняется именно этим.
Считают, что сборщик мусора освобождает всё. Он отвечает за управляемую память, а файлы, соединения и неуправляемые буферы закрывает разработчик через IDisposable и using. Финализатор это страховка, которая вдобавок откладывает сбор объекта на лишний цикл.
Смешивают уровни и говорят, что CLR это то же самое, что .NET или что C#. Среда исполняет код, библиотеки классов это отдельная часть платформы, а C# лишь один из языков, компилируемых в IL.