Aula prática – geração de código
(.NET)
Teoria e Implementação de Linguagens Computacionais
(Compiladores) - IF688 – 2008.1
Allan Jefferson – ajss at cin.ufpe.br
André Schaffer – arsl at cin.ufpe.br
Roteiro
Introdução
 Principais problemas
 Templates
 Máquina virtual .NET
 Ferramentas
 Exemplo

Introdução (1/3)
ASTdecorada
gerada
Análise AST
Léxica
Tokens e
lexemas
Análise Sintática
Árvore
sintática
abstrata
Análise Semântica
AST
decorada
Geração de Código
Código
Máquina
implementação
abstração
Código
fonte
Introdução (2/3)

Fase essencial do back-end de um
compilador que objetiva preencher o gap
semântico entre a linguagem fonte e a
máquina de destino
◦ Chamada de fase de síntese
Introdução (3/3)

Difícil de generalizar (dependente da
arquitetura)
◦ Variedade de máquinas-destino





Conjunto de registradores (tipo e quantidade)
Conjunto de instruções
Modo de endereçamento
Sistema operacional (nativos)
Dificilmente aproveitada para mais de
uma plataforma
◦ Máquina real ou virtual
Principais problemas

Seleção de código
◦ Uso de templates

Estratégia de alocação
◦ Variável global = armazenamento estático
◦ Variável local = pilha

Alocação de registradores
◦ Avaliar expressões (resultados imediatos)
Templates

Traduzir as diversas frases do código fonte
◦ execute[v := e]
 evaluate e
 assign v
Estrutura inerentemente recursiva
 Tem como entrada uma estrutura de
objetos (AST decorada)

◦ Padrão Visitor
Máquina virtual .NET (1/2)

Common Language Runtime (CLR)
◦ Implementação da Microsoft® da CLI
(Common Language Infrastructure)
◦ Define um ambiente de execução
◦ Roda um tipo de bytecode
 CIL – Common Intermediate Language
 Também conhecido por MSIL – Microsoft Intermediate
Language
 Especificação em:
www/~ajss/Compiladores/Especificacao.NET_CIL.pdf
Máquina virtual .NET (2/2)
Ferramentas

Especificação
◦ Criação dos templates

Assembler
◦ ILAsm.exe
 Intermediate Language Assembler
 Microsoft® .NET Framework
 Tradução para código da plataforma

Disassembler
◦ ILDAsm.exe
 CIL a partir do código da plataforma
EXEMPLO
Exemplo - plplus
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
program exemplo;
function fatorialIterativo(n:Integer):Integer;
var retorno:Integer;
begin
retorno := 1;
while(n <> 0) do
begin
retorno := retorno * n;
n := n - 1;
end;
fatorialIterativo := retorno;
end;
begin
printInt(fatorialIterativo(5));
end.
Exemplo - ilasm.exe

Compilar o código plplus
◦ O código intermediário (exemplo.il)

Prompt do framework .net
◦ cd diretório de exemplo.il

Rodar:
◦ ilasm /output:exemplo.exe exemplo.il
Exemplo - ildasm.exe

Ir até a pasta Bin do Framework .net:
◦ C:\Program Files\Microsoft Visual Studio...

Rodar o Ildasm.exe
◦ Criar um atalho

Abrir o executável que se deseja
“disassemblar”
Dúvidas
Referências
MEIJER, Erik. GOUGH, John. Technical Overview of the Common Language
Runtime: http://research.microsoft.com/~emeijer/Papers/CLR.pdf
 Common Language Runtime Overview:

http://msdn.microsoft.com/en-us/library/ddk909ch(VS.71).aspx

Common Language Specification:
http://msdn.microsoft.com/en-us/library/12a7a7h3.aspx

MSIL Assembler (Ilasm.exe):
http://msdn.microsoft.com/en-us/library/496e4ekx(VS.80).aspx

MSIL Disassembler (Ildasm.exe):
http://msdn.microsoft.com/en-us/library/f7dy01k1(VS.80).aspx

Ildasm.exe Tutorial:
http://msdn.microsoft.com/en-us/library/aa309387(VS.71).aspx

Teoria e implementação de linguagens computacionais:
www.cin.ufpe.br/~if688

WATT, David A. BROWN, Deryck F. Programming language processors in
Java: compilers and interpreters. Pretince Hall, 2000. ISBN 0130257869.
Download

Aula prática geração de código