Idiomas gerenciados x diferença de idioma compilado?

18

Fico confuso quando as pessoas tentam fazer uma distinção entre idiomas compilados e idiomas gerenciados. Por experiência, entendo que a maioria considera as linguagens compiladas em C, C ++, enquanto as linguagens gerenciadas são Java, C # (obviamente existem mais, mas esses são apenas alguns exemplos). Mas qual é exatamente a principal diferença entre os dois tipos de idiomas?

Meu entendimento é que qualquer programa, independentemente do idioma usado, é essencialmente "compilado" em um código de máquina de baixo nível que é então interpretado, o que faz dos idiomas gerenciados um subconjunto dos idiomas compilados (ou seja, todos os idiomas gerenciados são linguagens compiladas, mas não o contrário)?

l46kok
fonte
2
esse termo é cunhado pela Microsoft, em sentido estrito o Java também é gerenciado. Quase em todos os casos, podemos pensar em línguas geridas como de um subconjunto de que aquele que compiles.Also, isso, eu acredito que está relacionado - programmers.stackexchange.com/questions/72446/...
shabunc
Observe que há uma enorme diferença entre uma linguagem que compila (estaticamente) o código para algo mais gerenciável por máquina antes do tempo de execução (como Java) e uma que faz isso em tempo de execução (como Python). Uma grande diferença é que compilá-lo estaticamente antes do tempo de execução dá ao compilador a chance de fazer algumas otimizações que podem resultar em grandes melhorias de velocidade (como o JIT do Java, reorganizando o código para previsão de ramificação etc.).
Shivan Dragon
6
@ShivanDragon, um "idioma" não compila nada. Sua implementação faz. E você pode compilar o Python estaticamente (consulte PyPy ou IronPython, por exemplo). OTOH, é muito difícil fazê-lo de forma eficiente com uma linguagem de tipagem dinâmica (olhar para cima "rastreamento JIT", "interpretação abstrata", etc.)
SK-lógica
@ SK-logic: concordou, eu disse um vilão. Eu queria me referir à plataforma, não ao idioma.
Shivan Dragon
@shabunc Na verdade, eu diria que Compiled é um subconjunto de Gerenciado. Um idioma gerenciado pode fazer qualquer coisa que um idioma compilado possa fazer (praticamente na mesma velocidade) e mais ainda, pois um idioma gerenciado pode ser compilado. Para fornecer a C os recursos de um idioma gerenciado, você precisa criar uma "VM" e torná-lo um idioma gerenciado.
Bill K

Respostas:

47

A diferença não está em "compilado" vs. "gerenciado", esses são dois eixos ortogonais. Por "gerenciado", normalmente significam a presença de um gerenciamento de memória coletada pelo lixo e / ou a presença de uma infraestrutura de máquina virtual. Ambos não têm absolutamente nada a ver com compilação e o que as pessoas consideram opostas a ela.

Todas essas "diferenças" são bastante borradas, artificiais e irrelevantes, pois sempre é possível misturar memória gerenciada e não gerenciada em um único tempo de execução, e a diferença entre compilação e interpretação também é muito vaga.

SK-logic
fonte
2
Isso é o que eu basicamente tinha em mente, mas já deparei com muitas pessoas que continuam fazendo essa distinção. Obrigado pela resposta clara.
L46kok 10/09/12
Código gerenciado significa ter uma linguagem intermediária para cuidar de qualquer ambiente de execução em que você esteja executando no tempo de execução, certo? Portanto, essa linguagem intermediária (digamos, bytecode) deve ser produzida por um compilador. Na IMO, esse casal "gerencia" o código e o conceito de "compilação" um pouco. No entanto, se o idioma é "compilada", que não mostra ele produz um código gerenciado (ou seja, C ++ vs Java.)
zgulser
@zgulser, não, os idiomas intermediários são ortogonais. Gerenciado significa ter um GC integrado ao tempo de execução do idioma. Por exemplo, o tempo de execução do OCaml é "gerenciado", embora seja compilado diretamente para o nativo.
SK-logic
8

Para citar a Wikipedia:

Código gerenciado é um termo cunhado pela Microsoft para identificar o código-fonte do programa de computador que requer e será executado apenas sob o gerenciamento de uma máquina virtual do Common Language Runtime (resultando em bytecode).

O código gerenciado precisa de um tempo de execução (como o .NET CLT) para ser executado.

janvdl
fonte
5
O código gerenciado não tem nada a ver com uma estrutura. Ele precisa de um tempo de execução que gerencia a memória.
Oded
Talvez minha redação esteja um pouco errada, mas a estrutura .NET não é realmente um "Common Language Runtime"?
janvdl
3
Não. Inclui o CLR, mas também inclui as bibliotecas de classes base, a especificação IL e muito mais.
Oded
4

Eu acho que há uma distinção a ser feita, no entanto, não é necessariamente entre "Compilado" e "Gerenciado". Estes não são opostos; um idioma pode ser compilado e não gerenciado, ou interpretado (não compilado) e gerenciado, ou ambos, ou mesmo nenhum.

Uma linguagem "compilada" é simplesmente aquela em que existe uma etapa que transforma o código fonte gravado pelo desenvolvedor em um "bytecode" mais regular, que é o que é executado pela máquina. A "máquina" pode ser o processador real ou uma "máquina virtual" que executa operações adicionais nos códigos de bytes para convertê-los em instruções de máquina "nativas". O antônimo de uma linguagem "compilada" é uma linguagem "interpretada", na qual o código-fonte é transformado em instruções de bytecode no tempo de execução, linha por linha à medida que são executadas, sem uma etapa de compilação. Um híbrido entre eles é "jitting", de "JIT" (Just In Time), que geralmente é interpretado como uma etapa única pela máquina executora;

Uma linguagem "gerenciada" é uma linguagem projetada para produzir programas consumidos em um ambiente de tempo de execução específico, que quase sempre inclui um intérprete de bytecode; uma "máquina virtual" que pega o código do programa e executa alguma transformação adicional à máquina ou ao ambiente. O ambiente também pode incluir gerenciamento de memória, como um "coletor de lixo" e outros recursos de "segurança" destinados a manter o programa operando dentro de sua "caixa de areia" de espaço e ferramentas, no entanto, esses recursos não são o único domínio dos tempos de execução "gerenciados" . Praticamente todas as linguagens interpretadas podem ser consideradas gerenciadas, porque exigem que o intérprete esteja executando sob as linhas do código do "usuário" sendo executado. Além disso, as linguagens JVM e .NET (Java, Scala, C #, VB, F #, IronWhatever) são compilados em uma linguagem intermediária ou IL, que é superficialmente semelhante em forma e função a uma linguagem assembly binária, mas não adere 100% a nenhum conjunto de instruções "nativo". Essas instruções são executadas pela JVM ou pelo CLR do .NET, que as converte efetivamente em instruções binárias nativas específicas da arquitetura da CPU e / ou SO da máquina.

Portanto, os idiomas geralmente podem ser descritos como "compilados" ou "interpretados" e como "não gerenciados" (ou "nativos") e "gerenciados". Existem idiomas que podem ser descritos como qualquer combinação destes, exceto o "nativo interpretado" possível (o que seria verdadeiro apenas para os códigos de operação hexadecimais escritos à mão, onde o que é escrito pelo desenvolvedor é o que é executado); se você considerar a camada de interpretação como um "tempo de execução" (que é fácil de argumentar e difícil de argumentar), todas as linguagens interpretadas são "gerenciadas".

Se você quer ser técnico, quase todos os programas direcionados para um sistema operacional multitarefa hoje em dia são "gerenciados"; o sistema operacional criará uma "máquina virtual" para cada programa em execução, na qual o programa pensa (ou pelo menos não precisa saber de outra forma) que é a única coisa em execução. O código pode fazer chamadas dentro de si e para outras bibliotecas referenciadas como se esse programa fosse a única coisa carregada na memória; Da mesma forma, as chamadas para alocar RAM e outra memória superior para armazenar e manipular dados e dispositivos de controle são codificadas como se toda a arquitetura de memória estivesse disponível. A VM (e o sistema operacional por trás dela) converte vários ponteiros de memória para o local real do programa, seus dados e conectores aos drivers de dispositivo etc. Isso geralmente é feito aplicando um deslocamento de memória (cada VM recebe um bloco de 2 GB ou qualquer memória, começando no endereço X, que o programa pode tratar como se esse X fosse o endereço 0) e, como tal, é muito barato, mas há outras coisas pelas quais o kernel do sistema operacional é responsável, como agendamento de processos e comunicação entre processos, que são mais difícil de gerenciar. No entanto, esse padrão básico geralmente não é considerado "gerenciado", pois o programa não precisa saber que está sendo executado por uma máquina virtual e ainda é frequentemente responsável por manter a memória alocada "limpa". Um programa que foi projetado para ser executado na linha de comando do MS-DOS pode ser executado em sistemas operacionais Windows mais recentes que nem sequer têm o ambiente do MS-DOS embaixo deles; o programa recebe um ambiente de "console virtual" e, desde que não tente sair dessa "caixa de areia"

KeithS
fonte
"linguagens geralmente podem ser descritas como" compiladas "ou" interpretadas "" - Não, elas não podem. Compilação e interpretação são características de, bem, compiladores e intérpretes, não idiomas. O termo "linguagem compilada" nem faz sentido. Se o inglês fosse um idioma digitado, seria um erro de digitação.
Jörg W Mittag
2
Compiladores e intérpretes geralmente são encontrados compilando e interpretando dialetos muito específicos de idiomas projetados para serem compilados ou interpretados. Ninguém está compilando o código-fonte JavaScript que eu conheço e ninguém está interpretando C #. Os idiomas foram projetados para serem consumidos de uma maneira ou de outra. Como tal, é geralmente aceitável referir-se ao próprio idioma como "compilado" ou "interpretado" porque o ambiente completo em que o idioma é utilizado envolve uma dessas duas etapas.
Keith
pt.wikipedia.org/wiki/Interpreted_language - "Teoricamente, qualquer idioma pode ser compilado ou interpretado; portanto, essa designação é aplicada puramente devido às práticas comuns de implementação e não a algumas propriedades essenciais de um idioma".
Keith
@ KeithS, a Wikipedia não é quase perfeita. O fato de existir um artigo para um determinado termo inválido não o torna mais válido. Sim, as linguagens são sempre projetadas com um certo modo de execução em mente, mas ainda é contraproducente marcá-las como "compiladas" ou "interpretadas" apenas com base na intenção de seus designers. E, quanto a uma interpretação, é realmente difícil encontrar um "intérprete" adequado de qualquer maneira. Tcl é provavelmente o último de seu tipo. Todos os outros chamados "intérpretes" são de fato compiladores.
SK-logic
2

Idioma gerenciado em termos simples, é um idioma de alto nível que depende dos serviços fornecidos por um ambiente de tempo de execução para executar, como o serviço de coleta de lixo, por isso é chamado de gerenciado em geral, mas esse não é o único serviço que usa , e alguns desses serviços são security services, exception handling, standard typesusados Common Language Run-time CLRpara executar, como nas linguagens .Net ou em um ambiente virtual como Java, que usa `Java Virtual Machine JVM.

O idioma não gerenciado é um idioma de baixo nível executável diretamente pelo sistema operacional, sem a necessidade de serviços de tempo de execução virtuais ou idioma intermediário, como idiomas como o C, C++código não gerenciado produzido por esses idiomas, que usa rotinas de biblioteca que são dinamicamente vinculadas ao sistema operacional para obter o Para executar as DLLs (Dynamic Link Libraries), o código não gerenciado acessa a memória diretamente, por isso é mais rápido que o código gerenciado, mas, a menos que você esteja criando um driver de hardware ou um videogame sofisticado, não deseja usar idiomas não gerenciados como pode ser perigoso trabalhar especialmente com desenvolvedores inexperientes, como o estado da funçãowith great power comes great responsibility, e é por isso que os idiomas gerenciados existem para ajudar os desenvolvedores a produzir código extensível sem mergulhar na parte inferior do sistema, mas ainda é possível criar código misto, se necessário, estes artigos explicam tudo:

Uma visão geral da interoperabilidade de código gerenciado / não gerenciado

Exemplo: Misturando C ++ Não Gerenciado, C ++ / CLI e C #

Ashraf Abusada
fonte