Você está na página 1de 52

ltima reviso 23-09-2011

1/52

Compiladores
Aula 02

Introduo

ltima reviso 23-09-2011

2/52

Introduo
Compiladores. Para que servem?

Introduo

Especificao/Implementao de Linguagens de Programao Uso geral: novas, extenses e atualizaes Especfico: Tempo Real, robtica, descrio de hardware, sistema operacional, banco de dados (BI), protocolos, interfaces Uso de tcnicas/ferramentas em outros sistemas Processamento de texto (Word), linguagens naturais (google translator) Entender melhor as Linguagens de Programao Escolha e uso mais racional/eficiente Estudos avanados Pesquisa e ps-graduao

ltima reviso 23-09-2011

3/52

Introduo
Compiladores, Filtros e Pr-processadores
Nos computadores antigos os compiladores muitas vezes exerciam o seu papel como programas autnomos, exigindo uma interao direta com o programador com operaes especficas e manuais transformando o programa em formas intermedirias produzidas em meios de armazenamento externo (fitas perfuradas e cartes).
Introduo

ltima reviso 23-09-2011

4/52

Introduo
Compiladores, Filtros e Pr-processadores

O cdigo-objeto final, que tambm apresentava-se na forma de fitas e cartes, continha programas-objeto em linguagem de mquina relocvel, ou em formato fonte de linguagem simblica de baixo nvel. A partir da, e atravs de processamento adicional, chegava-se a um programa executvel (ainda na forma de fitas ou cartes).
Introduo

ltima reviso 23-09-2011

5/52

Introduo
Compiladores, Filtros e Pr-processadores

Atualmente os compiladores operam integrados aos demais componentes do sistema de programao, fazendo parte do conjunto dos recursos oferecidos pelo sistema operacional (Unix) inclusive entradas e sadas.
Introduo

ltima reviso 23-09-2011

6/52

Introduo
Definies bsicas
COMPILADOR: um dos mdulos do software de um computador, cuja funo a de efetuar automaticamente a traduo de textos, redigidos em uma determinada linguagem de programao, para alguma outra forma que viabilize sua execuo (em geral em linguagem de mquina).
Texto fonte Texto fonte (redigido em linguagem (redigido em linguagem fonte) fonte)

Tradutor Tradutor

Texto objeto Texto objeto (redigido em linguagem (redigido em linguagem objeto) objeto)

Introduo

TRADUTOR: Tradutores em que a linguagem fonte de baixo nvel, por tradio, chamam-se montadores (assembly languages)

ltima reviso 23-09-2011

7/52

Introduo
Definies bsicas
Generalizando: tradutores convertem textos redigidos em uma linguagem, para formas equivalentes, redigidas em outra linguagem. Se a primeira linguagem for de alto nvel, o tradutor ser chamado compilador.
Texto fonte Texto fonte (Linguagem de alto (Linguagem de alto nvel) nvel) Texto objeto Texto objeto (outra Linguagem )) (outra Linguagem

Compilador Compilador

Introduo

Exemplos de Compiladores: 1. gcc 2. javac

ltima reviso 23-09-2011

8/52

Introduo
Definies bsicas - Filtragem
Caso a linguagem objeto seja de alto nvel e muito semelhante a linguagem fonte, o tradutor recebe o nome de filtro.
Texto objeto Texto objeto (em C )) (em C

Texto fonte (em Java) Texto fonte (em Java)

Filtro Filtro

Introduo

Exemplos?

ltima reviso 23-09-2011

9/52

Introduo
Definies bsicas O pr-processador
Programas que efetuem tradues entre 2 dialetos de mesma linguagem, ou que permitem converter para uma forma padronizada um texto que inclua extenses de uma Linguagem disponvel, chamam-se prprocessadores.
Texto fonte Texto fonte (no preparado) (no preparado)
Pr Pr processador processador

Texto fonte equivalente Texto fonte equivalente (preparado) (preparado)

Introduo

ltima reviso 23-09-2011

10/52

Introduo
Atividades adicionais
1. Deteco e recuperao de erros Ex: variveis no inicializadas, wild pointers Ex: variveis (ou qualquer outra definio) no utilizada no cdigo. 2. Comentrios que facilitam a compreenso. As linhas de comentrio so reproduzidas no cdigoobjeto? 3. Comandos de controle de compilao.

Introduo

ltima reviso 23-09-2011

11/52

Introduo
Formalizao da linguagem
As linguagens de programao devem ser descritas de maneira completa e isenta de ambiguidades. Com notaes de linguagens formais, inspiradas em modelos estudados durante dcadas por estudiosos de linguagens naturais (matemticos ou cientistas da computao), mas mais restritas do que uma linguagem irrestrita (tipo 0) ,o que limita sua generalidade e aumenta sua simplicidade. tais elaboraes visaram a confeco de programas analisadores ou para reconhecimento de padres em outras reas do conhecimento.

Introduo

ltima reviso 23-09-2011

12/52

Introduo
Gramticas/Reconhecedores
O ideal seria conversarmos diretamente computador (nada muito vivel, atualmente). com

Introduo

S SS Usando o que vivel, as Linguagens de programao podem ser formalizadas de 2 maneiras: S deaSb 1. Atravs da gramtica: Conjunto de leis formao que definem rigorosamente o modo de formar textos S bSa corretos em uma linguagem. A linguagem, como vimos, o conjunto de todos os textos gerados a partir das S gramaticais. regras
Gramticas so portanto dispositivos geradores (sntese) de textos pertencentes a linguagem.

ltima reviso 23-09-2011

13/52

Introduo
Gramticas/Reconhecedores
Usando o que vivel, as Linguagens de programao podem ser formalizadas de 2 maneiras: 2. Reconhecedores: uma regra de teste que permite classificar um texto como apertencente a uma dada 2 1 1 linguagem ou no. Muitos compiladores so construdos com base em Reconhecedores Gramtica e Reconhecedores so formas de representao que a b b 6 0 3 5 4 1 permitem definir formalmente linguagens de programao. Elas prprias formam linguagens atravs a b das quais esta formalizao efetuada.
7

Introduo

8 1

ltima reviso 23-09-2011

14/52

Introduo
Metalinguagens
A linguagem utilizada para representar ou definir uma linguagem demodo generalista chama-se METALINGUAGEM. Em Linguagem Natural seria uma gramtica da lngua inglesa redigida em portugus para ser usada por pessoas de lngua portuguesa. Em linguagem de Programao o exemplo mais conhecido a Backus-Naur Form - BNF atravs da qual so construdas gramticas e diagramas de estados que representam os autmatos finitos atravs dos quais so construdos reconhecedores de vrias linguagens.

Introduo

ltima reviso 23-09-2011

15/52

Introduo
Metalinguagens
Exemplo de gramtica escrita em BNF
<program> ::= int main () <block> <block> ::= { <stmt-list> } <stmt-list> ::= <stmt> | <stmt><stmt-list> | <decl> | <decl><stmt-list> <decl> ::= int <id> ; | double <id> ; <stmt> ::= <asgn-stmt> | <cout-stmt> | <return-stmt> <asgn-stmt> ::= <id> = <expr> ; <expr> ::= <expr> + <expr> | <expr> * <expr> | ( <expr> ) | <id> <cout-stmt> ::= cout <out-list> ; <return-stmt> ::= return <integer> ; ... Derivao do exemplo (<program> o smbolo de incio): <program> int main () <block> int main () {<stmtlist> } int main () { <decl> <stmt-list> } int main () { int <id>; <stmt-list> } int main () { int a ; <stmtlist> } * etc.

Introduo

ltima reviso 23-09-2011

16/52

O Processo de Compilao

Fases da compilao

Anlise sinttica (e lxica) Anlise contextual Gerao de cdigo

As fases esto associadas s trs partes da especificao de uma linguagem: sintaxe, restries contextuais (semntica esttica) e semntica.

Introduo

ltima reviso 23-09-2011

17/52

O Processo de Compilao
Programa fonte preprocessador Programa fonte compilador
Introduo

assembler Cdigo objeto (relocvel) Carregador/ link-editor Cdigo executvel Bibliotecas/ cdigos objeto

Programa em assembler

ltima reviso 23-09-2011

18/52

O Processo de Compilao As fases de um compilador


Programa fonte
Anlise sinttica

Relato de erros

AST
Anlise contextual

Relato de erros

AST Decorada
Introduo
Gerao de cdigo

Programa objeto

ltima reviso 23-09-2011

19/52

Fases de um compilador (II)


Programa fonte Anlise lxica Anlise sinttica Gerenciador da tabela de smbolos Anlise semntica Gerador de cdigo intermed. Otimizador de cdigo
Introduo

Tratamento de erros

Gerador de cdigo Programa destino

ltima reviso 23-09-2011

20/52

Passos de compilao

Introduo

Um passo uma travessia do programa fonte, ou de uma representao interna dele. Um compilador de um passo atravessa o programa uma nica vez. Um compilador de mltiplos passos faz vrias travessias O projeto de um compilador diretamente relacionado ao nmero de passos

ltima reviso 23-09-2011

21/52

Passos de compilao
Compilao em mltiplos passos

Mdulo principal (driver) chama cada um dos passos, responsveis pela anlise sinttica, anlise contextual e gerao de cdigo.
Driver do Compilador

Introduo

Analisador Sinttico

Analisador Contextual

Gerador de Cdigo

ltima reviso 23-09-2011

22/52

Passos de compilao
Compilao em passo nico

Analisador sinttico vai realizando/chamando as atividades de anlise contextual e gerao de cdigo, medida que l e reconhece o programa

Introduo

ltima reviso 23-09-2011

23/52

Passos de compilao
Compilao em passo nico
Driver do Compilador

Analisador Sinttico

Introduo

Analisador Contextual

Gerador de Cdigo

ltima reviso 23-09-2011

24/52

Introduo

ltima reviso 23-09-2011

25/52

Scanning (varredura)/ Parsing (sinttico)

Anlise lxica l a seqencia de caracteres e a organiza como tokens seqencias de caracteres com algum significado Anlise sinttica agrupa caracteres ou tokens em uma estrutura hierrquica com algum significado

Introduo

ltima reviso 23-09-2011

26/52

A etapa de parsing
Tokens, Padres e Lexemas

Um token uma classificao de uma unidade lxica

Ex: id e num

Lexemas so sequncias de caracteres que constituem um token

Ex: abc and 123

Introduo

Padres (patterns) so regras que descrevem um conjunto de lexemas que pertencem a um token

Ex: uma letra seguida de letras e dgitos, uma sequncia de dgitos no nula

ltima reviso 23-09-2011

27/52

A etapa de parsing
Exemplo
let var Ident. colon let n : var n : Integer; let var var c: Char in begin c := &; n := n + 1 Ident. becomes Ident. op end n := n + Ident. Integer

Introduo

intlit 1

ltima reviso 23-09-2011

28/52

A etapa de parsing
Exemplo
y := 31 + 28*x Analisador lxico

<id, y> <assign, > <num, 31> <+, > <num, 28> <*, > <id, x> token
Introduo

tokenval (atributo do token)

Parser

ltima reviso 23-09-2011

29/52

Analisador sinttico ou parsing


Expresso Expresso de atribuio Expresso Expresso indexada Expresso [ Expresso ] Expresso Expresso de adio Expresso
identificador b

Expresso numero 3

Introduo

identificador identificador a index

ltima reviso 23-09-2011

30/52

Pontos relevantes no Projeto de um Compilador


Introduo

Velocidade possvel vantagem para um passo Espao possvel vantagem para um passo (dados x programa) Modularidade vantagem de mltiplos passos Flexibilidade vantagem de mltiplos passos Transformaes/otimizaes de programas vantagem de mltiplos passos Caractersticas da linguagem fonte podem inviabilizar o uso de um passo nico se a linguagem permite o uso de uma funo antes da sua definio, por exemplo.

ltima reviso 23-09-2011

31/52

Uma viso do compiladorv, 5 mov


v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; } ......
Introduo
cmp v, 5 jle LBL1 mov x, v add x, 12

Compilador

LBL1: WHILE: cmp x, 3 jne ENDWHILE sub x, 3 mov v, 10 jmp WHILE ENDWHILE: ...

Programa Assembly

ltima reviso 23-09-2011

32/52

Uma viso do compilador Lex - um analisador lxico


O Lex um programa que reconhece strings. Para cada string achada, o Lex toma uma ao.

Introduo

ltima reviso 23-09-2011

33/52

Uma viso do compilador Lex - um analisador lxico


Identifier: Var Var = 12 + 9; if (test > 20) temp = 0; else while (a < 20) temp++; Operand: = Integer: 12

Lex

Operand: + Integer: 9 Semicolon: ; Keyword: if Parenthesis: ( Identifier: temp ....

Programa
Introduo

Sada

ltima reviso 23-09-2011

34/52

Uma viso do compilador Lex - um analisador lxico


No Lex as strings de entrada so decodificadas por expresses regulares. Dentro de um arquivo de controle do Lex possvel encontrar trechos com expresses do tipo
integer identifier ... /* operators */ (0|1|2|3|4|5|6|7|8|9)+ (a|b|..|z|A|B|...|Z)+

Na prtica, utilizam-se expresses do tipo Perl como


Introduo

integer [0-9]+ identifier [a-zA-Z]+ ...

ltima reviso 23-09-2011

35/52

Uma viso do compilador Lex - um analisador lxico


Para cada expresso decodificada existe uma ao associada. Por exemplo:
[\n] [0-9]+ [a-zA-Z]+ linenum++; // Conta linhas puts(integer); /* operators */ puts(identifier);

A ao default ECHO, que imprime a string linda na sada padro.


Introduo

ltima reviso 23-09-2011

36/52

Uma viso do compilador Lex - um analisador lxico


Um exemplo de um cdigo em Lex seria:
%% [ \t\n] [0-9]+ [a-zA-Z]+ ; // Pula linhas e brancos puts(integer); /* operators */ puts(identifier);
$ testelex arq.txt >con

$ testelex arq.txt >con

produz

integer identifier identifier

1234

test 78

Introduo

var 566 9800

Sada

integer integer integer

ltima reviso 23-09-2011

37/52

Uma viso do compilador Lex - um analisador lxico


Outro exemplo de um cdigo em Lex seria:
%{ int linenum = 1; %} [ \t] \n [0-9]+ [a-zA-Z]+ .

1234 var

test

9800 +

/* ; // pula brancos operators


linenum++; puts(integer); puts(identifier); linenum);

*/

temp

$ testelex arq.txt >con integer identifier integer Error. Line 3 identifier

printf(Error. Line %d\n, identifier

Introduo

Sada

ltima reviso 23-09-2011

38/52

Uma viso do compilador Lex - um analisador lxico


O Lex sempre tenta determinar a maior string de entrada Ex: Tenho no Lex as expresses regulares for e forall. Para uma entrada do tipo forall for, o Lex achar forall e for.

Introduo

ltima reviso 23-09-2011

39/52

Uma viso do compilador


Estrutura interna do Lex e do compilador
Os estados finais do AFD so associados com aes
Estrutura do Lex
Expresses AFD AFND AFD regulares mnimo

Estrutura do Compilador
Introduo

Programa

Lex

Parser (Yacc)

Cdigo mquina

ltima reviso 23-09-2011

40/52

Uma viso do compilador O parser


O parser um programa que reconhece a gramtica da linguagem
Program Stmt_list Stmt Expr If_stmt While_stmt ... Stmt_list Stmt; Stmt_list | Stmt; Expr | If_stmt | While_stmt| { Stmt_list } Expr + Expr | Expr Expr | Expr * Expr | Expr / Expr | ( Expr ) | id | num if ( Expr ) then Stmt |if ( Expr ) then Stmt else Stmt while ( Expr ) do Stmt

Introduo

ltima reviso 23-09-2011

41/52

Uma viso do compilador O parser


O parser acha a derivao de uma dada entrada
Program Stmt_list Stmt Stmt_list Stmt; Stmt_list | Stmt; Expr | If_stmt | While_stmt| { Stmt_list }

Expr
If_stmt While_stmt ...

Expr + Expr | Expr Expr | Expr * Expr | Expr / Expr | ( Expr ) | id | num
if ( Expr ) then Stmt |if ( Expr ) then Stmt else Stmt while ( Expr ) do Stmt

entrada 10 + 2 * 5
Introduo

Parsing

E E+E E - E E*E E/E (E) | | num

| | | | id

E => E + E derivao => E + E * E => 10 + E * E => 10 + 2 * E => 10 + 2 * 5

ltima reviso 23-09-2011

42/52

Uma viso do compilador O parser


derivao

E => E + E => E + E * E => 10 + E * E => 10 + 2 * E => 10 + 2 * 5

E 10

+ E 2

E * E 5
rvore de derivao

Introduo

mov a, 5 mul a, 2 add a, 10 Assembly

ltima reviso 23-09-2011

43/52

Uma viso do compilador O parser


Estrutura do Parser
String de entrada Gramtica Derivao

Ex:
Introduo

S SS S aSb S bSa S

ltima reviso 23-09-2011

44/52

Uma viso do compilador O parser - BNF


O BNF (Backus-Naur Form) de uma gramtica consiste em: Smbolos no terminais entre brackets <> ::= utilizado ao invs de Suponha o seguinte programa em C++ abaixo
int main () { int a; int b; int sum; a = 40; b = 6; sum = a + b; cout << "sum is "<< sum << endl; return 0; }

Introduo

ltima reviso 23-09-2011

45/52

Uma viso do compilador O parser - BNF


Usualmente o arquivo que contm a gramtica est escrito em BNF como por exemplo
<program> ::= int main () <block> <block> ::= { <stmt-list> } <stmt-list> ::= <stmt> | <stmt><stmt-list> | <decl> | <decl><stmt-list> <decl> ::= int <id> ; | double <id> ; <stmt> ::= <asgn-stmt> | <cout-stmt> | <return-stmt> <asgn-stmt> ::= <id> = <expr> ; <expr> ::= <expr> + <expr> | <expr> <expr> | ( <expr> ) j <id> <cout-stmt> ::= cout <out-list> ; <return-stmt> ::= return <integer> ; ...

Introduo

Derivao do exemplo (<program> o smbolo de incio): <program> int main () <block> int main () {<stmt-list> } int main () { <decl> <stmt-list> } int main () { int <id>; <stmtlist> } int main () { int a ; <stmt-list> } * etc.

ltima reviso 23-09-2011

46/52

Uma viso do compilador O parser Um exemplo


Ex: Sendo S SS | aSb | bSa | quero fazer a
determinao de aabb. Algoritmo: Busca exaustiva (backtracking). Passo 1: Derivaes de ordem 1 S SS S aSb S bSa S
Introduo

S SS S aSb //// bSa S ///////// (comea com b) //// S /// (nenhum avano)

ltima reviso 23-09-2011

47/52

Uma viso do compilador O parser Um exemplo


S SS | aSb | bSa | Passo 2: w=aabb
S SS SSS //// S/// ///SS S ////S//S///// (repetida) S SS aSbS S SS SaSb //// ///S ///////S S /S/////bSa/// (comea com b) //// ///S S/////// S /S////////bSa (termina em a) //// ///S S S /S//////// (leva ao incio) //// S/// S S ////S///// (repetida)

S SS S aSb //// bSa S ///////// //// S ///

Introduo

S aSb aSSb S aSb aaSbb //// aSb a///////b S ////////////bSa// (a seg letra um b) //// aSb ab S ////////////// (tamanho 2)

ltima reviso 23-09-2011

48/52

Uma viso do compilador O parser Um exemplo


S SS | aSb | bSa | Passo 3:
S SS SSS S SS aSbS S SS SaSb S aSb aSSb S aSb aaSbb

w=aabb
S SS SSS SSSS //// SS ///S//// S/////S S ////////S///S ////SS//// //// SS SS/// SS///// S /////////////S///////SS/ (eu j desisti)

... S aSb aaSbb aabb

Introduo

O parser finalmente acha a derivao

ltima reviso 23-09-2011

49/52

Uma viso do compilador Complexidades


Supondo no haver produes do tipo A e A B, pode-se mostrar que para uma string w o nmero de passos O(2|w|). Por outro lado, para uma gramtica com k regras, existem k derivaes no passo 1 k2 derivaes no passo 2 k2|w| derivaes no passo 2|w| O que totaliza um tempo total de k + + k 2|w|, o que bem ruim.

Introduo

ltima reviso 23-09-2011

50/52

Uma viso do compilador Complexidades


Existem algoritmos mais rpidos para gramticas especializadas como as S-gramticas (S de simples). S-gramticas: A ax, a um smbolo, x uma string de variveis e o par (A,a) aparece no mximo uma vez (caso particular da forma normal de Greibach). Ex:
S aS S bSS Sc Toda a string tem apenas 1 derivao! S aS abSS aacS aacc
Introduo

ltima reviso 23-09-2011

51/52

Uma viso do compilador Complexidade de S-gramticas


Prova-se que so O(|w|) passos por string para S-gramticas. Independentemente do nmero de regras, 1 derivao por passo totaliza um tempo total de O(|w|). Em geral, para GLC's, existe um algoritmo de parsing que deriva a produo de uma string w em O(|w|3)

Introduo

ltima reviso 23-09-2011

52/52

Lista de Exerccios
Compiladores: Princpios e Prticas (Louden) Exerccios 1.1, 1.2, 1.3, 1.6

Introduo

Você também pode gostar