Geração de Código Teoria e Implementação de Linguagens Computacionais – IF688 Equipe de Monitores Introdução Visão geral Algoritmo de Geração de Código Ferramentas e exemplos ◦ Java Virtual Machine - JVM ◦ .NET Virtual Machine - CLR Roteiro 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 Dependente da arquitetura ◦ ◦ ◦ ◦ Registradores (tipo, quantidade etc) Conjunto de instruções Modo de endereçamento Sistema Operacional (nativos) Dificilmente aproveitado para mais de uma plataforma ◦ Máquina real ou virtual Introdução Código fonte Análise léxica Análise sintática Tokens Análise semântica AST Visão Geral Geração de código AST decorada Código objeto Utilizam-se templates para se traduzir as diversas frases de código-fonte execute [ v := e ] ◦ evaluate [e] ◦ assign v Estrutura Inerentemente recursiva Tem como entrada uma estrutura de objetos ◦ Visitor ◦ AST decorada Algoritmos de geração JVM ◦ Máquina vitual JAVA ◦ Baseada em pilha ◦ Interpreta os bytecodes presentes em um .class Arquivos .class ◦ Formato binário ◦ Para gerá-lo precisamos de um assembler Máquinas Virtuais CLR ◦ Common Languagem Runtime ◦ Máquina virtual .NET Framework ◦ Interpreta arquivos .exe .exe ◦ Interpreta apenas os arquivos gerados para a plataforma ◦ MONO foi baseado na mesmas definições Máquinas Virtuais Java Virtual Machine Ferramentas e utilitários Jasmin [http://jasmin.sourceforge.net/] ◦ Java Assembler Interface ◦ Biblioteca que converte texto para bytecodes Java Assembler Playground Java™ Bytecode Assembler Java Virtual Machine Assembler Assemblers Instruções da JVM dependem do tipo. integer, float, double etc. dload <var-num> - Double dstore <var-num> - Double fload <var-num> - Float fstore <var-num> - Float iload <var-num> - Int iinc <var-num> <amount> Incrementa o inteiro if_icmpeq <label> if_icmpge <label> if_icmpgt <label> Jasmin - Instruções if(expr){ comm1; } else { comm2; } exprCode iconst_1 if_icmpeq else comm1Code goto endif else: comm2Code endIf: Jasmin – If Then Else while(expr) { comm } Jasmin - While startWhile: exprCode iconst_1 if_icmpeq endWhile commCode goto startWhile endWhile: .method doubleLocals(DD)D .limit stack 4 .limit locals 4 dload_1 dload_3 dadd dreturn .end method Jasmin - Métodos java –jar jasmin.jar myfile.j O local de saída depende dos pacotes utilizados. ◦ Pode ser indicado local alternativo Jasmin - Gerando executável Máquina Virtual .NET Ferramentas ILAsm.exe ◦ ◦ ◦ ◦ ◦ ◦ Microsoft® .NET Framework Intermediate Language Assembler Componente do .NET Framework Tradução para código da plataforma Codifica o MSIL Não possui GUI Assembler ilasm [Options] <sourcefile> [Options] ◦ Utiliza recursos do Próprio Framework ◦ Seleção de arquitetura, dependencias, informações de debug, entre outras opções ◦ Ilasm /? ILAsm - Uso Seu assembler não requer “linguagem intermediária” Assembler compõe o framework O código é independente do tipo de dado ◦ Tipos básicos: int, double, float Boa documentação Especificação em: ◦ http://www.cin.ufpe.br/~jfp/MonitoriaCompiladores/ Características do .NET Geração de Código Teoria e Implementação de Linguagens Computacionais – IF688 José Francisco Pereira {[email protected]} Jobson Ronan {[email protected]}