Geração de CódigoGeração de Código
Equipe de Monitores
Teoria e Implementação de Linguagens Computacionais – IF688
RoteiroRoteiro
IntroduçãoVisão geralAlgoritmo de Geração de CódigoFerramentas e exemplos
◦Java Virtual Machine - JVM◦.NET Virtual Machine - CLR
IntroduçãoIntrodução
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çãoIntroduçã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
Visão GeralVisão Geral
Código objeto
Análise sintática
Código fonte
AST
Análise semântica
Geração decódigo
AST decorada
Análiseléxica
Tokens
Algoritmos de geraçãoAlgoritmos de geração
Utilizam-se templates para se traduzir as diversas frases de código-fonte
execute [ v := e ]◦evaluate [e]◦assign v
Estrutura Inerentemente recursivaTem como entrada uma estrutura de
objetos◦Visitor◦AST decorada
Máquinas VirtuaisMáquinas Virtuais
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 VirtuaisMá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
Java Virtual MachineFerramentas e utilitários
AssemblersAssemblers
Jasmin [http://jasmin.sourceforge.net/]
◦Java Assembler Interface◦Biblioteca que converte texto para bytecodes
Java Assembler PlaygroundJava™ Bytecode AssemblerJava Virtual Machine Assembler
Jasmin - InstruçõesJasmin - Instruções
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
Instruções da JVM dependem do tipo. integer, float, double etc.
if_icmpeq <label> if_icmpge <label> if_icmpgt <label>
Jasmin – If Then ElseJasmin – If Then Else
if(expr){ comm1;} else { comm2;}
exprCodeiconst_1if_icmpeq elsecomm1Codegoto endifelse: comm2CodeendIf:
Jasmin - WhileJasmin - While
while(expr) {comm
}
startWhile: exprCode iconst_1 if_icmpeq endWhile commCode goto startWhileendWhile:
Jasmin - MétodosJasmin - Métodos
.method doubleLocals(DD)D.limit stack 4.limit locals 4dload_1dload_3dadd dreturn.end method
Jasmin - Gerando executávelJasmin - Gerando executável
java –jar jasmin.jar myfile.j
O local de saída depende dos pacotes utilizados.◦Pode ser indicado local alternativo
Máquina Virtual .NETFerramentas
AssemblerAssembler
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
ILAsm - UsoILAsm - Uso
ilasm [Options] <sourcefile> [Options]◦Utiliza recursos do Próprio Framework◦Seleção de arquitetura, dependencias,
informações de debug, entre outras opções
◦Ilasm /?
Características do .NETCaracterísticas do .NET
Seu assembler não requer “linguagem intermediária”
Assembler compõe o frameworkO código é independente do tipo de dado
◦Tipos básicos: int, double, floatBoa documentação
Especificação em:◦ http://www.cin.ufpe.br/~jfp/MonitoriaCompiladores/
Geração de CódigoGeração de Código
José Francisco Pereira {[email protected]}Jobson Ronan {[email protected]}
Teoria e Implementação de Linguagens Computacionais – IF688
Top Related