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
Árvore sintática abstrata Introdução (1/3) abstração implementação Código fonte Tokens e lexemas Árvore sintática abstrata Código Máquina AST decorada Análise Léxica Análise Sintática Análise Semântica Geração de Código AST decorada AST gerada
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 Estratégia de alocação 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 Assembler Disassembler Criação dos templates 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 program exemplo; function fatorialIterativo(n:Integer):Integer; var retorno:Integer; begin retorno := 1; while(n <> 0) do retorno := retorno * n; n := n - 1; end; fatorialIterativo := retorno; printInt(fatorialIterativo(5)); end.
Exemplo - ilasm.exe Compilar o código plplus Prompt do framework .net 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.