Введение
Common Language Infrastructure (CLI) – это открытая спецификация, разработанная Microsoft и стандартизированная организацией ECMA как ECMA-335 (впервые в 2001 году), а также ISO/IEC 23271. CLI описывает исполнительную среду, позволяющую программам, написанным на разных языках программирования, выполняться на единой виртуальной машине без изменений исходного кода.
Эталонная реализация CLI – общеязыковая среда выполнения Microsoft CLR (Common Language Runtime), входящая в платформу .NET. Открытая кроссплатформенная реализация – Mono, а с 2016 года – .NET Core и его преемник **.NET 5+**, поддерживающие Windows, Linux и macOS.
История и контекст
CLI была разработана в рамках проекта .NET, анонсированного Microsoft в 2000 году. Стратегическая цель – создать платформу, аналогичную Java Virtual Machine (JVM), но поддерживающую множество языков первого класса: C#, VB.NET, F#, C++/CLI и другие. В 2001 году ECMA стандартизировала как CLI (ECMA-335), так и язык C# (ECMA-334). В 2003 году ISO присвоил соответствующие номера (ISO/IEC 23271 и 23270).
Параллельно Microsoft передала часть реализации в открытый доступ. Проект Mono (2001) под руководством Мигеля де Икаса позволил запускать .NET-приложения на Linux и macOS. В 2014 году Microsoft анонсировала .NET Core как полностью открытую (MIT/Apache) реализацию CLI для кроссплатформенной разработки.
Как это работает
CLI определяет несколько ключевых компонентов:
- CIL (Common Intermediate Language) – байт-код, в который компиляторы всех поддерживаемых языков преобразуют исходный код. Аналог Java bytecode.
- CLR (Common Language Runtime) – виртуальная машина, исполняющая CIL: JIT-компиляция в машинный код, управление памятью (Garbage Collection), безопасность, обработка исключений.
- CTS (Common Type System) – единая система типов, обеспечивающая совместимость объектов между языками (например,
System.Int32одинаков для C# и F#). - CLS (Common Language Specification) – подмножество CTS, гарантирующее, что компоненты, созданные на одном языке, можно использовать из другого.
- Метаданные: каждая сборка (.dll или .exe) содержит описание своих типов и методов в стандартном формате, что обеспечивает рефлексию и самоописание.
Где применяется
- Корпоративная разработка на .NET: бизнес-приложения, веб-сервисы (ASP.NET Core), микросервисы.
- Игровая разработка: Unity использует Mono – реализацию CLI – как скриптовый движок.
- Кроссплатформенные приложения: .NET MAUI позволяет создавать мобильные и десктопные приложения из единой кодовой базы.
- Cloud Native разработка: .NET 8/9 активно используется в контейнерах Docker/Kubernetes на платформах Azure, AWS, GCP.
Преимущества и ограничения
Преимущества: языковая независимость позволяет командам использовать C#, F# и другие языки для разных задач в одном проекте. Мощная экосистема NuGet (более 350 000 пакетов). Открытый стандарт и открытый код (.NET с 2014 года).
Ограничения: JIT-компиляция добавляет накладные расходы при старте приложения (решается AOT-компиляцией в .NET 7+). Исторически .NET был привязан к Windows, хотя .NET Core/5+ решили эту проблему.
Связь с другими понятиями
CLI является фундаментом платформы .NET в целом. Концептуально аналогична JVM (Java Virtual Machine), хотя акцент сделан на многоязычности. Приложения CLI разворачиваются в контейнерах Docker и управляются через CI/CD-пайплайны. Разработка на платформе ведётся в IDE Visual Studio или JetBrains Rider.