Eu vi essa imagem legal aqui . Aprendi que todos os compiladores que suportam a linguagem .net convertem o código-fonte em CIL
formato. Agora, a Microsoft nunca está trazendo .NET
para todo o sistema operacional escrevendo um CLR para todos os sistemas operacionais. Então, por que manter um formato de código intermediário e um CLR para executar esse CIL. Isso não é uma dor de cabeça para lidar. Por que a Microsoft escolheu ser assim?
EDITAR Essa arquitetura meio tem seu preço. Isso reduzirá o desempenho, não é? O Java faz isso para manter a independência da plataforma, por que motivo o .NET faz isso? Por que não manter um C simples e simples como o compilador? De qualquer maneira, também será necessário um compilador para converter o código em CIL, se eu precisar adicionar um novo idioma, a única diferença que ele faria é o idioma de destino. Tat é tudo.
Respostas:
Porque eles só precisam escrever um compilador para C # no CIL - que é a parte mais difícil. Criar um intérprete (ou mais frequentemente, compilador Just-In-Time) para o CIL por plataforma é relativamente fácil comparado à gravação de um compilador do código C # para (por plataforma) executável.
Além disso, o tempo de execução pode lidar com qualquer coisa que seja compilada no CIL. Se você deseja um novo idioma (como F #), basta escrever um compilador para ele e obter automaticamente todo o suporte da plataforma para as coisas que o .NET suporta.
Ah, e eu posso pegar uma dll .NET e executá-la no Windows ou no Linux via Mono sem recompilação (supondo que todas as minhas dependências sejam satisfeitas).
Quanto ao desempenho, é discutível. Existem "pré-compiladores" essencialmente que pegam o CIL e fazem binários nativos. Outros argumentam que os compiladores just-in-time podem fazer otimizações que os compiladores estáticos simplesmente não podem. Na minha experiência, isso depende muito do que seu aplicativo está fazendo e em qual plataforma você está executando (principalmente o quão bom é o JITer nessa plataforma). É extremamente raro encontrar um cenário em que o .NET não seja bom o suficiente .
fonte
readonly
campos. Os compiladores tradicionais podem fazer algumas dessas otimizações, mas somente quando elas podem ser detectadas pela análise estática. Por outro lado, um tremor pode descobrir em tempo de execução que (por exemplo) uma seção de código não está fazendo nenhum trabalho útil porque os objetos ou variáveis que ele modifica não são referenciados em nenhum outro lugar. Não sou especialista em nervosismo, mas é basicamente uma questão do poder da análise dinâmica versus estática.O .NET possui uma linguagem intermediária (CIL / MSIL) e implementações específicas da plataforma de um CLR (Platform-Independent Runtime) pela mesma razão que Java. A Microsoft pretendia que o C # competisse diretamente com Java, e isso acontece nos sistemas operacionais que a Microsoft visa (próprios).
As vantagens, mesmo que o .NET seja suportado apenas nas plataformas Windows (ou em outros SOs que possuam um .NET semelhante ao Mono / Linux), são semelhantes ao Java:
Por motivos antitruste, a MS toma cuidado para não ser vista "interferindo" demais em outras plataformas importantes como Android, Mac OSX / iOS e Linux; no entanto, ele realmente tem equipes em desenvolvimento para as três plataformas. Existe uma versão desenvolvida pelo MS do Office para OSX, existem vários aplicativos, incluindo aplicativos de interoperabilidade do Office para iOS e Android, o Skype (agora um produto da Microsoft) é executado no Linux, e a Microsoft até contribuiu para o kernel do Linux (principalmente em um mentalidade de virtualização).
fonte
O sistema operacional Windows está disponível para diferentes tipos de CPU, hoje principalmente x64, x86, Intel, ARM.
O CIL / CLR é independente dessa plataforma de hardware - essas diferenças são "abstraídas" pelo ambiente de execução da IL. Por exemplo, um assembly .NET compilado para "qualquer CPU" geralmente pode ser executado no Win64 como um processo de 64 bits e no Win32 como um processo de 32 bits, sem a necessidade de fornecer executáveis diferentes.
Além disso, o CIL permite que os metadados sejam armazenados em assemblies, o que não é possível com DLLs nativas (é possível, é claro, que a MS tenha feito isso antes com componentes COM, mas essa tecnologia nunca foi tão fácil de manusear quanto os componentes .NET). Isso facilita muito a criação de componentes de software e é a base da reflexão / introspecção em todas as linguagens .NET.
fonte