Geração de Código
Teoria e Implementação de Linguagens
Computacionais – IF688
José Francisco Pereira {[email protected]}
Jobson Ronan {[email protected]}
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
◦ Conseguirmos 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 plano 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

exemplo
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 de
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]}
Download

Geração de Código