Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
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%;
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
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
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!
Compiladores
23
Compiladores
Histria
Primeiros compiladores comearam a surgir no
incio dos anos 50
Trabalhos
iniciais:
traduo
de
frmulas
24
Compiladores
Histria
FORmula TRANslation System:
Compiladores
carto perfurado
25
Compiladores
Histria
Desde
ento,
tcnicas
sistemticas
para
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
Flex
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
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
Editor de ligao
Carregador
Bibliotecas /
cdigo objeto
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..
Compiladores
40
Processo de compilao
Anlise
1.3) Anlise semntica
Checa se o programa respeita regras bsicas de consistncia
Erro: tipos inconsistentes
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
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
Tabela de
Smbolos
tipo
expr
Compiladores
46
Processo de compilao
1) anlise
1.1) Anlise lxica Reconhecimento e classificao
dos tokens
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
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
mostra a
50
Processo de compilao
1) anlise
rvore sinttica:
Percorrendo a rvore e
consultando a GLC
possvel verificar se a
expresso pertence
linguagem
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:
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
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
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
Compiladores
60
61
62
Compiladores
63
64
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
Compiladores
66
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