2009-05-13 21 views
43

Por ejemplo, cuando se mira en el sitio web de perfiles GlowCode Dice:Diferencia entre el código nativo y el código administrado?

"GlowCode 6.2 y el perfil x64 nativa, administrado, y se mezcla C++, C#, NET"

¿qué significan?

+0

ver también http://stackoverflow.com/questions/3434202/what-is-the-difference-between-native-code-machine-code-and-assembly-code –

Respuesta

64

El código nativo es el código cuya memoria no está "administrada", como en, la memoria no se libera (C++ 'eliminar y C libre, por ejemplo), no hay recuento de referencias, no hay recolección de basura. El código administrado, lo adivinó, es el código cuya memoria está libre y asignada para usted, recolección de basura y otras cosas.

El código mixto es cuando tiene código administrado que llama a una capa no administrada. Normalmente, cuando tiene una DLL pura de C++ no administrada, la llama desde .NET usando P/invoke.

+2

El compilador C++/CLI permite el código administrado (compilado con '/ clr' y salida como MSIL) para asignar objetos nativos en el montón nativo (sin recolección de basura). Además, el recolector de basura (de escritorio) .NET no utiliza el recuento de referencias (que tiene problemas con los ciclos). –

+0

Encontré esta respuesta por Bing. Mucho mejor explicado que el sitio web de MS. – toddwz

+2

Nativo * no * significa gestión de memoria. Nativo significa que es una aplicación de Windows o dll. .Net tampoco crea. Utiliza la misma extensión de archivo que las aplicaciones nativas, pero el contenido de los archivos exe y dll no son windows exe ni dll. Esta es la razón por la cual no se puede usar .NET "dll" con una aplicación de Windows nativa, porque no es una DLL de Windows. –

39

El código nativo se compila para trabajar directamente con el sistema operativo. Sin embargo, el código administrado está precompilado (bytecode en Java-speak) pero luego el compilador Just In Time lo procesa en código nativo en tiempo de ejecución. El código administrado tiene el efecto secundario interesante de tener la posibilidad de ejecutarse en diferentes sistemas operativos, ya que el código de la máquina no se crea hasta que la VM realmente lo usa. De esta forma, puede ejecutar aplicaciones .NET en Windows y también ejecutarlas en Linux o Mac que tengan instalado el tiempo de ejecución Mono. La portabilidad no es tan limpia actualmente como lo es Java (debido a la arquitectura naturalmente cerrada de Microsoft), pero el concepto permanece.

Si está ejecutando una aplicación no administrada, el código ha sido compilado para ejecutarse para el sistema operativo/hardware designado. Cualquier portabilidad a otro conjunto de OS/instrucción se pierde y debe recompilarse para ejecutarse.

+0

Explique por qué "debido a la arquitectura naturalmente cerrada de Microsoft", "la portabilidad no es tan limpia actualmente como lo es Java". No veo por qué la arquitectura cerrada de Microsoft limitará la capacidad de .NET para ser tan portátil como Java. – Pacerier

+3

@pacerier Mi respuesta a su pregunta de hoy sería diferente a la que di hace seis años. Hace seis años, .NET no era de código abierto, por ejemplo. Pero ese anuncio dado bastante recientemente cambia un poco todo en ese sentido, ¿no? :) –

+0

También es importante señalar que los no nativos no pueden integrarse con los nativos. Por ejemplo, no puede crear una aplicación de isapi con .net porque no crea dll de Windows, o no puede crear complementos para aplicaciones nativas usando .net porque las cosas que hace .net no son archivos de sistema operativo. –

25

El código nativo está escrito en el lenguaje de máquina "nativo" de la computadora en la que se está ejecutando y se ejecuta directamente por el procesador.

El código administrado está escrito en un idioma especial que requiere que otro programa lo ejecute (es decir, lo administre). Este otro programa a menudo se denomina intérprete ya que interpreta el idioma especial.

Los programas C y C++ son nativos.

Se administran Java y C# (y todos los lenguajes .NET).

Managed C++ es una forma especial de C++ que se ejecuta en el intérprete de .NET.

Un programa mixto es un programa que usa código nativo y administrado.

+3

Solo quería señalar que existe una diferencia entre el concepto de un lenguaje interpretado, como Ruby, Python, Lisp, etc. y un lenguaje de VM administrado que usa la compilación JIT, como Java y C#. Estos últimos a menudo no necesitan usar un intérprete y al final compilar hasta el código de máquina nativo. Más aquí: http://en.wikipedia.org/wiki/Interpreted_language –

+0

@dodgy_coder, ¿Estás seguro de que Java compila hasta el código máquina nativo? No, se compila en bytecode que es código de máquina ** no nativo **. Lo mismo ocurre con los lenguajes CLR como C#. – Pacerier

+0

Java y C# incluyen un componente de tiempo de ejecución, que JIT compila el bytecode en código nativo. –

5

El código que se ejecuta bajo el control del Common Language Runtime (CLR) se conoce como código administrado. El código que no se ejecuta bajo CLR se conoce como código nativo.

Cuestiones relacionadas