Do que trata o artigo

Neste artigo os fundamentos da Microsoft Intermediate Language (MSIL) são apresentados. Trata-se da linguagem utilizada pela plataforma .NET para representar o código intermediário, gerado pelos compiladores das diversas linguagens, antes que eles sejam convertidos em código binário pelo compilador JIT.


Para que serve

Conhecendo os fundamentos da Intermediate Language, é possível entender melhor como as coisas funcionam nos bastidores da plataforma .NET. Ver como o código que é escrito em uma linguagem de alto-nível funcionará.


Em que situação o tema é útil

Permite explorar melhor o conceito de emissão dinâmica de código executável através da biblioteca de Emitting, extrapolando os limites da aplicação através da utilização da biblioteca para criar novos blocos executáveis de código em tempo de execução. Entre outras coisas, é possível utilizar o recurso para gerar objetos mock dinamicamente para interfaces ou classes abstratas, ou ainda, proxys.

Resumo do DevMan

Para conseguir independência de linguagem, o framework .NET criou a chamada Intermediate Language. Sendo assim, todo compilador .NET não gera código nativo, mas sim um código escrito nessa linguagem intermediária. Entender essa linguagem auxilia na compreensão do próprio funcionamento do framework. Neste artigo 4 exemplos são criados, todos utilizando a IL como código fonte para garantir o aprendizado do trabalho interno do .NET Framework.

Você sabe o que acontece quando compila seus programas? Antes do advento do .NET, compilar um programa significava converter nossos códigos para linguagem de máquina (assembly), que era entendida pelo processador. No .NET temos uma etapa a mais: todos os nossos programas quando compilados são convertidos para uma linguagem intermediária, chamada Intermediate Language, que só mais tarde, em tempo de execução, é convertida para código de máquina (ou código nativo, como preferir).

A IL – Intermediate Language (também conhecida comoCommon Intermediate Language (CIL), ou aindaMicrosoft Intermediate Language (MSIL)) é conceito central do .NET framework. Independente da linguagem de programação que você utilize, quando compila, seu código-fonte é convertido para IL. Então, se você deseja entender melhor como .NET funciona, recomendo que aprenda, pelo menos um pouco, de IL. Entendendo IL você conseguirá:

• Entender melhor como o código gerenciado que você escreve realmente funciona;

• Examinar o código gerado pelo compilador (independente da linguagem);

• Escrever algum código diretamente em IL.

IL – uma linguagem com dois formatos

Em sua forma mais comum, Intermediate Language é uma linguagem binária. Como ocorre com a linguagem assembly nativa, uma instrução IL é armazenada em um container assembly (geralmente arquivos .exe ou .dll) em uma representação numérica binária (também conhecida como opcode).

Entretanto, como também ocorre com um código executável nativo, uma linguagem textual foi definida para representar a IL. Essa linguagem é constituída por códigos mnemônicos que, por sua vez, representam os comandos IL binários. Essa linguagem é conhecida como IL assembly. Entretanto, como IL Assembly é um nome muito longo, existe uma convenção em encurtar esse nome para ILAsm ou, simplesmente, código-fonte IL.

Recapitulando, todo arquivo executável (EXE) ou biblioteca (DLL) que seu compilador gera para você contém um código executável. Em .NET, esse código está escrito em uma especificação conhecida como Intermediate Language, que é binária. Além disso, existe uma forma textual de representar esse conteúdo executável.

Você pode ver a representação IL de seu código quando quiser

A Microsoft disponibiliza um utilitário que acompanha o SDK do .NET Framework, chamado ILDasm. Ao executá-lo, através do Command Prompt do Visual Studio, é possível escolher um arquivo binário, um programa feito em .NET qualquer, e seu IL será exibido como mostra a Figura 1.

Figura 1. Interface do ILDasm

Além de exibir a estrutura do programa, o ILDasm ainda permite que se navegue nos métodos do mesmo. Basta dar dois cliques em um método para que o código IL correspondente seja apresentado (Figura 2).

Figura 2. Código IL apresentado pelo ILDasm

Intermediate Language, dados e sua “máquina virtual”

A IL funciona sob o conceito de máquina virtual. Em palavras simples, a linguagem é baseada em uma arquitetura de computador imaginária (não fiel a como as coisas de fato acontecem no computador). A máquina virtual do .NET é conhecida como CLR (Common Language Runtime).

A CLR do .NET foi projetada para garantir consistência de tipos (type-safe) e isso é um dos fatores que torna o JIT tão eficiente na hora de converter o código IL para código nativo da máquina.

NA CLR temos, em alto-nível, variáveis locais, atributos de instância, atributos estáticos, variáveis globais, além de dados que foram passados como argumentos para os métodos. Embora o hábito seja pensar nesses dados de maneiras diferentes, como espécies de dados diferentes de memória, por “baixo do capô” (gosto da expressão), estas formas de dados são tratadas como da mesma espécie em posições diferentes de memória.

Os designers da CLR foram extremamente felizes ao levar a abstração das espécies de dados das linguagens de nível mais alto para o nível mais baixo. A IL mantém essa abstração. Sendo que aqui começa um distanciamento da IL, enquanto linguagem de montagem, da linguagem de montagem para código nativo, sobretudo do 8086.

...
Quer ler esse conteúdo completo? Tenha acesso completo