Você está na página 1de 22

Profa. Valria D.

Feltrim
DIN UEM

Parte deste material foi gentilmente cedido pelo Prof. T. A. S. Pardo (ICMC-USP/So Carlos)
Programa que 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, bytecode...

Durante o processo de traduo, relatam-se erros


encontrados
programa programa
compilador
fonte alvo

mensagens de erro
Primeiros compiladores comearam a surgir no
incio dos anos 50
Diversos experimentos e implementaes realizados
independentemente
Trabalhos iniciais: traduo de frmulas aritmticas em
cdigo de mquina
Compiladores eram considerados programas muito difceis
de construir
Primeiro compilador Fortran levou 18 homens-ano para ser
construdo
Desde ento, tcnicas sistemticas para construo de
compiladores foram identificadas
Reconhecimento de cadeias, gramticas, gerao de linguagem

Desenvolvimento de boas linguagens e ambientes de programao


C, C++, bibliotecas, linguagens visuais

Desenvolvimento de programas para produo automtica de


compiladores
lex, yacc

Atualmente, um aluno de graduao pode construir um compilador


rapidamente
Duas etapas
Anlise: interpreta o programa-fonte e cria uma
representao intermediria do mesmo
Sntese: a partir da representao intermediria, produz o
programa-alvo

ANLISE Representao SNTESE programa


programa interface de vanguarda interface de retaguarda
fonte intermediria alvo
front-end back-end

mensagens de erro
programa-fonte

analisador lxico

Tabela de smbolos analisador sinttico Manipulao


de erros
analisador semntico

Tabela de palavras e gerador de cdigo intermedirio


smbolos reservados

otimizador de cdigo

gerador de cdigo

programa-alvo

dados de sada
entrada
programa-fonte

analisador lxico

Tabela de smbolos analisador sinttico


Manipulao
de erros
analisador semntico

Tabela de palavras e gerador de cdigo intermedirio


smbolos reservados

otimizador de cdigo

gerador de cdigo

programa-alvo

dados de sada
entrada
Lxica: palavras (tokens) do programa
i, while, =, [, (, <, int
Erro: j@

Sinttica: combinao de tokens que formam o programa


comando_while while ( expresso ) comandos
Erro: while ( expresso comandos

Semntica e contextual: adequao do uso


Tipos semelhantes em comandos (atribuio, por exemplo), uso de
identificadores declarados
Erros: i=1, k=i

Gerao de cdigo: especificidades da mquina-alvo e sua linguagem


Alocao de memria, uso de registradores
Erro: a[1000000000]
Como diferenciar palavras e smbolos reservados
(while, int, :=) de identificadores definidos pelo
usurio?
Tabela de palavras e smbolos reservados

int
while
:=
...
Como saber durante a compilao de um programa:
tipo e valor dos identificadores, escopo das variveis,
nmero e tipo dos parmetros de um procedimento, etc.?
Tabela de smbolos

Identificador Classe Tipo Valor ...


i var integer 1 ...
fat proc - - ...
...
!

Reconhecimento e classificao dos tokens


Expresses regulares, autmatos

x:=x+y*2

<x,id1> <:=,:=> <x,id1> <+,op> <y,id2> <*,op> <2,num>


"

Verificao da formao do programa


Com base em uma gramtica livre de contexto
Representao explcita ou no da rvore de derivao

<x,id1> <:=,:=> <x,id1> <+,op> <y,id2> <*,op> <2,num>

comando_atribuio id1 := id1 op id2 op num


"

Verificao da formao do programa


Com base em uma gramtica livre de contexto
Representao explcita ou no da rvore de derivao

<x,id1> <:=,:=> <x,id1> <+,op> <y,id2> <*,op> <2,num>

:=

id1 +

id1 *

id2 num
#

Verificao do uso adequado

id1 := id1 op id2 op num

(id1)int := (id1 op id2 op num)int


busca_tabela_smbolos(id1)=TRUE
busca_tabela_smbolos(id2)=TRUE
$ "

Gerao de cdigo intermedirio/preliminar

id1 := id1 op id2 op num

Variveis
temporrias geradas
pelo compilador
temp1 := id2 * 2
temp2 := id1 + temp1 Cdigo de trs
endereos
id1 := temp2
% &

Otimizao do cdigo intermedirio

temp1 := id2 * 2
temp2 := id1 + temp1
id1 := temp2
temp2 usada apenas
uma vez atribuio
de valor a id1

temp1 := id2 * 2
id1 := id1 + temp1
$

Gerao do cdigo para a mquina-alvo

temp1 := id2 * 2
id1 := id1 + temp1

MOV id2 R1
MULT 2 R1
MOV id1 R2
ADD R1 R2
MOV R2 id1
Tokens e seus lexemas

rvore sinttica
(implcita ou explcita)

Tabela de
smbolos nica

Na prtica, fases podem ser agrupadas e as


representaes intermedirias entre elas no
precisam ser construdas explicitamente
'
Passagem: uma verificao ou transformao de uma
representao de entrada em uma representao de
sada

Compiladores podem ter vrias passagens


Esquema anterior de compilao
cdigo-fonte cdigo intermedirio cdigo-alvo
Maior tempo de leitura e escrita

Compilador de uma nica passagem


cdigo-fonte cdigo-alvo
Todo processo de compilao em memria: dados de
fases diferentes podem ser necessrios para a compilao
'
Interpretadores: executam instruo por instruo do
cdigo-fonte
Pr-processadores: agrupam mdulos separados de cdigo-
fonte
Processadores de macros (por exemplo, defines em C)
Montadores (assemblers): traduzem linguagem de
montagem em linguagem de mquina
Carregadores: alocao de instrues de programao e
dados na memria
Editores de ligao: criao de um nico programa a partir
de diversos programas compilados
(
programa-fonte

Pr-processador

programa-fonte modificado

Compilador

programa-objeto em assembly

Montador

cdigo de mquina relocvel

arquivos de biblioteca
Editor de Ligao/Carregador arquivos-objeto relocveis

cdigo de mquina alvo


)
Interpretadores
Menores que os compiladores
Mais adaptveis a ambientes computacionais diversos
Tempo de execuo maior
Javascript, Perl

Compiladores
Compila-se uma nica vez, executando-se quantas vezes se
queira
Tempo de execuo menor
C, Pascal

Compiladores hbridos
Compila-se para um cdigo intermedirio/virtual, que, por sua
vez, interpretado por uma mquina virtual
Java