Что такое управляемый код

При работе с платформой .NET вы будете часто сталкиваться с термином "управляемый код". В этом документе приводится пояснение этого термина и дополнительные сведения о нем.

В первом приближении управляемым кодом называется код, выполнение которого управляется средой выполнения. В этом случае соответствующая среда выполнения называется общеязыковой средой выполнения или средой CLR, независимо от реализации (например, Mono, .NET Framework или .NET Core/.NET 5 и более поздних версий). Среда CLR отвечает за использование управляемого кода, его компиляцию в машинный код и последующее выполнение. Кроме того, среда выполнения предоставляет несколько важных служб, таких как автоматическое управление памятью, границы безопасности, безопасность типа и т. д.

Сравните это с запуском программы C/C++, которая также называется "неуправляемым кодом". В мире неуправляемого кода практически за все отвечает программист. Сама программа представляет собой двоичный файл, который операционная система (ОС) загружает в память и запускает. За все остальное — от управления памятью до различных аспектов безопасности — отвечает программист.

Управляемый код пишется в одном из языков высокого уровня, которые могут выполняться в .NET, например C#, Visual Basic, F# и других. При компиляции кода, написанного на этих языках, с помощью соответствующего компилятора вы получаете не машинный код. Вы получаете код промежуточного языка, который затем компилируется и запускается средой выполнения. Язык C++ является исключением из этого правила, так как он позволяет создавать машинные неуправляемые двоичные файлы, которые запускаются в Windows.

Промежуточный язык и выполнение

Что такое "промежуточный язык" (сокращенно IL)? Это результат компиляции кода, написанного на языках высокого уровня .NET. После компиляции кода, написанного на одном из этих языков, вы получаете двоичный файл на базе IL. Важно отметить, что IL не зависит от языка, выполняемого поверх среды выполнения. Для него даже есть отдельная спецификация, с которой при желании можно ознакомиться.

После создания IL из кода высокого уровня вы, скорее всего, захотите запустить его. В этот момент среда CLR берет управление на себя и запускает процесс JIT-компиляции, используя JIT для преобразования кода из промежуточного языка в машинный код, который может выполняться на ЦП. Таким образом, среде CLR точно известно, что делает код, поэтому она может эффективно управлять им.

Промежуточный язык иногда называют языком CIL или MSIL.

Взаимодействие неуправляемого кода

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

Аналогично, C# — это язык, позволяющий использовать неуправляемые конструкции, такие как указатели, прямо в коде с помощью так называемого небезопасного контекста, указывающего часть кода, для которой выполнение не управляется средой CLR.

Дополнительные ресурсы