Você está na página 1de 14

Compiladores

Fabio Mascarenhas 2017.1

http://www.dcc.ufrj.br/~fabiom/comp
Introduo

Compiladores x Interpretadores

Offline x Online

Um compilador transforma um programa executvel de uma linguagem fonte


para um programa executvel em uma linguagem destino

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
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, lenta, 10x-20x cdigo de mquina)

Em 1957 a IBM lana a primeira verso do compilador FORTRAN, o primeiro


compilador moderno

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

FORTRAN gerava cdigo com desempenho similar aos programas escritos


diretamente em linguagem de mquina

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

Cinco grandes fases

Anlise lxica, anlise sinttica, anlise semntica, otimizao e gerao de


Cdigo

As duas primeiras cuidam da sintaxe do programa, as duas 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 duas outras seu


back-end
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 front-end tambm produz mensagens apontando onde esses
erros esto
Anlise Lxica

Primeiro passo do front-end: 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


Anlise Lxica

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!

Nesse curso vamos um gerador com uma linguagem de especificao parecida


com a do analisador lex

Mas vamos tambm ver como escrever um analisador lxico mo


Anlise Sinttica

O analisador sinttico agrupa os tokens em termos sintticos da linguagem

Como sujeito, verbo, objeto, orao, perodo...

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


Anlise Sinttica

Tambm comum se gerar mecanicamente um analisador sinttico a partir de


uma especificao da sintaxe da linguagem, sua gramtica

Novamente, um programa gerador de analisadores sintticos apenas outro


compilador

O resultado da anlise sinttica uma rvore representando a estrutura do


programa

Pode ser concreta, codificando toda a estrutura sinttica do programa, ou


abstrata, codificando apenas o essencial
Anlise Semntica

Agora que sabemos a estrutura do programa, podemos tentar entender seu


significado para detectar erros

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;


Otimizao

Transformao automtica dos programas de modo que eles usem menos


tempo/memria/bateria/rede

Em geral, usem menos recursos e tenham melhor desempenho

Mistura de anlise e sntese, e raramente exato, mas baseado em heursticas

Requer muita ateno quanto corretude; por ex., x = y * 0 e x = 0 so


equivalentes? Depende!
Gerao de Cdigo

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:
Uma linguagem de comandos simples

Tokens: numerais inteiros, identificadores, +, -, (, ), =, ;, print

Gramtica

PROG -> CMD ; PROG


PROG ->
CMD -> id = EXP
CMD -> print EXP
EXP -> EXP + AEXP
EXP -> EXP - AEXP
EXP -> AEXP
AEXP -> id
AEXP -> num
AEXP -> ( EXP )

Você também pode gostar