Différence entre «géré» et «non géré»


138

J'entends / lis parfois à propos de .NET, par exemple "code managé" et "code non managé" mais je n'ai aucune idée de ce qu'ils sont et quelles sont leurs différences. Quelle est leur différence, par définition? Quelles sont les conséquences de l'utilisation de l'un ou l'autre? Cette distinction existe-t-elle uniquement dans .NET / Windows?


Réponses:


190

Code géré

Le code managé est ce que les compilateurs Visual Basic .NET et C # créent. Il fonctionne sur le CLR (Common Language Runtime), qui, entre autres, offre des services tels que le ramasse-miettes, la vérification de type au moment de l'exécution et la vérification des références. Alors, pensez-y comme: «Mon code est géré par le CLR».

Visual Basic et C # peuvent uniquement produire du code managé. Par conséquent, si vous écrivez une application dans l'un de ces langages, vous écrivez une application gérée par le CLR. Si vous écrivez une application dans Visual C ++ .NET, vous pouvez produire du code managé si vous le souhaitez, mais c'est facultatif.

Code non géré

Le code non managé se compile directement en code machine. Ainsi, selon cette définition, tout le code compilé par les compilateurs C / C ++ traditionnels est du «code non managé». De plus, comme il se compile en code machine et non en langage intermédiaire, il n'est pas portable.

Pas de gestion de la mémoire libre ou quoi que ce soit d'autre fourni par le CLR

Étant donné que vous ne pouvez pas créer de code non managé avec Visual Basic ou C #, dans Visual Studio tout le code non managé est écrit en C / C ++.

Mélanger les deux

Étant donné que Visual C ++ peut être compilé en code managé ou non managé, il est possible de mélanger les deux dans la même application. Cela brouille la ligne entre les deux et complique la définition, mais cela vaut la peine d'être mentionné pour que vous sachiez que vous pouvez toujours avoir des fuites de mémoire si, par exemple, vous utilisez une bibliothèque tierce avec du code non managé mal écrit.

Voici un exemple que j'ai trouvé en googlant :

#using <mscorlib.dll>
using namespace System;

#include "stdio.h"

void ManagedFunction()
{
    printf("Hello, I'm managed in this section\n");
}

#pragma unmanaged
UnmanagedFunction()
{
    printf("Hello, I am unmanaged through the wonder of IJW!\n");
    ManagedFunction();
}

#pragma managed
int main()
{
    UnmanagedFunction();
    return 0;
}

11
«Puisque vous ne pouvez pas créer de code non managé avec Visual Basic ou C #, tout le code non managé est écrit en C / C ++.»? Vous savez, il existe d'autres langages que C, C ++, C # et VB. J'utilise Delphi pour écrire du code non managé. En outre, une différence assez visible entre le code managé (.NET) et non managé (Win32) est que le premier peut utiliser toutes les fonctions .NET, tandis que le second utilise l'API Windows native.
Andreas Rejbrand

22
Les termes «géré» et «non géré» ont été inventés pour distinguer le code machine de l'IR. Donc, ils n'ont vraiment de sens que dans le contexte de .NET . Le noyau Linux compile également en code non managé, mais ce n'est pas vraiment pertinent pour la discussion, n'est-ce pas?
kurige

6
Cela devient hors sujet, mais mon point est que vous n'avez pas la possibilité d'écrire du code managé dans Delphi, donc déclarer que vous écrivez du code non managé dans Delphi est très redondant. Dans tous les cas, j'ai ajouté "in visual studio" à la phrase incriminée. Aussi, merci pour la mise au point sur la faute de frappe. D'une certaine manière, je l'ai manqué même avec une deuxième lecture.
kurige

Juste pour être un pédant, il est possible d'écrire du code non managé en C # ( connu sous le nom de code "unsafe" )
base

2
@JacksonTale Java n'est pas dans le contexte de .NET, donc le concept de gestion ou non de gestion n'est pas applicable. Voir stackoverflow.com/questions/1326071/ ... pour une explication de la façon dont Java se compile.
Evan Frisch

84

C'est plus général que .NET et Windows. Managed est un environnement dans lequel vous avez la gestion automatique de la mémoire, le garbage collection, la sécurité de type, ... tout le reste est non géré. Ainsi, par exemple .NET est un environnement géré et C / C ++ n'est pas géré.


Selon cette définition, JavaScript serait également du code non géré, n'est-ce pas?
Hampton Terry

@HamptonTerry Javascript a la gestion automatique de la mémoire, le garbage collection et la sécurité de type ... Donc non. Javascript est géré.
Sancarn

13

Le code géré est une différenciation inventée par Microsoft pour identifier le code de programme informatique qui nécessite et ne s'exécutera que sous la «gestion» d'une machine virtuelle Common Language Runtime (résultant en Bytecode).

http://en.wikipedia.org/wiki/Managed_code

http://www.developer.com/net/cplus/article.php/2197621/Managed-Unmanaged-Native-What-Kind-of-Code-Is-This.htm


1
Oui. Pour ajouter à cette réponse, le code managé est le code que vous écrivez normalement en .NET (en C #, par exemple), à ​​l'aide des fonctions .NET. Les applications Windows natives utilisant l'API Windows native (écrite dans n'importe quel langage, peut-être C), par contre, sont "non gérées".
Andreas Rejbrand
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.