Common Language Runtime¶
Common Language Runtime (CLR, общеязыковая среда исполнения) — это виртуальная машина, являющаяся ключевым компонентом платформы Microsoft .NET Framework, .NET Core и последующих версий .NET (начиная с .NET 5). CLR обеспечивает выполнение управляемого кода, написанного на языках, поддерживающих .NET (C#, Visual Basic .NET, F# и другие), предоставляя такие сервисы, как автоматическое управление памятью (сборка мусора), обработка исключений, безопасность типов, многопоточность и взаимодействие с неуправляемым кодом. CLR реализует спецификацию Common Language Infrastructure (CLI), стандартизированную организацией ECMA (ECMA-335) и ISO (ISO/IEC 23271).
¶История
Разработка CLR началась в конце 1990-х годов как часть проекта Microsoft по созданию новой платформы для разработки приложений, которая объединила бы лучшие практики различных языков программирования и упростила бы создание распределённых систем. Первоначально платформа называлась Next Generation Windows Services (NGWS), а CLR — её исполняющей средой.
Первая публичная бета-версия .NET Framework 1.0 с CLR была выпущена в 2000 году, а финальный релиз состоялся в 2002 году. CLR стала основой для всей экосистемы .NET, заменив собой более ранние технологии, такие как Component Object Model (COM) и Microsoft Transaction Server (MTS). В 2002 году спецификации CLI и C# были переданы в ECMA, что позволило другим компаниям создавать альтернативные реализации, например, Mono (открытая реализация .NET Framework).
В 2016 году Microsoft выпустила .NET Core — кроссплатформенную, модульную и открытую версию .NET, которая включала собственную реализацию CLR (CoreCLR). CoreCLR был оптимизирован для работы в облачных и контейнерных средах, а также для высокой производительности. В 2020 году .NET Core, .NET Framework и Xamarin были объединены в единую платформу .NET 5, где CLR (теперь часто называемая просто среда выполнения .NET) стала общей для всех сценариев: десктопных, веб- и мобильных приложений.
¶Архитектура и принципы работы
CLR является виртуальной машиной, которая исполняет код, представленный на промежуточном языке — Common Intermediate Language (CIL, ранее MSIL). Процесс выполнения включает несколько этапов:
- Компиляция в CIL. Исходный код на языке высокого уровня (например, C#) компилируется компилятором соответствующего языка в сборку (.exe или .dll), содержащую код на CIL и метаданные (описания типов, методов, членов).
- Загрузка сборки. Когда приложение запускается, CLR загружает главную сборку и все необходимые зависимые сборки. Загрузчик анализирует метаданные и проверяет их целостность.
- JIT-компиляция. Код на CIL не исполняется напрямую. Вместо этого CLR использует Just-In-Time (JIT) компилятор, который переводит CIL-код в машинный код (нативный код) непосредственно перед выполнением. Скомпилированный машинный код кэшируется в памяти для повторного использования. Существует также режим предварительной компиляции (NGen), при котором сборки компилируются в нативный код заранее, во время установки приложения.
- Исполнение. CLR управляет выполнением машинного кода, обеспечивая безопасность типов, контроль доступа к памяти, обработку исключений и синхронизацию потоков. В процессе работы CLR взаимодействует с операционной системой через слой абстракции (платформенный адаптер).
¶Управляемый код и неуправляемый код
Код, который выполняется под управлением CLR, называется управляемым кодом (managed code). CLR обеспечивает для него среду с автоматическим управлением памятью, проверкой границ массивов, контролем версий и другими сервисами. Неуправляемый код (unmanaged code) — это код, который выполняется вне CLR (например, код на C++ или вызовы WinAPI). CLR поддерживает взаимодействие с неуправляемым кодом через механизмы Platform Invoke (P/Invoke) и COM Interop.
¶Ключевые компоненты и сервисы CLR
¶Сборщик мусора (Garbage Collector, GC)
Сборщик мусора автоматически управляет памятью, выделенной для управляемых объектов. Он отслеживает, какие объекты больше не используются (недостижимы), и освобождает занимаемую ими память. GC в CLR является поколенческим (generational): объекты делятся на три поколения (0, 1, 2) по времени жизни. Сборка мусора в поколении 0 происходит часто и быстро, в поколении 2 — реже, но может быть более затратной. GC также поддерживает режимы работы: рабочий (workstation) и серверный (server), которые оптимизированы для разных сценариев.
¶Система типов (Common Type System, CTS)
CTS определяет, как типы данных объявляются, используются и управляются в среде CLR. Она гарантирует, что типы, созданные на разных языках, могут взаимодействовать друг с другом. CTS включает:
- Типы значений (value types): структуры, перечисления, примитивные типы (int, bool, float). Они хранятся непосредственно в стеке или внутри объекта.
- Ссылочные типы (reference types): классы, интерфейсы, делегаты, строки. Они хранятся в куче (managed heap), а переменные содержат ссылки на них.
¶Система метаданных (Metadata)
Каждая сборка .NET содержит метаданные — подробное описание всех типов, их членов (методов, свойств, полей, событий), а также ссылок на другие сборки. Метаданные используются CLR для загрузки типов, разрешения вызовов методов, проверки безопасности и поддержки рефлексии (reflection).
¶Управление выполнением (Execution Engine)
Этот компонент отвечает за загрузку сборок, JIT-компиляцию, управление потоками и синхронизацию. Он также включает:
- Загрузчик классов (Class Loader) — загружает типы по требованию.
- Верификатор (Verifier) — проверяет CIL-код на безопасность типов и корректность перед JIT-компиляцией.
- JIT-компилятор (JIT Compiler) — переводит CIL в машинный код.
¶Обработка исключений (Exception Handling)
CLR предоставляет структурированную обработку исключений (Structured Exception Handling, SEH), которая работает на уровне виртуальной машины. Исключения в .NET — это объекты, наследуемые от класса System.Exception. CLR гарантирует, что при возникновении исключения будет выполнен поиск подходящего обработчика в стеке вызовов, а блоки finally будут выполнены независимо от того, было ли исключение обработано.
¶Безопасность доступа к коду (Code Access Security, CAS)
В ранних версиях .NET Framework CLR реализовывала модель безопасности, основанную на происхождении кода (например, из Интернета, локальной сети или локального компьютера). Начиная с .NET Framework 4.0, CAS была признана устаревшей, и в современных версиях .NET безопасность обеспечивается в основном на уровне операционной системы (например, через sandboxing или контейнеры).
¶Версии и реализации
¶Реализации CLR
- Microsoft CLR (в составе .NET Framework) — оригинальная, закрытая реализация для Windows. Последняя версия — 4.8 (входит в состав Windows 10 и 11).
- CoreCLR (в составе .NET Core) — кроссплатформенная, открытая реализация, оптимизированная для производительности и низкого потребления памяти. Используется в .NET 5, 6, 7, 8 и далее.
- Mono Runtime — открытая реализация CLR, разработанная проектом Mono (первоначально компанией Xamarin, затем поглощена Microsoft). Используется в приложениях Xamarin (Android, iOS) и некоторых версиях Unity.
- .NET Native — технология предварительной компиляции (AOT), которая компилирует CIL-код в нативный код на этапе сборки приложения, исключая необходимость в JIT-компиляции во время выполнения. Используется в приложениях UWP (Universal Windows Platform) и в .NET 8+ для некоторых сценариев.
¶Версии .NET Framework и соответствующие версии CLR
| Версия .NET Framework | Версия CLR | Особенности |
|---|---|---|
| 1.0 | 1.0 | Первая версия, поддержка C# 1.0 и VB.NET. |
| 1.1 | 1.1 | Улучшенная поддержка ASP.NET, исправления ошибок. |
| 2.0 | 2.0 | Значительное расширение: обобщённые типы (generics), частичные классы, nullable типы. |
| 3.0 | 2.0 | Добавлены WPF, WCF, WF, CardSpace (CLR не менялась). |
| 3.5 | 2.0 | LINQ, автоматические свойства, лямбда-выражения (CLR не менялась). |
| 4.0 | 4.0 | Новый сборщик мусора, поддержка динамических типов (DLR), параллельные вычисления (TPL). |
| 4.5 | 4.0 | Поддержка Windows 8, улучшения производительности GC, асинхронное программирование (async/await). |
| 4.6 | 4.0 | Поддержка Windows 10, улучшения JIT-компилятора. |
| 4.7 | 4.0 | Поддержка Windows 10 Creators Update, улучшения WPF. |
| 4.8 | 4.0 | Последняя версия .NET Framework, включена в Windows 10 и 11. |
¶Преимущества и недостатки
¶Преимущества
- Автоматическое управление памятью: снижает риск утечек памяти и ошибок, связанных с ручным управлением памятью.
- Безопасность типов: предотвращает многие классы ошибок времени выполнения.
- Кроссплатформенность (в современных версиях): приложения .NET могут работать на Windows, Linux и macOS.
- Единая модель программирования: разработчики могут использовать разные языки, при этом код на них будет взаимодействовать.
- Богатая библиотека классов: CLR предоставляет доступ к обширной библиотеке .NET (BCL — Base Class Library), которая включает тысячи готовых классов для работы с файлами, сетью, графикой, базами данных и т.д.
- Производительность: современные версии CLR (CoreCLR) демонстрируют высокую производительность, сравнимую с нативными языками, благодаря оптимизациям JIT-компилятора и сборщика мусора.
¶Недостатки
- Накладные расходы на JIT-компиляцию: первый запуск приложения может быть медленнее, чем у полностью нативного кода. Однако это компенсируется кэшированием и предварительной компиляцией.
- Потребление памяти: управляемая среда и сборщик мусора могут потреблять больше оперативной памяти по сравнению с хорошо оптимизированным нативным кодом.
- Зависимость от платформы: хотя .NET Core кроссплатформенен, некоторые возможности (например, WPF) остаются эксклюзивными для Windows.
- Сложность отладки управляемого кода: ошибки, связанные с работой сборщика мусора или JIT-компилятора, могут быть трудны для диагностики.
¶Применение
CLR является основой для большинства современных приложений, созданных на платформе .NET:
- Веб-приложения: ASP.NET Core, ASP.NET MVC, Web API.
- Десктопные приложения: Windows Forms, WPF, UWP.
- Мобильные приложения: Xamarin (Android, iOS), .NET MAUI.
- Облачные сервисы: Azure Functions, микросервисы на .NET.
- Игровые движки: Unity (использует Mono Runtime, основанный на CLR).
- Научные и финансовые приложения: благодаря высокой производительности и безопасности типов.
¶Источники
- Richter, J. CLR via C#. 4th Edition. Microsoft Press, 2012.
- Microsoft. Common Language Runtime (CLR) Overview. Документация Microsoft Learn.
- ECMA International. Standard ECMA-335: Common Language Infrastructure (CLI). 6th Edition, 2012.
- Troelsen, A., Japikse, P. Pro C# 10 with .NET 6. Apress, 2022.
- Microsoft. .NET Core vs .NET Framework: Performance and Architecture. Документация Microsoft Learn.
- Mono Project. Mono Runtime Architecture. Официальная документация.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →


