Sei sulla pagina 1di 73

Compiladores

Aula 1
Celso Olivete Jnior
olivete@fct.unesp.br

Tpicos da disciplina
Introduo compilao
Analisador lxico
Analisador sinttico descendente
Analisador sinttico ascendente
Anlise semntica
Gerao de cdigo intermedirio
Ambientes de execuo
Gerao de cdigo objeto

Compiladores

Metodologia
Aulas expositivas terico-prticas
Exerccios prticos
Projetos em duplas (anlise individual)

Compiladores

Avaliao

Avaliao 1: 18/11

Avaliao 2: 27/01

RR: 03/02

As notas de todas as atividades sero entre 0 (zero) e 10,0 (dez) e atribudas


individualmente, mesmo em atividades em grupo;

O desempenho do aluno no primeiro bimestre ser avaliado por uma prova (NP1) e notas de
trabalhos/projetos(NTP1), sendo que o projeto tem o peso de 70% e os trabalhos de 30%;

O desempenho do aluno no segundo bimestre ser avaliado por uma prova (NP2) e notas de
trabalhos/projetos(NTP2), sendo que o projeto tem o peso de 70% e os trabalhos de 30%;

A mdia semestral (MS) ser calculada da seguinte maneira:

Mdia das notas das provas bimestrais

MProvas = (NP1 + NP2)/2

Mdia das notas dos trabalhos/projetos bimestrais

MTrabProj = (NTP1 + NNP2)/2

MS = (7* MProvas + 3* MTrabProj)/10 SE E SOMENTE SE (MProvas >=5 E MTrabProj >=5)

Caso contrrio (MProvas <5 OU MTrabProj <5)

MB = Menor Nota (MProvas ou MTrabProj)

Compiladores

Projeto
Desenvolvido em duplas
Avaliao do projeto ser na forma de
apresentao
Notas individuais

Compiladores

Pr-requisitos
Disciplinas:
Programao
Teoria da computao
Linguagens formais e autmatos
Teoria dos grafos

Compiladores

Bibliografia bsica
AHO, A V., ULLMAN, J.D. e SETHI, R.,
Compiladores:
Princpios,
Tcnicas
e
Ferramentas, LTC, 2008.
PRINCE, A. M. A. e TOSCANI, S. S.,
Implementao
de
Linguagens
de
Programao: Compiladores, Editora SagraLuzzatto, 2001.
CRESPO, R. G. Processadores de Linguagens:
Da Concepo Implementao, 2 ed.,IST
Press, 2001.
MENEZES, P. F. B., Linguagens Formais e
Autmatos, Editora Sagra-Luzzatto, 2001.
Compiladores

Motivao
Compiladores: uma das principais ferramentas
do cientista/engenheiro da computao
Tcnicas de compilao se aplicam a projetos
gerais de programas
Editores de texto, sistemas de recuperao de informao,
reconhecimento de padres, ...

Compiladores

Motivao
Utilizao

de

conceitos

mtodos

de

diversas

disciplinas
Algoritmos
Linguagens de programao
Grafos
Engenharia de software

Linguagens de
Baixo Nvel

Arquitetura de computadores

Compiladores

Objetivo
Fazer um Compilador!!!

mensagens

ERROS!!!

begin
if x = 5 then
...

entrada

Prog. Fonte

sada

Compilador
Compiladores

1100111
0011100011

Prog. objeto
10

Objetivo
Executando o programa objeto

Fornece
entradas de
dados

1100111
0011100011

Produzir
sadas

Prog. objeto

Compiladores

11

Objetivo
Compilador!!!
Compilador
!!!
Cdigo
fonte

Anlise Lxica

abstrao

Anlise Sinttica

rvore
sinttica
abstrata

Anlise Semntica

implementao

tokens e
lexemas

AST
decorada

Gerao de Cdigo
Compiladores

Cdigo
Mquina

12

Na aula de hoje...
Compilador: o que , para que serve e
estrutura geral

Compiladores

13

Roteiro
Introduo
Compilao
Fases da compilao
Estrutura geral de um compilador
Definio de linguagens de programao
Classificao de compiladores

Compiladores

14

Introduo
Definio: l um programa em uma linguagem fonte e o traduz
em um programa em uma linguagem-alvo (objeto)
Linguagem-fonte: Pascal, C
Linguagem-alvo:

linguagem

de

montagem

(assembly),

cdigo de mquina

15

Introduo
Definio: l um programa em uma linguagem fonte e o traduz
em um programa em uma linguagem-alvo (objeto)

ERROS!!!

Linguagem-fonte: Pascal, C

cdigo de mquina

linguagem
mensagens

Linguagem-alvo:

de

montagem

begin
if x = 5 then
...

input

Cdigo Fonte

output

Compilador

(assembly),

1100111
0011100011

Programa
16

Introduo
Tradutor de uma linguagem mais abstrata
(origem) para uma mais concreta (destino).
Exemplo Java:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello"); }}

javac

javap

public class HelloWorld extends java.lang.Object{


public HelloWorld();
Code:
0:
aload_0
1:
invokespecial
#1; //Method java/lang/Object."<init>":()V
4:
return
public static void main(java.lang.String[]);
Code:
Cdigo
0:
getstatic
#2; //Field
java/lang/System.out:Ljava/io/PrintStream;
interpretado
3:
ldc
#3; //String Hello
pela JVM
5:
invokevirtual
#4; //Method
java/io/PrintStream.println:(Ljava/lang/String;)V
8:
return
Compiladores
}

17

Introduo
Tradutor de uma linguagem mais abstrata
(origem) para uma mais concreta (destino).
Exemplo: assembly
...

Gerador de
cdigo

t2 = id3 * 60.0
id1 = id2 + t2
LDF
MULF
LDF
ADDF
STF
Compiladores

R2,
R2,
R1,
R1,
id1,

id3
R2, #60.0
id2
R1, R2
R1
18

Introduo
Outro exemplo de bytecodes

Compiladores

19

Compiladores
Funcionalidades

... o programador poderia escrever direto


na linguagem destino (cdigo objeto)?

Fcil?
Rpido?
Compiladores

20

Compiladores
Funcionalidades
Facilitar programao (abstrao)
Checar

certos

tipos

de

erros

vulnerabilidades
Gerar cdigo portvel
Otimizar cdigo
Velocidade, tamanho, etc.

Compiladores

21

Compiladores
Exemplos de Erros

Compiladores

22

Compiladores
Histria
Antigamente a programao era feita em
cdigo de mquina
Programao em linguagem mquina
Rapidez execuo versus desenvolvimento complicado
Necessidade de um montador
No h mgica!

Finalmente, linguagens de mais alto nvel

Compiladores

23

Compiladores
Histria
Primeiros compiladores comearam a surgir no
incio dos anos 50
Trabalhos

iniciais:

traduo

de

frmulas

aritmticas em cdigo de mquina


Compiladores eram considerados programas muito
difceis de construir
Primeiro compilador

Fortran (permitia a declarao

de identificadores com at 6 caracteres)


FORmula TRANslation System
Compiladores

24

Compiladores
Histria
FORmula TRANslation System:

Compiladores

carto perfurado

25

Compiladores
Histria
Desde

ento,

tcnicas

sistemticas

para

construo de compiladores foram identificadas


Reconhecimento de cadeias, gramticas, gerao de
linguagem

Desenvolvimento

de

boas

linguagens

ambientes de programao
C, C++, linguagens visuais

Compiladores

26

Compiladores
Histria
Desenvolvimento de programas para produo automtica
de compiladores

lex, flex
Lex

Gerador de analisadores lxicos (UNIX)

Flex

Gerador de analisadores lxicos (LINUX / Windows)

Entrada: Arquivo de descrio do analisador lxico


Sada: Programa na linguagem C que realiza a anlise lxica

Outros geradores de analisadores:


TPly TP Lex / Yacc
Gera um programa em PASCAL
JavaCC
Para linguagem Java
Flex++ ou Flexx => Para linguagem C++ (orientado a objetos)

Compiladores

27

Compiladores
Histria
Atualmente, um aluno de graduao pode
construir um compilador rapidamente
Ainda assim, programa bastante complexo
Estimativa de cdigo acima de 10.000 linhas

Compiladores

28

Compiladores
Histria
Com isso, tornou-se uma rea de grande
importncia
1957: Fortran primeiros compiladores para
processamento de expresses aritmticas e
frmulas
1960: Algol primeira definio formal de
linguagem, com gramtica na forma normal de
Backus (BNF), estruturas de blocos, recurso, etc.
Compiladores

29

Compiladores
Histria
Com isso, tornou-se uma rea de grande
importncia
1970: Pascal tipos definidos pelos usurios
1985: C++ orientao a objetos, excees
1995: Java compilao instantnea (traduz
bytecodes para cdigo de mquina e executa),
melhorando o tempo e execuo do programa.
Portabilidade

Compiladores

30

Organizao de um compilador
Compilador, interpretador e mquina virtual
Entrada de dados
Prog. fonte

Compilador

Prog. Objeto

Sada

Ex: Pascal,
C,...

Entrada

Interpretador

Ex: PHP,
javascript,..

Sada

Prog. fonte

Prog. fonte

Cd. Intermedirio
bytecodes

Compilador

Entrada de dados

Mquina
virtual

Ex: Java
Sada
31

Compilador, interpretador e mquina virtual


Vantagens versus desvantagens
Entrada de dados
Prog. fonte

Compilador

Prog. Objeto

Sada

Ex: Pascal,
C,...

Entrada

Interpretador

Ex: PHP,
javascript,..

Sada

Prog. fonte

Prog. fonte

Cd. Intermedirio
bytecodes

Compilador

Entrada de dados

Mquina
virtual

Ex: Java
Sada
32

Organizao de um compilador
Compilador, interpretador e mquina virtual
Entrada de dados
Prog. fonte

Compilador

Prog. Objeto

Entrada

Interpretador

Sada

Sada

Foco em
Ex: PHP,
compiladores

javascript,..
.

Prog. fonte

Prog. fonte

Cd. Intermedirio
bytecodes

Compilador

Ex: Pascal,
C,...

Entrada de dados

Mquina
virtual

Ex: Java
Sada
33

Processo de compilao
subdiviso de um programa fonte
Programa fonte

pr-processador

Programa fonte
modificado

compilador

assembler

Cdigo objeto (relocvel)

Editor de ligao
Carregador

Bibliotecas /
cdigo objeto

Cdigo objeto (executvel)


Programa em assembler
Compiladores

34

Processo de compilao

pr-processador

origem

assembler

Como
funciona este
processo?
linker-loader

compilador
destino
Compiladores

35

Processo de compilao
Compilao: duas fases

anlise e sntese

1. anlise (front-end):
Cria representaes intermedirias do programa (subdivises)
Verifica presena de certos tipos de erro

mensagens

ERROS!!!

anlise
begin
if x = 5 then
...

Cdigo Fonte

input

Compilador
Compiladores

36

Processo de compilao
Compilao: duas fases

anlise e sntese

2. sntese (back-end):
Constri o programa
intermedirias

destino

partir

de

representaes

mensagens

ERROS!!!

anlise
begin
if x = 5 then
...

input

sntese

output

1100111
0011100011

Prog. objeto
Cdigo Fonte

Compilador
Compiladores

37

Processo de compilao

Compiladores

38

Processo de compilao
Compilao: duas fases
1. anlise (front-end):
Cria representaes intermedirias do programa (subdivises)
Verifica presena de certos tipos de erro

2. sntese (back-end):
Constri o programa
intermedirias

destino

Compiladores

partir

de

representaes

39

Processo de compilao
1) Anlise
1.1) Anlise lxica
Organiza caracteres de entrada em grupos, chamados tokens
Erros:

tamanho

mximo

da

varivel

excedido,

caracteres

invlidos..

1.2) Anlise sinttica


Organiza tokens em uma estrutura hierrquica
Erros: falta de (, ), =, identificador invlido...

Compiladores

40

Processo de compilao
Anlise
1.3) Anlise semntica
Checa se o programa respeita regras bsicas de consistncia
Erro: tipos inconsistentes

atribuir uma string em uma varivel

inteira

Compiladores

41

Processo de compilao
1) anlise
1.1) Anlise lxica
L os caracteres de entrada (scanner) e os agrupa em
sequncias chamadas lexemas (tokens)
Os tokens so consumidos na fase seguinte (anlise sinttica)

Programa
fonte

Analisador lxico
(scanner)

token
GetToken()

Analisador sinttico
(parser)

para anlise
semntica

Tabela de Smbolos
(identificadores e
constantes)
Compiladores

42

Processo de compilao
1) anlise
1.1) Anlise lxica
A tabela de smbolos utilizada para diferenciar
palavras e smbolos reservados da linguagem
(while,

for,

:=,

>,

<)

de

identificadores

definidos pelo usurio


Tabela de smbolos
Lexema (lido)

Token (tipo)

<PONTO_VIRG>

aux

<IDENTIFICADOR>

while

<PALAVRA RESERVADA>
Compiladores

43

Processo de compilao

Compiladores

44

Processo de compilao
1) anlise
1.1) Anlise lxica
A tabela de smbolos tambm utilizada para
armazenar o tipo e o valor das variveis e o seu
escopo
Tabela de smbolos
Lexema (lido)

Token (tipo)

valor

<PONTO_VIRG> ou ;

aux

<IDENTIFICADOR>

10

while

<PALAVRA RESERVADA>

Compiladores

45

Processo de compilao
1) anlise
1.1) Anlise lxica. Exemplo:
expr = a + b * 60

Analisador
Lxico

<identificador, 1>, <=>,


<identificador, 2>, <+>,
<identificador, 3>, <*>,
<numero, 60>
nome

Tabela de
Smbolos

tipo

expr

Compiladores

46

Processo de compilao
1) anlise
1.1) Anlise lxica Reconhecimento e classificao
dos tokens

Pode ser feito com o uso de expresses


regulares e autmatos finitos

Compiladores

47

Processo de compilao
1) anlise
1.1) Anlise lxica Reconhecimento e classificao
dos tokens
Exemplos de expresses regulares
letra [A-Z] | [a-z]
dgito [0-9]
dgitos dgito dgito*
identificador letra[letra | dgito]*

Compiladores

48

Processo de compilao
1) anlise
1.1) Anlise lxica Reconhecimento e classificao
dos tokens
Exemplos de autmatos finitos
Exemplo para > e >=
Estado inicial

>

=
outro

7
8

Exemplo para identificadores

letra ou dgito
Estado inicial

letra

10

Compiladores

outro

49

Processo de compilao
1) anlise
1.2) Anlise sinttica
Utiliza os tokens produzidos pela anlise lxica e
verifica a formao do programa com o uso de
GLC (gramticas livres de contexto)

partir

dos

tokens

cria

uma

representao

intermediria tipo rvore (rvore sinttica)

mostra a

estrutura gramatical da sequncia de tokens


Compiladores

50

Processo de compilao
1) anlise

rvore sinttica:
Percorrendo a rvore e
consultando a GLC
possvel verificar se a
expresso pertence
linguagem

1.2) Anlise sinttica


expr = a + b * 60

<identificador, 1>, <=>,


<identificador, 2>, <+>,
<identificador, 3>, <*>,
<numero, 60>

N interior representa
uma operao

=
<id,1>

Analisador
Sinttico

<id,2>

N filho representa um
argumento

+
*
<id,3>

Compiladores

60
51

Processo de compilao
1) anlise
1.3) Anlise semntica
Utiliza a rvore sinttica e a tabela de smbolos para:
Criar a ccnsistncia semntica (significado) do prog. fonte
em relao linguagem.
Exemplo: verificao de tipos
A expresso

x = x + 3.0;
est sintaticamente correta, mas pode estar
semanticamente errada, dependendo do tipo de x.
Compiladores

52

Processo de compilao
Compilao: duas fases
1. anlise (front-end):
Cria representaes intermedirias do programa
Verifica presena de certos tipos de erro

2. sntese (back-end):
Constri o programa
intermedirias

destino

Compiladores

partir

de

representaes

53

Processo de compilao
2) sntese
Gerao de cdigo:
Recebe como entrada uma representao intermediria
(fases da anlise lxica e sinttica) e transforma em
uma linguagem objeto
Alocao de memria, uso de registradores

Compiladores

54

Processo de compilao
2) sntese
Gerao de cdigo:
Cdigo intermedirio
Exemplos de representaes:
3 endereos:

cada instruo usa no mais que trs

operandos
Pilha: operandos so acessveis apenas a partir da pilha

Compiladores

55

Processo de compilao
2) sntese
Gerao de cdigo:
Cdigo intermedirio
Exemplo: 3 endereos

id1 = id2 + id3 * inttofloat(60)

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

56

Processo de compilao
2) sntese
Otimizador de cdigo
Realiza transformaes no cdigo com
objetivo

de

melhorar

algum

aspecto

relevante
tempo de execuo, consumo de memria,
tamanho do cdigo executvel, etc.

Compiladores

57

Processo de compilao
2) sntese
Otimizador de cdigo
t1 = inttofloat(60)
t2 = id3 * t1
t3 = id2 + t2
id1 = t3

t2 = id3 * 60.0
id1 = id2 + t2
Compiladores

58

Processo de compilao
2) sntese
Gerao de cdigo
Consiste

em

traduzir

cdigo

intermedirio

para

linguagem-destino (p.ex, assembly)


...

t2 = id3 * 60.0
id1 = id2 + t2
destino

Gerador de
cdigo

LDF
MULF
LDF
ADDF
STF
Compiladores

R2,
R2,
R1,
R1,
id1,

id3
R2, #60.0
id2
R1, R2
R1
59

Projeto de um analisador lxico


EXERCCIO Projetar um analisador lxico para
uma calculadora simples com nmeros naturais e
reais e operaes bsicas (soma, subtrao,
multiplicao e diviso)
Obs: 1. dever ser feito em dupla a mesma que ir
desenvolver o projeto da disciplina
2. data de entrega: 06/10

Compiladores

60

Projeto de um analisador lxico


Questes a considerar:
1. Que smbolo usar como separador de casa
decimais?
2. A calculadora usa representao monetria?
3. A calculadora aceita espaos entre os
operandos e operadores?
4. O projetista quem decide sobre as
caractersticas desejveis do compilador ou
interpretador. Para a maioria das linguagens
de
programao
existem
algumas
convenes que devem ser respeitadas
Compiladores

61

Projeto de um analisador lxico


Exemplo - seja a cadeia 3.2 + (2 * 12.01), o
analisador lxico teria como sada:
3.2
=> nmero real
+
=> operador de soma
(
=> abre parnteses
2
=> nmero natural
*
=> operador de multiplicao
12.01 => nmero real
)
=> fecha parnteses
Compiladores

62

Projeto de um analisador lxico


1. Definio do Alfabeto
= {0,1,2,3,4,5,6,7,8,9,.,(,),+,-,*,/,\b}
OBS.: projetista deve considerar TODOS os
smbolos que so necessrios para formar
os padres

Compiladores

63

Projeto de um analisador lxico


2. Listagem dos tokens

OPSOMA: operador de soma


OPSUB: operador de subtrao
OPMUL: operador de multiplicao
OPDIV: operador de diviso
AP: abre parnteses
FP: fecha parnteses
NUM: nmero natural/real
OBS.: projetista deve considerar tokens especiais e
cuidar para que cada token seja uma unidade
significativa para o problema
Compiladores

64

Projeto de um analisador lxico


3. Especificao dos tokens com definies regulares

OPSOMA +
OPSUB OPMUL *
OPDIV /
AP (
FP )
NUM [0-9]+.?[0-9]*
OBS.: cuidar para que as definies regulares reconheam
padres claros, bem formados e definidos

Compiladores

65

Projeto de um analisador lxico


4. Montar os autmatos para reconhecer cada token

OBS.: os autmatos reconhecem tokens individuais,


mas o conjunto dos autmatos em um nico
autmato no-determinstico que determina o
analisador lxico de um compilador, por isto, deve ser
utilizada uma numerao crescente para os estados.

Compiladores

66

Projeto de um analisador lxico


5. Implementar o analisador lxico
Existem duas formas bsicas para implementar os
autmatos: usando a tabela de transio ou
diretamente em cdigo

Compiladores

67

Estilo de implementao
Cada token listado codificado em um nmero
natural
Deve haver uma varivel para controlar o estado
corrente do autmato e outro para indicar o estado
de partida do autmato em uso
Uma funo falhar usada para desviar o estado
corrente para um outro autmato no caso de um
estado no reconhecer uma letra

Compiladores

68

Estilo de implementao
Cada estado analisado individualmente em uma
estrutura do tipo switchcase

- letra - digito

letra
0

2
Reconhece ID

letra
dgito
Compiladores

69

Estilo de implementao
Cada estado analisado individualmente em uma estrutura do
tipo switchcase
int lexico()
{
while (1)
{
switch (estado)
{
case 0: c= proximo_caracter();
if (isalpha(c))
{
estado= 1;
adiante++;
}
else
{
falhar();
}
break;

}
}

letra
0

Compiladores

70

Estilo de implementao
Cada estado analisado individualmente em uma
estrutura do tipo switchcase
- letra - digito
1

case 1: c= proximo_caracter();
if (isalpha(c) || isdigit(c))
{
letra
estado= 1;
adiante++;
dgito
}
else
{
if ((c == \n) || (c == \t) || (c == \b)) estado= 2;
else falhar();
}
break;

}
}

Compiladores

71

Estilo de implementao
Cada estado analisado individualmente em uma
estrutura do tipo switchcase

case 2: estado= 0;
partida= 0;
return ID;
break;

Reconhece ID

} }

www.inf.ufes.br/~tavares/labcomp2000/analex.html
Compiladores

72

Na prxima aula...
Reviso de linguagens formais.

Compiladores

73