2009-05-13 12 views
43

Par exemple, quand on regarde sur le site Web de profileur GlowCode il dit:Différence entre le code natif et le code managé?

"GlowCode 6.2 et natif profil x64, géré et C mixte ++, C#, le code .NET"

Que signifient-ils?

+0

voir aussi http://stackoverflow.com/questions/3434202/what-is-the-difference-between-native-code-machine-code-and-assembly-code –

Répondre

64

Le code natif est le code dont la mémoire n'est pas "gérée", car la mémoire n'est pas libérée pour vous (C++ 'supprimer et C libre, par exemple), pas de comptage de référence, pas de garbage collection. Le code managé, vous l'avez deviné, est le code dont la mémoire est gratuite et allouée pour vous, garbage collection et autres goodies.

Le code mixte est lorsque vous avez du code managé qui appelle sur une couche non gérée. Normalement, lorsque vous avez une DLL C++ pure non managée et que vous l'appelez à partir de .NET en utilisant P/invoke.

+2

Le compilateur C++/CLI permet le code managé (compilé avec '/ clr' et sortie sous MSIL) pour allouer des objets natifs sur le tas natif (pas de garbage collection). En outre, le garbage collector (bureau) .NET n'utilise pas le comptage de références (qui a des problèmes avec les cycles). –

+0

J'ai trouvé cette réponse par Bing. Beaucoup mieux expliqué que le site Web MS. – toddwz

+2

Native * ne signifie pas la gestion de la mémoire. Native signifie que c'est une application Windows ou une DLL. .Net ne crée pas non plus. Il utilise la même extension de fichier que les applications natives, mais le contenu de ces exe et dll ne sont pas des fichiers windows exe et dll. C'est pourquoi vous ne pouvez pas utiliser un .NET "dll" avec une application Windows native, car ce n'est pas une DLL Windows. –

39

Le code natif est compilé pour fonctionner directement avec le système d'exploitation. Cependant, le code géré est précompilé (bytecode en langage Java) mais est ensuite traité par le compilateur Just In Time en code natif lors de l'exécution. Le code géré a l'effet secondaire intéressant d'avoir le potentiel de s'exécuter sur différents systèmes d'exploitation, car le code machine n'est pas créé tant que la machine virtuelle ne l'utilise pas réellement. De cette façon, vous pouvez exécuter des applications .NET sous Windows et les exécuter sur Linux ou Mac sur lequel Mono Runtime est installé. La portabilité n'est pas aussi propre actuellement que Java (à cause de l'architecture naturellement fermée de Microsoft), mais le concept demeure.

Si vous exécutez une application non gérée, le code a été compilé pour s'exécuter pour le système d'exploitation/matériel désigné. Toute portabilité vers un autre ensemble OS/instruction est perdue et doit être recompilée pour être exécutée.

+0

Veuillez expliquer pourquoi "en raison de l'architecture naturellement fermée de Microsoft", "la portabilité n'est pas aussi propre actuellement que Java". Je ne vois pas pourquoi l'architecture naturellement fermée de Microsoft limitera la capacité de .NET à être aussi portable que Java. – Pacerier

+3

@pacerier Ma réponse à votre question aujourd'hui serait différente de celle que j'ai donnée il y a six ans. Il y a six ans .NET n'était pas open source, par exemple. Mais cette annonce donnée assez récemment change tout à cet égard, n'est-ce pas? :) –

+0

Il est également important de souligner que les non-natifs ne peuvent pas s'intégrer avec natif. Par exemple, vous ne pouvez pas créer une application isapi avec .net car elle ne crée pas de dll windows, ou vous ne pouvez pas créer de plugins pour les applications natives en utilisant .net car les choses faites par .net ne sont pas des fichiers OS. –

25

Le code natif est écrit dans le langage machine «natif» de l'ordinateur sur lequel il s'exécute et est exécuté directement par le processeur.

Le code managé est écrit dans une langue spéciale qui nécessite l'exécution d'un autre programme (c'est-à-dire, la gestion). Cet autre programme est souvent appelé un interprète car il interprète le langage spécial.

Les programmes C et C++ sont natifs.

Java et C# (et tous les langages .NET d'ailleurs) sont gérés.

C++ géré est une forme spéciale de C++ qui s'exécute dans l'interpréteur .NET. Un programme mixte est un programme qui utilise un code à la fois natif et géré.

+3

Je voulais juste souligner qu'il y a une différence entre le concept d'un langage interprété, tel que Ruby, Python, Lisp, etc. et un langage VM géré qui utilise la compilation JIT, comme Java et C#. Ces derniers n'ont souvent pas besoin d'utiliser un interpréteur et finissent par se compiler jusqu'au code machine natif. Plus ici: http://en.wikipedia.org/wiki/Interpreted_language –

+0

@dodgy_coder, Êtes-vous sûr que Java se compile en code machine natif? Non, il compile jusqu'à bytecode qui est ** non ** natif code machine. Il en va de même pour les langages CLR comme C#. – Pacerier

+0

Java et C# incluent tous les deux un composant d'exécution, lequel JIT compile le bytecode en code natif. –

5

Le code qui s'exécute sous le contrôle du Common Language Runtime (CLR) est appelé code managé. Le code qui ne s'exécute pas sous le CLR est appelé code natif.

Questions connexes