Diferença entre "gerenciado" e "não gerenciado"

138

Às vezes, ouço sobre isso quando falo sobre .NET, por exemplo, "código gerenciado" e "código não gerenciado", mas não tenho idéia do que são e quais são suas diferenças. Quais são as diferenças deles, por definição? Quais são as conseqüências do uso de um deles? Essa distinção existe apenas no .NET / Windows?

Louis Rhys
fonte

Respostas:

190

Código gerenciado

Código gerenciado é o que os compiladores do Visual Basic .NET e C # criam. É executado no CLR (Common Language Runtime), que, entre outras coisas, oferece serviços como coleta de lixo, verificação de tipo em tempo de execução e verificação de referência. Portanto, pense nisso como "Meu código é gerenciado pelo CLR".

Visual Basic e C # podem produzir código gerenciado; portanto, se você estiver escrevendo um aplicativo em um desses idiomas, está criando um aplicativo gerenciado pelo CLR. Se você estiver escrevendo um aplicativo no Visual C ++ .NET, poderá produzir código gerenciado, se quiser, mas é opcional.

Código não gerenciado

O código não gerenciado é compilado diretamente no código da máquina. Portanto, por essa definição, todo código compilado pelos compiladores C / C ++ tradicionais é 'código não gerenciado'. Além disso, como é compilado para código de máquina e não para um idioma intermediário, ele não é portátil.

Sem gerenciamento de memória livre ou qualquer outra coisa que o CLR fornece.

Como você não pode criar código não gerenciado com o Visual Basic ou C #, no Visual Studio todo o código não gerenciado é gravado em C / C ++.

Misturando os dois

Como o Visual C ++ pode ser compilado em código gerenciado ou não gerenciado, é possível misturar os dois no mesmo aplicativo. Isso obscurece a linha entre os dois e complica a definição, mas vale a pena mencionar apenas para que você saiba que ainda pode haver vazamentos de memória se, por exemplo, você estiver usando uma biblioteca de terceiros com algum código não gerenciado mal escrito.

Aqui está um exemplo que eu encontrei pesquisando no Google :

#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;
}
Kurige
fonte
11
"Como você não pode criar código não gerenciado com o Visual Basic ou C #, todo o código não gerenciado é gravado em C / C ++."? Você sabe, existem outros idiomas além de C, C ++, C # e VB. Eu uso o Delphi para escrever código não gerenciado. Além disso, uma diferença bastante visível entre o código gerenciado (.NET) e o não gerenciado (Win32) é que o primeiro pode usar todas as funções do .NET, enquanto o último usa a API nativa do Windows.
Andreas Rejbrand
22
Os termos 'gerenciado' e 'não gerenciado' foram inventados para distinguir o código de máquina do IR. Portanto, eles realmente só têm significado no contexto do .NET . O kernel do linux também compila para código não gerenciado, mas isso não é realmente relevante para a discussão, é?
precisa saber é o seguinte
6
Isso está ficando fora de tópico, mas o que quero dizer é que você não tem a opção de escrever código gerenciado no Delphi, portanto, afirmar que você escreve código não gerenciado no Delphi é altamente redundante. De qualquer forma, adicionei "no visual studio" à sentença ofensiva. Além disso, obrigado pelo aviso sobre o erro de digitação. De alguma forma, eu perdi mesmo com uma segunda leitura.
kurige
Só para ter uma pedand, é possível escrever código não gerenciado em C # ( conhecido como código "inseguro" )
Básico
2
@JacksonTale Java não está no contexto do .NET, portanto, o conceito de ser gerenciado ou não gerenciado não é aplicável. Consulte stackoverflow.com/questions/1326071/… para obter uma explicação de como o Java é compilado.
Evan Frisch
84

Isso é mais geral que o .NET e Windows. Gerenciado é um ambiente em que você tem gerenciamento automático de memória, coleta de lixo, segurança de tipos, ... não gerenciado é tudo o mais. Por exemplo, o .NET é um ambiente gerenciado e o C / C ++ não é gerenciado.

Darin Dimitrov
fonte
Por essa definição, o JavaScript também seria um código não gerenciado, correto?
Hampton Terry
@HamptonTerry Javascript possui gerenciamento automático de memória, coleta de lixo e segurança de tipo ... Então não. Javascript é gerenciado.
Sancarn
13

Código gerenciado é uma diferenciação criada pela Microsoft para identificar o código do programa de computador que requer e só será executado sob o "gerenciamento" de uma máquina virtual do Common Language Runtime (resultando em 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

RobertPitt
fonte
1
Sim. Para adicionar a essa resposta, código gerenciado é o código que você escreve normalmente no .NET (em C #, por exemplo), usando as funções do .NET. Aplicativos nativos do Windows usando a API nativa do Windows (escrita em qualquer idioma, C talvez), por outro lado, são "não gerenciados".
Andreas Rejbrand