Você está na página 1de 25

COMPILADO

RES
ROBERTO TENORIO FIGUEIREDO
www.osfedera.com
tenorio.petrolina@bol.com.br

INTRODU
O
ROBERTO TENORIO FIGUEIREDO
www.osfedera.com
tenorio.petrolina@bol.com.br

Conceito

Tradutor de uma linguagem mais


abstrata (origem) para uma mais
concreta (destino).

Conceito
A linguagens deve ser:
Precisa
Ambiguidade indesejvel;

Expressiva
Pode caracterizar toda funo computvel
(Turing completa);

Alto-nvel
Prov abstraes para facilitar programao;

Conceito
Compiladores x Interpretadores
Um compilador transforma um programa de alto nvel escrito em
uma linguagem fonte para um programa executvel em uma
linguagem destino reconhecida por um Sistema Operacional;
O programa resultante deve ser, de alguma maneira, melhor que
o original.
Um interpretador executa um programa executvel, produzindo o
resultado do programa.
A maior parte das tcnicas que veremos nessa disciplina servem
para ambos.

Conceito
...afinal, o programador
poderia escrever direto na
linguagem destino, mais
concreta?

Conceito
Por que usar um compilador:
Facilitar programao (abstrao)
Checar certos tipos de erros e
vulnerabilidades
Gerar cdigo portvel
Otimizar cdigo
velocidade, tamanho, energia, etc.

Histrico
Inicialmente os computadores eram programados
diretamente em linguagem de mquina
No se dava muita importncia ao software, ou produtividade
dos programadores!

Em 1953 John Backus cria na IBM a primeira linguagem de


alto nvel, Speedcoding: Interpretada e lenta;
Em 1957 a IBM lana a primeira verso do compilador
FORTRAN, o primeiro compilador moderno:
Gerava cdigo com desempenho similar aos programas escritos
diretamente em linguagem de mquina;
Projeto gerenciado pelo mesmo John Backus, comeou em 1954
Em 1958 metade dos programas existentes para os mainframes
IBM j eram escritos em FORTRAN

Histrico
A estrutura geral de um compilador moderno
ainda se parece com a do primeiro compilador
FORTRAN, embora o interior de todas as partes
j tenha mudado desde ento:
Uma enorme quantidade de pesquisa e
desenvolvimento j foi feita desde ento;
Muitas das tcnicas que vamos ver nesse curso j
so bem antigas (30-40 anos), mas a rea ainda vai
mudando;
Os desafios e o que era importante h 40 anos so
diferentes dos desafios e do que importante hoje

Estrutura Bsica de um
Compilador

Seis grandes fases

Anlise lxica
Anlise sinttica
Anlise semntica
Gerador de Cdigo Intermedirio;
Otimizao
Gerao de Cdigo de mquina;

As duas primeiras cuidam da sintaxe do programa, as trs


intermedirias do seu significado, e a ltima da traduo
para a linguagem destino;
As trs primeiras fases formam o front-end do compilador, e
as demais seu back-end;

Estrutura Bsica de um
Compilador
- Cria representaes
intermedirias do
programa
- Verifica presena de
certos tipos de erro

- Constri o programa
destino a partir de
representaes
intermedirias

Estrutura Bsica de um
Compilador

Front-end

A funo do front-end extrair a estrutura do


programa, e verificar sua corretude;
O front-end produz uma representao do
programa como uma rvore sinttica abstrata;
Caso o programa tenha erros que possam ser
detectados em tempo de compilao, o frontend tambm produz mensagems apontando
onde esses erros esto;

Analisador Lxico
Primeiro passo do front-end: Organizar caracteres de
entrada em grupos, chamados tokens (reconhecer tokens)
Tokens so as palavras do programa;
O analisador lxico transforma o programa de uma
sequncia de caracteres sem nenhuma estrutura para
uma sequncia de tokens;

Ex:
if x == y then z = 1; else z = 2;
Tokens:
if, x, ==, y, then, z, =, 1, ;, else, z, =, 2, ;, EOF

Analisador Lxico
Normalmente o analisador lxico para uma
linguagem produzido mecanicamente a partir
uma especificao lxica definida por expresses
regulares;
Um gerador de analisador lxico um compilador
para a sua linguagem de especificao!
Existem facilitadores, mas vamos ver
escrever um analisador lxico mo

como

Analisador Sinttico
O analisador sinttico agrupa os tokens em termos
sintticos da linguagem (como sujeito, verbo, objeto,
orao, perodo...). uma organizao de tokens em
uma estrutura hierrquica.

Ex.: if x == y then z = 1; else z = 2;


x == y uma expresso relacional;
z = 1; e z = 2; so comandos de atribuio;
a frase em si um comando if-then-else composto
dessas trs partes;

Analisador Sinttico
Tambm comum se gerar mecanicamente um analisador
sinttico a partir de uma especificao da sintaxe da
linguagem, sua gramtica;
Novamente, um programa gerador
sintticos apenas outro compilador

de

O resultado da anlise sinttica


representando a estrutura do programa

analisadores

uma

rvore

Pode ser concreta, codificando toda a estrutura sinttica do


programa, ou abstrata, codificando apenas o essencial

Analisador Semntico
Agora que sabemos a estrutura do programa, podemos tentar entender
seu significado para detectar erros. O analisador semntico checa se o
programa respeita regras bsicas de consistncia.

A anlise semntica tambm procura eliminar ambiguidades


em relao aos termos do programa.
Ex: int x = 0; while(x < 10) { int x = 20; print(x); }
Quando a linguagem permite, a anlise semntica tambm
detecta
inconsistncias entre os tipos das variveis e seus usos
Ex: int x = 0; if(x < 5) x = foo;

Gerador de Cdigo
Intermedirio

Reescreve o programa desprezado:

Indentao;
Espaos e quebras de linha;
Comentrios;
Quaisquer outros elementos desnecessrios;

Gerador de Cdigo
Intermedirio
Representaes intermedirias de
cdigo facilitam anlise e transformao
Exemplos
3 endereos: cada instruo usa no mais
que trs operandos
SSA: cada uso de varivel est associado a
apenas uma definio
Pilha: operandos so acessveis apenas a
partir da pilha

Exemplo: 3 endereos
id1 = id2 + id3 * inttofloat(60)

t1 = inttofloat(60)
t2 = id3 * t1
t3 = id2 + t2
id1 = t3

Otimizador
Transformao automtica dos programas
de modo que eles:
-

Rodem mais rpido;


Usem menos memria;
Usem menos bateria;
Usem menos a rede;
Em geral, usem menos recursos e tenham
melhor desempenho;

Exemplo: Constant
propagation
t1 = inttofloat(60)
t2 = id3 * t1
t3 = id2 + t2
id1 = t3

t2 = id3 * 60.0
id1 = id2 + t2

Otimizador
Exemplo:
X := X + 1;
X := X + 2; X := X + 3;

Mistura de anlise e sntese.


raramente exato, mas baseado em heursticas;
Requer muita ateno quanto corretude.

Por exemplo:

x = y * 0 e x = 0 so equivalentes? Depende!

Gerador de Cdigo Final


Como mapear o programa na linguagem destino
Dificuldade varia bastante, a depender das caractersticas das linguagens
fonte e destino, e de quo distantes elas esto;
Ex.: if x == y then z = 1; else z = 2;
Em linguagem de mquina x86, assumindo que conseguimos mapear x no
registrador EAX, y no EBX e z no ECX, o cdigo acima pode virar:
cmp eax, ebx
jne l1
mov ecx, 1
jmp l2
l1: mov ecx, 2
l2:

DVIDAS