Qu’est-ce que le « code managé » ?
Lorsque vous utilisez .NET, vous rencontrerez souvent le terme « code managé ». Cet article explique ce que signifie le code managé et fournit des informations supplémentaires sur ce code.
Pour le dire simplement, le code managé est simplement celui-ci : le code dont l’exécution est gérée par un runtime. Dans ce cas, le runtime en question est appelé Common Language Runtime ou CLR, quelle que soit l’implémentation (par exemple, Mono, .NET Framework ou .NET Core/.NET 5+). Le CLR est chargé de prendre le code managé, de le compiler dans le code de l’ordinateur, puis de l’exécuter. En outre, le runtime fournit plusieurs services importants tels que la gestion automatique de la mémoire, les limites de sécurité et la sécurité des types.
Contrairement à la façon dont vous exécutez un programme C/C++, également appelé « code non managé ». Dans le monde non managé, le programmeur est responsable de presque tout. Le programme réel est essentiellement un binaire que le système d’exploitation charge en mémoire et démarre. Tout le reste, de la gestion de la mémoire aux considérations de sécurité sont un fardeau du programmeur.
Le code managé est écrit dans l’un des langages de haut niveau qui peuvent être exécutés sur .NET, comme C#, Visual Basic, F# et d’autres. Lorsque vous compilez du code écrit dans ces langages avec leur compilateur respectif, vous n’obtenez pas de code d’ordinateur. Vous obtenez le code intermédiaire que l'environnement d'exécution compile et exécute. C++ est l’une des exceptions à cette règle, car elle peut également produire des fichiers binaires natifs non managés qui s’exécutent sur Windows.
Langage intermédiaire et exécution
Qu’est-ce que le « langage intermédiaire » (ou IL pour faire court) ? Il s’agit d’un produit de compilation du code écrit dans des langages .NET de haut niveau. Une fois que vous avez compilé votre code écrit dans l’un de ces langages, vous obtenez un fichier binaire qui est constitué d'IL. Il est important de noter que l’il est indépendant de n’importe quel langage spécifique qui s’exécute au-dessus du runtime ; il existe même une spécification distincte pour celle-ci que vous pouvez lire si vous êtes si enclin.
Une fois que vous avez produit l'IL à partir de votre code de haut niveau, vous souhaiterez probablement l'exécuter. C’est là que le CLR intervient et démarre le processus de compilation juste-à-temps, ou JIT-ing de votre code à partir du langage intermédiaire en code machine qui peut être exécuté sur un processeur. De cette façon, le CLR sait exactement ce que votre code est en train de faire et peut donc le gérer efficacement.
Le langage intermédiaire est parfois également appelé Common Intermediate Language (CIL).
Interopérabilité du code non managé
Bien sûr, le CLR permet de passer les limites entre le monde managé et non managé, et il y a beaucoup de code qui le fait, même dans les bibliothèques de classes .NET . Cela s’appelle l’interopérabilité, ou interop en abrégé. Ces dispositions vous permettent, par exemple, d’encapsuler une bibliothèque non managée et d’y effectuer des appels. Toutefois, il est important de noter qu’une fois que vous effectuez cette opération, lorsque le code passe les limites du runtime, la gestion réelle de l’exécution est à nouveau dans la main du code non managé et se trouve donc sous les mêmes restrictions.
Comme cela, C# est un langage qui vous permet d’utiliser des constructions non managées telles que des pointeurs directement dans le code en utilisant ce que l’on appelle contexte non sécurisé, qui désigne un élément de code pour lequel l’exécution n’est pas gérée par le CLR.