De que se trata o artigo

O artigo trata da linguagem intermediária, que é gerada pelo processo de compilação. É graças a MSIL(Microsoft Intermediate Language) que torna-se possível a interoperabilidade entre bibliotecas .NET, como por exemplo escrever uma biblioteca em Visual Basic.NET e consumir em uma aplicação desenvolvida em C#.

Em que situação o tema é útil

Conhecer IL é fundamental para saber como seu código vai se comportar quando estiver em execução, o que é gerado e quais instruções são passadas para o processador. Além disso, para entender alguns recursos do framework .NET como, por exemplo, a interface IEnumerable e seu funcionamento, é necessário conhecimento em intermediate language.

Intermediate Language – Entendendo o .NET por debaixo dos panos

Neste artigo será apresentado a linguagem desenvolvida pela Microsoft, que é gerada no processo de compilação dos programas desenvolvidos na plataforma .NET. Veremos como interpretar um código em IL, também como recuperar o IL de um executável (.exe) ou biblioteca (.dll). Além disso, veremos como escrever um programa em .NET somente usando IL e consumir em um projeto usando C#. Será demonstrado um exemplo de interpretação de IL para entendermos aquele código que achávamos que está certo, mas executa de uma maneira não esperada, para isso vamos decompilar o programa executado e escovar os bits em IL, ou seja, vamos nos aprofundar nas rotinas do programa com intuito de melhorar o desempenho do mesmo.

Antigamente a programação, onde C e C++ dominavam os programadores, existia a necessidade de se preocupar em alocar e desalocar as variáveis da memória a fim de evitar, por exemplo, vazamentos de memória (Memory Leak) que é exatamente o fato de alocarmos um espaço na memória para um processo e não liberá-lo quando não necessitamos mais. Várias linguagens, como o .NET, têm a característica de serem gerenciadas automaticamente pela máquina virtual sob a qual executam suas rotinas. No .NET essa máquina virtual é conhecida como CLR(Common Language Runtime) que, através do garbage collector (coletor de lixo), fica de tempos em tempos coletando o lixo deixado por essas áreas de memória que estão alocadas mas não apontam para mais ninguém. Muitas vezes, o programador dessa linguagem não possui o conhecimento da existência de ponteiros, ou seja, desconhecem em qual espaço na memória determinada informação está guardada.

A plataforma .NET possui uma especificação chamada CLS (Common language Specification) que define uma série de padrões que o compilador deve seguir ao gerar a IL. Devido a essa padronização, é possível outras linguagens “entenderem” as classes definidas em outras linguagens. Após uma padronização do C# MSIL, agora é chamada de CIL (Nota do DevMan 1).

Intermediate language é uma linguagem binaria, orientada a objeto e se assemelha a linguagem nativa Assembly, as instruções de IL são armazenadas em um container assembly, geralmente em arquivos executáveis (.exe) ou arquivos de bibliotecas (dll) com um número binário conhecido como OpCode.

Como a linguagem Assembly é constituída por códigos mnemônicos que, por sua vez, representam os comandos IL binários, logo todo arquivo de extensão .exe ou .dll contém código executável que é descrito em IL e é binário.

Nota do DevMan 1

ACommon Intermediate Language(ouCIL) é umalinguagem de programaçãode baixo nível do ambiente de programação daMicrosoft. O código de mais alto nível do ambiente.NET Frameworkécompiladoem código CIL, que é assemblado em código chamado bytecode. CIL é um código orientado a objeto e executado por umamáquina virtual.

Por que aprender IL

Apesar de trabalharmos com uma linguagem de código gerenciado, o estudo da IL é de suma importância. Após aprender IL você começará a entender como se comporta o .NET. Sem esse conhecimento, é muito difícil entender como certos comportamentos dos objetos da plataforma acontecem, gerando confusões no código desenvolvido. Por exemplo, quando se escreve um código e se imagina que o mesmo deveria funcionar de uma maneira, mas o comportamento não é o esperado, gerando aquela pergunta: “Por que não funciona?”.

A máquina virtual

Vale frisar que a linguagem desenvolvida pela Microsoft funciona sob uma máquina virtual, como o java. Diferente de assembly, a linguagem não é completamente fiel ao comportamento real que é executado pelo processador. A linguagem é fundamentada em uma arquitetura de computador inexistente.

As variáveis são armazenadas em locais específicos, apesar de nas linguagens de alto nível não ser visível essa diferença. A responsabilidade é da máquina virtual em fazer as conversões das “categorias de memória” em informações alocadas na memória do computador.

Os engenheiros da Microsoft fizeram um bom trabalho ao tratar da abstração das “categorias de memória”, e esse é um dos motivos que faz com que o trabalho direto com IL seja mais fácil do que com outros Assemblies.

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