Qual é a diferença entre o código gerenciado / Byte e não gerenciado / código nativo?

StackOverflow https://stackoverflow.com/questions/252014

  •  05-07-2019
  •  | 
  •  

Pergunta

Às vezes é difícil de descrever algumas das coisas que "nós programadores" pode pensar que são simples de não-programadores e tipos de gestão.

Então ...

Como você descreveria a diferença entre código gerenciado (ou Java Código Byte) e código não gerenciado / nativo a um não-programador?

Foi útil?

Solução

código gerenciado == "apalaçada com uma equipe inteira ou mordomos, empregadas domésticas, cozinheiros e jardineiros para manter o lugar agradável"

código não gerenciado == "Onde eu morava na Universidade"

Outras dicas

pensar em sua mesa, se você limpá-lo regularmente, não há espaço para sentar o que você está realmente trabalhando em na frente de você. se você não limpá-lo, você correr para fora do espaço.

Esse espaço é equivalente aos recursos do computador como RAM, disco rígido, etc.

O código gerenciado permite que o sistema escolhe automaticamente quando eo que limpar. Código não gerenciado torna o processo de "manual" -. Em que as necessidades programador para dizer ao sistema quando e que para limpar

Eu estou surpreendido com o que emerge a partir desta discussão (bem, não realmente, mas retoricamente). Deixe-me acrescentar algo, mesmo se eu estou atrasado.

Máquinas Virtuais (VMs) e coleta de lixo (GC) são décadas de idade e dois conceitos diferentes . ANSI Common Lisp ; assim, há pelo menos um < strong> tempo de compilação linguagem declarativa, Mercury coleta de lixo -. mas aparentemente as massas gritar Prolog-como idiomas)

VMs com base repente GCed byte-code são uma panacéia para todas as doenças de TI. O isolamento de processos de binários (outros exemplos existentes aqui , aqui e aqui )? princípio da menor autoridade (Pola) / recursos de segurança baseada ? Magro binários (ou sua variante moderna SafeTSA )? Região inferência ? Não, senhor: Microsoft e Sun não nos autoriza a pensar ainda apenas cerca de tais perversões. Não, é melhor reescrever toda a nossa pilha de software para este maravilhoso (???) novo (???) language§ / API. Como um dos nossos anfitriões diz, é de Fogo e Movimento tudo de novo.

§ Não seja tolo: eu sei que C # não é a única linguagem que alvo .Net / Mono, é um hipérbole .

Editar: é particularmente instrutivo olhar para comentários a esta resposta por S. Lott à luz das técnicas alternativas para a mobilidade gerenciamento de memória / segurança / código que eu indiquei.

meu ponto é que as pessoas não técnicas não precisa ser incomodado com aspectos técnicos, a este nível de detalhe.

Por outro lado, se eles estão impressionados com Microsoft / Sun comercialização é necessário explicar-lhes que eles estão sendo enganados - GCed byte-code baseada VMs não são essa novidade como eles dizem, eles não resolver magicamente todos os TI problema e alternativas a estas técnicas de implementação existem (alguns são melhores).

Editar 2: Garbage Collection é uma técnica de gerenciamento de memória e, como todas as técnicas de aplicação, necessidade de ser compreendido para ser usado corretamente. Veja como, no ITA Software, eles desvio GC para obter uma boa perfomance :

4 - Porque nós temos cerca de 2 GB de dados estáticos que precisam de acesso rápido a, usamos código C ++ para Memory-Map enorme arquivos contendo estruturas pointerless C (De voos, as tarifas, etc.) e, em seguida acessar estes de Common Lisp usando Dados estrangeira acessos. Um campo de struct compilações de acesso em duas ou três instruções, então não há realmente qualquer desempenho. penalidade para o acesso C ratazanaela do que Lisp objetos. Fazendo este, nós manter o lixo Lisp coletor de ver os dados (para Lisp, cada um apontador para um objecto C é apenas um fixnum, embora o que fazemos muitas vezes envolvê temporariamente esses ponteiros em Lisp objetos para melhorar debuggability). imagens nossa Lisp são portanto apenas cerca de 250 MB de "Trabalho" estruturas de dados e código.

...

9 - Podemos fazer 10 segundos de Lisp computação em uma caixa de 800MHz e contras menos de 5k de dados. Isto é porque Nós pré-alocar todas as estruturas de dados que necessidade e morrer em consultas que excedem eles. Isso pode fazer muitos Lisp programadores encolher, mas com um meg 250 imagem e em tempo real constrangimentos, nós não pode dar ao luxo de gerar lixo . Para exemplo, em vez de usar os contras, nós usar "contras", que agarra células de um variedade de 10.000.000 células nós temos preallocated e que recebe de reset cada consulta.

Editar 3: (a mal-entendidos evitar) é GC melhor do que mexer diretamente com ponteiros? Na maioria das vezes, certamente, mas existem alternativas para ambos . Existe uma necessidade de se preocupar usuários com esses detalhes? Eu não vejo nenhuma evidência de que este é o caso, além de dissipar alguns exageros de marketing quando necessário.

Eu tenho certeza que a interpretação básica é:

  • Dirigido = limpeza dos recursos geridos por tempo de execução (ou seja, Garbage Collection)
  • não gerenciado =-se limpa depois de si mesmo (ou seja malloc & free)

Talvez compará-lo com o investimento no mercado de ações.

Você pode comprar e ações vender a si mesmo, tentando se tornar um especialista no que vai dar o melhor risco / recompensa - ou você pode investir em um fundo que é gerido por um "especialista" que vai fazer isso por você - no custo de você perder algum controle, e, possivelmente, alguma comissão. (É certo que eu sou mais um fã de fundos indexados, eo mercado de ações "especialistas" não exatamente fez brilhante recentemente, mas ....)

Aqui está a minha resposta:

Dirigido (.NET) ou Código Byte (Java) vai lhe poupar tempo e dinheiro.

Agora, vamos comparar os dois:

não gerenciado ou código nativo

Você precisa fazer o seu próprio recurso (/ Memória RAM) alocação e limpeza. Se você esquecer alguma coisa, você acaba com o que é chamado de "vazamento de memória" que pode travar o computador. Um vazamento de memória é um termo para quando um aplicativo começa a usar-se (comendo) Ram / memória, mas não deixá-lo ir para que o computador pode usar se para outras aplicações; Eventualmente, isso faz com que o computador deixe de funcionar.

A fim de executar o aplicativo em diferentes sistemas operacionais (Mac OSX, o Windows, etc.) que você precisa para compilar o código especificamente para cada sistema operacional, e, possivelmente, mudar um monte de código que é específico do sistema operacional para que ele funciona em cada Sistema operacional.

.NET código gerenciado ou código Java byte

Todo o recurso (/ Memória RAM) alocação e limpeza são feitas para você e para o risco de criar "vazamentos de memória" é reduzida a um mínimo. Isto permite mais tempo para código apresenta em vez de gastá-lo em gestão de recursos.

Para executar sua aplicação em diferentes sistemas operacionais (Mac OSX, o Windows, etc.) que você acabou de compilar uma vez, e ele vai executar em cada, enquanto eles apoiar o dado Framework você está corridas de aplicativos em cima ( .NET Framework / Mono ou Java).

Em Breve

O desenvolvimento utilizando o .NET Framework (código gerenciado) ou Java (Código Byte) torná-lo global mais barato construir um aplicativo que pode atingir vários sistemas operacionais com facilidade, e permitir mais tempo para ser gasto construindo ricos recursos em vez do mundano tarefas de gerenciamento de memória / recursos.

Além disso, antes pontos ninguém de fora que o .NET Framework não suporta vários sistemas operacionais, eu preciso salientar que, tecnicamente, Windows 98, WinXP 32 bits, WinXP 64-bit, WinVista 32-bit, WinVista 64- bit e Windows Server são todos diferentes sistemas operacionais, mas o mesmo aplicativo .NET será executado em cada um. E, há também a Mono Projeto que traz .NET para Linux e Mac OSX.

código não gerenciado é uma lista de instruções para o computador a seguir. O código gerenciado é uma lista de tarefas para o acompanhamento computador que o computador é livre para interpretar por conta própria sobre a forma de realizá-los.

A grande diferença é o gerenciamento de memória. Com código nativo, você tem que gerenciar a memória sozinho. Isso pode ser difícil e é a causa de um monte de bugs e muito tempo de desenvolvimento gasto rastrear esses bugs. Com código gerenciado, você ainda tem problemas, mas muito menos deles e eles são mais fáceis de rastrear. Isso normalmente significa software menos bugs, e menos tempo de desenvolvimento.

Existem outras diferenças, mas o gerenciamento de memória é provavelmente o maior.

Se eles ainda estavam interessados ??eu poderia mencionar como um monte de exploits são de estouros de buffer e que você não conseguir isso com código gerenciado, ou que a reutilização de código é agora mais fácil, ou que já não têm de lidar com COM (se você é de qualquer maneira sorte). Eu provavelmente ficaria caminho desde COM caso contrário eu lançar em um discurso inflamado sobre como é terrível.

É como a diferença entre jogar piscina com e sem pára-choques ao longo das bordas. A menos que você e todos os outros jogadores sempre fazer fotos perfeitas, você precisa de algo para manter as bolas em cima da mesa. (Ignorar ricochets intencionais ...)

Ou utilização de futebol com paredes em vez de linhas laterais e linhas finais, ou baseball sem um recuo, ou hóquei sem uma rede por trás da baliza, ou NASCAR sem barreiras, ou futebol sem capacete ...)

"O código termo específico gerenciado é particularmente difundida no mundo da Microsoft."

Desde que eu trabalho no MacOS e Linux mundo, não é um termo que eu uso ou encontro.

O Brad Abrams " Qual é gerenciado Código "post tem uma definição que dizem coisas como" .NET Framework Common Language Runtime".

Meu ponto é este: pode não ser apropriado para explicar os termos em tudo. Se é um erro, cortar ou solução alternativa, não é muito importante. Certamente não o suficiente importante trabalhar-se um sofisticado descrição leigos-pessoas. Ele pode desaparecer com a próxima libertação de alguns lotes de produtos MS.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top