Quando você escolhe o Framework .NET, você terá uma importante decisão como próximo passo. Qual linguagem eu estudo? Qual linguagem é mais fácil? Qual linguagem tem mais poder? Enfim, você encontrará outra difícil questão : Qual linguagem usar? As diferenças entre as linguagens não se resume somente à sintaxe, como muitos acreditam. Elas se diferenciam, também, pela capacidade que cada uma oferece.

Mas como o framework .NET reconhece tantas linguagens?

R: CLR.

     O CLR(Common Language Runtime) é um runtime que pode ser utilizado por diferentes linguagens de programação. Todas as linguagens compatíveis com o CLR podem usar todos os seus recursos. Se o runtime utiliza exceções para tratar erros, todas as linguagens compatíveis também podem utilizar; Se o runtime permite criar uma thread, todas as linguagens compatíveis também permitem.

     O CLR, em tempo de execução, não sabe qual a linguagem o desenvolvedor usou para escrever o código fonte. Você pode desenvolver código em qualquer linguagem de programação, desde que o seu compilador gere código para o CLR.

     Os compiladores são basicamente verificadores de sintaxe e analisadores de código. Eles verificam se existe algum erro no código que você escreveu e se realmente faz sentido, e gera uma saída que descreve o seu código. A microsoft possui vários compiladores que geram código para o runtime : o C++, o C#, o Visual Basic, o JSCript, o J#(compilador da linguagem java) e um “montador”(assembler) de linguagem intermediária(IL – Código que o compilador gera quando você compila o seu código-fonte).

    Como mostra na figura abaixo, você pode criar arquivos de código-fonte utilizando qualquer linguagem suportada  pelo CLR. Em seguida, você utiliza o compilador correspondente da linguagem, que vai verificar a sintaxe, analisar o seu código e gerar uma saída. O resultado disso, independente do compilador, será um módulo gerenciado.

 
 
 

         Módulo gerenciado é um arquivo executável portável(PE) compatível com o Windows e que necessita do CLR para ser executado. Ele é dividido em 4 partes :

          1. Cabeçalho PE – Indica o tipo de arquivo: GUI, CUI ou DLL; também possui registro de data/hora que indica quando o arquivo foi criado.

          2. Cabeçalho CLR – Inclui a versão correta do CLR, alguns flags, o token de metadados MethodDef do método(Main) e o local/tamanho dos metadados do módulo, recursos, nomes fortes, e outros itens.

          3. Metadados – Possui duas tabelas de metadados. Uma que descreve os tipos e membros definidos no código fonte, e outra que descreve os tipos e membros referenciados por seu código-fonte.

          4. IL(Linguagem Intermediária) – Código que o compilador produziu quando compilou o código-fonte.


      O compilador não gera apenas o código para o CLR, ele gera também metadados completos para cada módulo gerenciado.

      Mas o que são esses metadados?

      Esses metadados são conjuntos de tabelas de dados que descrevem o que está definido no módulo, como tipos e seus membros. Eles estão associados ao arquivo que contém o código IL e estão incorporados no mesmo arquivo EXE/DLL que o código.

      Resumindo o que acontece com o seu código : Você escreve o código-fonte em qualquer linguagem, este código-fonte será compilado no seu próprio compilador(cada linguagem tem o seu compilador). Após passar pelo compilador, foi gerado um módulo gerenciado que contém o código IL que é interpretado pelo CLR e um código-fonte assembler é gerado.

     Bem, aqui foi uma pequena continuação do primeiro post, espero que tenham entendido algumas partes básicas do framework, como compilador, módulo gerenciado, IL, CLR, metadados, entre outros. Se você deseja conhecer bem o framework .NET, terá que entender todos essas 'partes' e componentes que estão descritos neste post.

 

Até a próxima.