AndreyMelnikov.MyBlog # мой блог: IT-марафон.

Все мои посты

Общеязыковая среда исполнения CLR.

Платформа .NET и ее базовый язык программирования - C# на сегодняшний день входит в топ 5 самых популярных языков программирования (по данным площадки GitHub).

C# является языком с Си-подобным синтаксисом и близок в этом отношении к C++ и Java.

Первая версия языка вышла вместе с релизом Microsoft Visual Studio .NET в феврале 2002 года. Текущей версией языка является версия C# 9.0, которая вышла 10 ноября 2020 года вместе с релизом .NET 5.

Как я уже сказал, сам C# является базовым языком, на котором основана платформа .Net.
.Net долгое время развивалась, преимущественно, как платформа для Windows под названием .NET Framework. В 2019 вышла последняя версия этой платформы - .NET Framework 4.8. На данный момент она больше не развивается.
С 2014 Microsoft стал развивать альтернативную платформу - .NET Core, которая уже предназначалась для разных платформ и должна была вобрать в себя все возможности устаревшего .NET Framework и добавить новую функциональность.

Платформу .Net можно охарактеризовать следующими характерными чертами:

  • Поддержка нескольких языков.
  • Кроссплатформенность.
  • Мощная библиотека классов.
  • Высокая производительность.

Все эти черты достигаются благодаря общеязыковой среде исполнения CLR (Common Language Runtime).
CLR - это базовый компонент виртуальной машины .Net, который присутствует в каждой версии платформы. Если очень просто описать суть CLR то это, своего рода, виртуальная машина, которая управляет выполнением программ, (менеджмент памяти, обработка исключений, сборка мусора, управление потоками, трансляция промежуточного кода в машинный и т.д.) написанных на языках, поддерживаемых платформой .Net (самые известные это Python (IronPython), JavaScript(IronJS), C++, Visual Basic(VB.Net)).

На самом деле, описанию архитектуры CLR и ее функционалу посвящены целые книги, и все устроено гораздо сложнее и детализированее, но я хотел бы рассказать о самой сути, чтобы было общее понимание темы.

Допустим, у нас есть исходный код C# (или написанный на другом поддерживаемом языке).
После трансляции этого кода, соответствующий компилятор или интерпретатор (в зависимости от языка) перерабатывает исходный код в ,так называемый, промежуточный (машинно-независимый) IL-код (Intermediate Language) и метаданные. Метаданные включают в себя информацию о типах, фактические реализации функций программы, данные о версиях и тд.
Далее в работу вступает CLR, которая обеспечивает выполнение управляемого промежуточного IL-кода. Внутри себя CLR еще использует JIT (Just-In-Time) компилятор, который преобразует IL-код в машинный код, специфичный для компьютерной среды, на которой работает JIT-компилятор. IL преобразуется в машинный код по требованию, то есть JIT-компилятор компилирует IL по мере необходимости, а не полностью.
Машинный код, полученный с использованием JIT-компилятора, затем исполняется процессором компьютера.

CLR также использует библиотеки классов .Net. Метаданные предоставляют информацию о языке программирования, среде, версии и библиотеках классов. Тем самым мы получаем кроссплатформенность, потому что не важно на какой платформе запускается исходный код, CLR сделает все сама, главное предоставить ей IL-код. То есть языки высокого уровня (или их отдельные интерпретаторы/компиляторы), должны поддерживать CLI (Common Language Infrastructure) – это именно тот промежуточный IL-код, который может быть транслирован непосредственно в машинный код при помощи виртуальной машины CLR.

Я попробовал упрощенно изобразить весь процесс схематически:

В виде отдельных стадий процесс упрощенно будет выглядеть примерно так: