Você está na página 1de 49

Compiladores IF688

Professor: Andr Santos Home page do curso: http://www.cin.ufpe.br/~if688

Motivao
Conhecimento das estruturas e algortmos usados na implementao de linguagens: noes importantes sobre uso de memria, eficincia, etc. Aplicabilidade freqente na soluo de problemas que exigem alguma forma de traduo entre linguagens ou notaes. Implementao de linguagens para um domnio especfico. Geradores e analisadores de cdigo.

Motivao
A disciplina de compiladores faz uso de um grande nmero de conceitos estudados em outras disciplinas do curso: linguagens de programao, algortmos, linguagens formais, arquitetura, engenharia de software.

Compilador
Programa que l um programa escrito em uma linguagem (fonte) e o traduz para uma outra linguagem (destino), reportando erros quando eles ocorrem.

Linguagens
Linguagem fonte: C, Pascal, Java, Fortran, etc. Linguagem destino: linguagem de mquina (assembler) de um processador, de uma mquina virtual (e.g. Java ou .NET), ou qualquer outra linguagem (e.g. C).

Processadores de Linguagens: Compilador

Programa fonte Compilador Programa destino

Execuo de um programa

entrada

Programa destino

sada

Processadores de Linguagens: Interpretador

Programa fonte

Interpretador
entrada

sada

Compilador Hbrido
Programa fonte

Tradutor

Programa intermedirio entrada

Mquina Virtual

sada

Sistema de processamento de uma linguagem


Programa fonte preprocessador Programa fonte modificado assembler

Cdigo objeto (relocvel)


Linker / Loader Bibliotecas / cdigo objeto

compilador
Programa em assembler

Cdigo objeto (executvel)

Programas auxiliares do processo de compilao


Preprocessadores: processam macros, incluem de arquivos, suportam compilao condicional e extenso de linguagens. Assemblers: servem como uma pequena abstrao da arquitetura da mquinadestino. So na realidade um tradutor /compilador simples, de dois passos, que gera cdigo relocvel.

Programas auxiliares do processo de compilao (cont.)


Carregadores (loaders) e linkeditores (linkers)
Ajustam o cdigo relocvel, resolvem referncias externas.

Compilao: Anlise e Sntese


Anlise: quebra o cdigo fonte em suas partes, e cria uma representao intermediria do programa. Verifica erros e constri tabela de smbolos.
Sntese: Constroi o programa-destino a partir da representao intermediria.

Fases de um compilador
stream de caracteres Analisador lxico stream de tokens Analisador sinttico rvore sinttica Analisador semntico rvore sinttica Ger. de cdigo intermedirio representao intermediria Otimizador de cdigo representao intermediria Gerador de cdigo Cdigo de mquina

Anlise: front-end do compilador (at gerao de cdigo intermedirio) Sntese: back-end do compilador

Anlise do programa fonte


Anlise lxica l a seqencia de caracteres e a organiza como tokens sequencias de caracteres com algum significado Anlise sinttica agrupa caracteres ou tokens em uma estrutura hierrquica com algum significado Anlise semntica verifica se os componentes de um programa se encaixam de forma a ter um significado adequado.

Programas baseados em anlise


Editores de programa dirigidos sintaxe (comuns nos IDEs, como no Eclipse e Visual Studio) Pretty-printers Interpretadores

Exemplo do processo de compilao

Anlise lxica ou Scanning


L os caracteres de entrada e agrupa-os em sequencias chamadas lexemas. Para cada lexema o analisador lxico produz como sada um token da forma
<nome do token, valor do atributo> que passado para a fase seguinte.

Exemplo
position = initial + rate * 60
<identificador, 1> <=> <identificador, 2> <+> <identificador, 3> <*> <number, 60>

Tabela de Smbolos
identificador
1 2 3 position initial rate

tipo

Anlise sinttica ou parsing


A partir dos tokens cria uma estrutura em rvore (rvore sinttica) que representa a estrutura gramatical do programa.

rvore Sinttica
position = initial + rate * 60
= <id,1> <id,2>

+
*

<id,3>

60

Anlise semntica
Verifica o programa em relao a possveis erros semnticos e guarda informaes adicionais

Exemplo: verificao de tipos


A expresso
x = x + 3.0 est sintaticamente correta, mas pode estar semanticamente certa ou errada, dependendo do tipo de x.

Anlise Semntica
= <id,1> <id,2> <id,3> + * inttofloat 60

Cdigo intermedirio
Idealmente deve ser fcil de produzir e tambm de traduzir para a linguagem-destino. Na prtica, se est gerando cdigo para uma mquina abstrata. Por exemplo, Three-address-code: usa trs operandos por instruo, cada um como se fosse um registrador.

Cdigo intermedirio - exemplo


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

Otimizao de cdigo
Realiza transformaes no cdigo visando melhorar sua performance em aspectos de tempo de execuo, uso de memria, tamanho do cdigo executvel etc.

Otimizao de cdigo - exemplo


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

t2 = id3 * 60.0 id1 = id2 + t2

Gerao de cdigo
Realiza a alocao de registradores (se necessria) e a traduo do cdigo intermedirio para a linguagem-destino.

Gerao de cdigo
LDF R2, id3 MULF R2, R2, #60.0 LDF R1, id2 ADDF R1, R1, R2 STF id1, R1

Tabela de Smbolos
Estrutura de dados usada para guardar identificadores e informaes sobre eles:
alocao de memria, tipo do identificador, escopo (onde vlido no programa) se for um procedimento ou funo: nmero e tipo dos argumentos, forma de passagem dos parmetros e tipo do resultado.

Tabela de Smbolos
identificador
1 2 3 position initial rate

tipo

Organizando fases em passos


Fases: viso lgica de um compilador Em uma implementao as fases podem ser agrupadas em um ou mais passos Passos: nmero de vezes em que se passa pelo mesmo cdigo. Por exemplo, em um assembler so necessrios pelo menos dois passos.

Separao entre front-end e back-end para criao de mltiplos compiladores


Pascal Fortran Front-end

C
Front-end Front-end

C#
Front-end

cdigo intermedirio

Back-end
x86

Separao entre front-end e back-end para criao de mltiplos compiladores


Pascal Front-end

cdigo intermedirio Back-end


Back-end ARM x86 .NET Back-end MIPS

Back-end

Separao entre front-end e back-end para criao de mltiplos compiladores


Pascal Fortran Front-end

C
Front-end Front-end

C#
Front-end

cdigo intermedirio Back-end


Back-end ARM x86 .NET Back-end MIPS

Back-end

Ferramentas auxiliares para a construo de compiladores


Scanner generators, baseados em expresses regulares. Exemplo: lex Parser generators, baseados em gramticas livres de contexto. Exemplo: yacc Engenhos de traduo dirigida por sintaxe, geram rotinas para navegar na parse tree e gerar cdigo intermedirio Geradores de geradores de cdigo (template matching) Toolkits de construo de compiladores

Contexto Histrico
Demanda por linguagens de mais alto nvel que linguagem de mquina e assembler. Nos anos 1950, compiladores eram programas notadamente difceis de se escrever. Avano terico e de tcnicas e ferramentas de implementao tornaram possvel implementar compiladores muito mais facilmente.

Classificaes: Geraes
Linguagens de mquina Linguagens de montagem (Assembly languages) Fortran, Cobol, Lisp, C, C++, C#, Java SQL, Postscript (Domain Specific Languages)

Classificaes: Paradigma
Imperativo como Conceito de estado e comandos que mudam o estado C, C++, C#, Java Declarativo o qu ML, Haskell, Prolog

Classificaes
Von Neumann: C, Fortran, Pascal Orientadas a Objetos: Simula 67, Smalltalk, C++, C#, Java, Ruby Scripting Languages: Awk, JavaScript, Perl, PHP, Python, Ruby, Tcl

Fundamentos de Linguagens de Programao


Esttico x Dinmico:
Esttico: em tempo de compilao Dinmico: em tempo de execuo

Fundamentos de Linguagens de Programao


Ambientes e Estados
ambiente estado

nomes

locais (variveis)

valores

Fundamentos de Linguagens de Programao


Escopo esttico e estrutura de Blocos
Controle de Acesso Explcito
public, private, protected

Fundamentos de Linguagens de Programao


Escopo Dinmico Exemplo: macros em C
#define a (x+1) int x = 2; void b() {int x = 1; printf(%d\n, a); } void c() {printf(%d\n, a); } void main() { b(); c(); }

Fundamentos de Linguagens de Programao


Mecanismos de passagem de parmetro
Por valor (call by value) Por referncia (call by reference) Por nome (call by name) Por necessidade (call by need)

Fundamentos de Linguagens de Programao


Sinnimos (Aliasing)

Você também pode gostar