2009-05-13 19 views
43

Ad esempio, quando guardando il sito web profiler GlowCode si dice:Differenza tra codice nativo e codice gestito?

"GlowCode 6.2 e il profilo x64 nativo, gestiti e misto C++, C#, NET"

cosa significano?

+0

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

risposta

64

Il codice nativo è il codice la cui memoria non è "gestita", come in, la memoria non è liberata per te (C++ 'delete e C's free, per esempio), nessun conteggio dei riferimenti, nessuna garbage collection. Il codice gestito, avete indovinato, è il codice la cui memoria è libera e allocata per voi, garbage collection e altre chicche.

Il codice misto è quando si gestisce il codice che chiama su un livello non gestito. Normalmente, quando si ha una DLL C++ pura non gestita e la si chiama da .NET usando P/invoke.

+2

Il compilatore C++/CLI consente il codice gestito (compilato con '/ clr' e prodotto come MSIL) per allocare oggetti nativi nell'heap nativo (no garbage collection). Inoltre, il garbage collector (desktop) .NET non usa il conteggio dei riferimenti (che ha problemi con i cicli). –

+0

Ho trovato questa risposta da Bing. Molto meglio spiegato rispetto al sito Web di MS. – toddwz

+2

Nativo * non * significa gestione della memoria. Nativo significa che è un'applicazione o una DLL di Windows. .Net non crea neanche. Utilizza la stessa estensione di file di un'applicazione nativa, ma il contenuto di quelli di exe e dll non sono windows exe e dll. Questo è il motivo per cui non è possibile utilizzare una .net "dll" con un'applicazione nativa di Windows, perché non è una dll di Windows. –

39

Il codice nativo viene compilato per funzionare direttamente con il sistema operativo. Il codice gestito, tuttavia, è precompilato (bytecode in linguaggio Java) ma viene poi elaborato dal compilatore Just In Time al codice nativo in fase di runtime. Il codice gestito ha l'interessante effetto collaterale di avere il potenziale per l'esecuzione su diversi sistemi operativi, poiché il codice macchina non viene creato finché la VM non lo utilizza effettivamente. In questo modo, puoi eseguire app .NET su Windows ed eseguirle anche su Linux o Mac su cui è installato il runtime Mono. La portabilità non è così pulita al momento come Java (a causa dell'architettura naturalmente chiusa di Microsoft), ma il concetto rimane.

Se si sta utilizzando un'app non gestita, il codice è stato compilato per l'OS/Hardware designato. Qualsiasi portabilità verso un altro sistema operativo/set di istruzioni viene persa e deve essere ricompilata per l'esecuzione.

+0

Si prega di spiegare perché "a causa dell'architettura naturalmente chiusa di Microsoft", "la portabilità non è così pulita al momento come Java". Non vedo perché l'architettura chiusa di Microsoft limiterà la capacità di .NET di essere portabile come Java. – Pacerier

+3

@pacerier La mia risposta alla tua domanda oggi sarebbe diversa da quella che ho dato sei anni fa. Sei anni fa .NET non era open source, per esempio. Ma quell'annuncio dato abbastanza recentemente cambia tutto a riguardo, no? :) –

+0

Inoltre è importante sottolineare che non nativo non può essere integrato con nativo. Ad esempio, non è possibile creare un'applicazione isapi con .net perché non crea windows dll, oppure non è possibile creare plugin per applicazioni native usando .net perché le cose .net non sono file OS. –

25

Il codice nativo è scritto nella lingua macchina "nativa" del computer su cui è in esecuzione ed è eseguito direttamente dal processore.

Il codice gestito è scritto in una lingua speciale che richiede l'esecuzione di un altro programma (ovvero la gestione). Questo altro programma viene spesso chiamato un interprete in quanto interpreta il linguaggio speciale.

I programmi C e C++ sono nativi.

Java e C# (e tutti i linguaggi .NET per quella materia) sono gestiti.

Managed C++ è una forma speciale di C++ che viene eseguita nell'interprete .NET.

Un programma misto è un programma che utilizza codice nativo e gestito.

+3

Volevo solo sottolineare che esiste una differenza tra il concetto di un linguaggio interpretato, come Ruby, Python, Lisp, ecc. E un linguaggio VM gestito che utilizza la compilazione JIT, come Java e C#. Questi ultimi spesso non hanno bisogno di usare un interprete e alla fine compilare il codice macchina nativo. Più qui: http://en.wikipedia.org/wiki/Interpreted_language –

+0

@dodgy_coder, Sei sicuro che Java compili il codice macchina nativo? No, compila verso il basso in bytecode che è ** non codice macchina nativo **. Lo stesso vale per i linguaggi CLR come C#. – Pacerier

+0

Java e C# includono entrambi un componente runtime, che JIT compila il bytecode nel codice nativo. –

5

Il codice che viene eseguito sotto il controllo del Common Language Runtime (CLR) è noto come codice gestito. Il codice che non viene eseguito con CLR è noto come codice nativo.

Problemi correlati