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.