Anda di halaman 1dari 62

INF25 Compiladores

Introduo

Felipe Ferraz felipeferrazbr@gmail.com @felipesferraz

Agenda

Apresentao da disciplina Histria Linguagens de Alto Nvel Introduo

Apresentao da Disciplina

Objetivo

O principal objetivo responder seguinte pergunta

Como criar uma linguagem computacional?

Para responder a pergunta, estudaremos:

Como especificar uma linguagem Como construir um compilador para ela


4

Ementa

Conceitos bsicos sobre compiladores e interpretadores Arquitetura de um compilador Anlise lxica Expresses regulares Tabela de smbolos Anlise sinttica Grafo sinttico Implementao de um analisador sinttico Representao intermediria Anlise e semntica Gerao de cdigo Otimizao de cdigo

Metodologia

Apresentao da base terica


Tcnicas para construo de compiladores nfase na parte prtica

Habilidades Requeridas

Estruturas de dados
Linguagens formais Programao

Avaliao

Primeiro exerccio escolar


prova escrita, 0-10 projeto, 0-1 prova escrita, 0-5 projeto, 0-5

Segundo exerccio escolar


Referncias

Bsica

AHO, A., LAM, M. S., SETHI, R., ULLMAN, J. D., Compiladores: princpios, tcnicas e ferramentas. Ed. Addison Wesley. 2a Edio, 2008. RICE, A., TOSCANI, S., Implementao de Linguagens de Programao: Compiladores. Srie Livros Didticos UFRGS, Bookman, 3a Edio, 2008. MKENNETH C. LOUDEN, Compiladores: Princpios e Prticas. Ed. Cengage Learning, 1a Edio, 2004.

Complementar

APPEL, A. W., PALSBERG, J., Modern Compiler Implementation in Java. Cambridge University Press, 2nd edition, 2002. WATT, D., BROWN, D., Programming Language Processors in Java. Prentice Hall, 2000. LEWIS, H. R., PAPADIMITRIOU, C. H., Elementos de Teoria da Computao. 2a Edio. Ed. Bookman, 2004. TENEMBAUM, A. M., Estrutura de Dados Usando C. Makron Books do Brasil, 1995. DEITEL, H.M., DEITEL, P.J., Java Como Programar. Editora Bookman, 2005.

Histria

Histria

O surgimento dos compiladores est fortemente ligado histria das linguagens de programao, que, por sua vez, est ligada histria dos computadores modernos

11

Histria dos Computadores

Computadores com programas fixos todos at a dcada de 40

Programa implcito no hardware

A maioria tinha propsito especfico, como acontece com as calculadoras modernas


Apenas uma minoria podia ser reprogramada, o que era feito de maneira mecnica Ligando e desligando fios
12

Histria dos Computadores

Computadores de programas armazenados a partir da dcada de 40 com o SSEM Manchester Small-

Scale Experimental Machine

So os computadores modernos, de propsito geral Diferentes programas podem ser criados e carregados na memria Programas escritos usando um conjunto de instrues, representadas em cdigo binrio Linguagem de mquina!

13

Fonte: http://en.wikipedia.org/wiki/Manchester_Small-Scale_Experimental_Machine

14

Linguagem de Mquina

A a linguagem de mquina do SSEM pode ser entendida (grosseiramente) como a primeira linguagem de programao Essa linguagem define a associao entre o uma instruo em binrio e o efeito dela sobre o hardware

Linguagem entendida diretamente pelo processador Cada arquitetura de computador define a sua prpria linguagem
15

Histria das Linguagens

Exemplo de instruo

Somar o valor dos registradores 1 e 2 e guardar o resultado no registrador 3

Exemplo de cdigo de mquina (fictcio)


1011100 0001 0010 0011
adio reg. 1 reg. 2 reg. 3

Podemos ver que escrever um programa em linguagem de mquina no trivial...


16

Histria das Linguagens

Programadores definiram uma notao simblica para representar seus programas

Usada para anotar seus programas em papel antes de passar para linguagem de mquina

Essa notao definia smbolos para representar cada instruo, tais como:

ADD operao de adio LOAD operao de leitura da memria R1 representa o registrador 1 ...

17

Histria das Linguagens

A nova notao simblica recebeu o nome de linguagem assembly ou linguagem de montagem


Exemplo de instruo em assembly

ADD R1 R2 R3

Representa a mesma operao dada antes em cdigo de mquina


18

Histria das Linguagens

No demorou at algum ter a idia de criar um programa para traduzir...


De um texto digitado na linguagem assembly Para um arquivo em linguagem de mquina

Este tipo de programa passou a ser conhecido pelo nome de assembler ou montador

Um compilador primitivo
19

Histria das Linguagens

Programar em linguagem de montagem, porm, ainda tinha muitas das desvantagens da prpria linguagem de mquina O principal problema era a necessidade de pensar no s no algoritmo em si, mas no funcionamento do hardware

20

Histria das Linguagens

Comearam a surgir outras linguagens mais elaboradas


Fortran (1957) LISP (1959) COBOL (1960) BASIC (1964) C (1972) etc.

21

Histria das Linguagens

Facilitaram a vida dos programadores ao tornar a notao mais intuitiva e mais distante dos detalhes de hardware Por exemplo, o comando Fortran temp = 2 + 3 Engloba vrias operaes de hardware: Carregar os operadores em registradores Operar a adio, guardando o resultado em algum registrador Copiar o contedo do registrador de resultado para a memria

22

Histria das Linguagens

As novas linguagens que surgiram foram chamadas de linguagens de alto nvel


Em contraste, as linguagens assembly e de montagem passaram a ser chamadas de linguagens de baixo nvel
23

Linguagens de Alto Nvel

Linguagens de Alto Nvel

O nome alto nvel tem o sentido de alto nvel de abstrao, pois essas linguagens abstraem detalhes operacionais pouco relevantes

Assim, o programador pode (tenta) focar s no algoritmo

Veremos agora dois exemplos para comparar as linguagens de nvel alto e baixo
25

Exemplo em Baixo Nvel

Programa Hello World em assembly x86


DOSSEG .MODEL SMALL .DATA Msg db "Hello World.",13,10,"$" .CODE Start: mov AX, @DATA mov DS, AX lea DX, Msg mov AH, 9 int 21h mov ah, 4ch int 21h END Start
26

Exemplo em Alto Nvel

Programa Hello World em C


#include <stdio.h> int main() { printf(Hello World); return 0; }

27

Linguagens de Baixo Nvel

Caractersticas gerais

Dependentes de arquitetura

Oferecem instrues primitivas simples (operaes sobre o hardware)


Programas extensos e pouco legveis Visam oferecer mais controle sobre o hardware
28

Linguagens de Alto Nvel

Caractersticas gerais

Especificadas independentemente de qualquer arquitetura Oferecem comandos mais intuitivos

Dizem mais o que deve ser feito do que como deve ser feito

Mais fcil de programar e de ler cdigos prontos Restringem o uso do hardware para evitar bugs

Controle da alocao de memria em Java

29

Introduo

Histria dos Compiladores

A criao das linguagens de alto nvel provocou o surgimento dos compiladores


Lem um cdigo de entrada e, como sada, geram um arquivo em cdigo de mquina O arquivo gerado pode ser executado para produzir os resultados desejados

Depois surgiriam tambm os interpretadores

Lem um cdigo de entrada e imediatamente executam o que est descrito no cdigo


31

Compilao x Interpretao

Compilao
compilao cdigo de mquina execuo resultados

cdigo fonte

Interpretao
interpretao resultados

cdigo fonte

32

Histria dos Compiladores

Tanto compiladores como interpretadores so responsveis por tornar "real uma linguagem

Sem eles, a linguagem no tem utilidade

Nos anos 60 e 70 essa rea amadureceu, causando um grande crescimento do nmero de linguagens de alto nvel
Hoje a rea est bem estabelecida...
33

Histria dos Compiladores

Atualmente as tcnicas so aplicadas no s em linguagens de programao, mas tambm em outros contextos da computao

Linguagens de consulta, como SQL


Linguagens de descrio de dados, como XML Ferramentas auxiliares de desenvolvimento

Syntax highlighting, outline do cdigo, etc.


34

O que um Compilador?

Um compilador um programa que l um programa escrito em uma linguagem (linguagem fonte) e a traduz em um programa equivalente em outra linguagem (linguagem alvo). Aho, Sethi, Ullman.
Programa Fonte

Compilador

Programa Objeto

35

O que um Compilador?

Exemplo de linguagem fonte: C, Pascal, Java, etc. Exemplo de linguagem destino:

Linguagem de mquina (assembler) de um processador Linguagem de uma mquina virtual (Java)

36

O que um Compilador?

Nesse processo de traduo, h duas tarefas bsicas a serem executadas por um compilador:

anlise, em que o texto de entrada (na linguagem fonte) examinado, verificado e compreendido sntese, ou gerao de cdigo, em que o texto de sada (na linguagem objeto) gerado, de forma a corresponder ao texto de entrada
37

O que um Compilador?

A fase de anlise normalmente se subdivide em anlise lxica, anlise sinttica e anlise semntica possvel representar completamente a sintaxe de uma LP atravs de uma gramtica sensvel ao contexto Mas como no existem algoritmos prticos para tratar essas gramticas, a preferncia recai em usar gramticas livres de contexto Deixa-se para a anlise semntica a verificao de todos os aspectos da linguagens que no se consegue exprimir de forma simples usando gramticas livres de contexto
38

O que um Compilador?

A implementao de reconhecedores de linguagens regulares (autmatos finitos) mais simples e mais eficiente do que a implementao de reconhecedores de linguagens livres de contexto (autmatos de pilha) Nesse caso, possvel usar expresses regulares para descrever a estrutura de componentes bsicos das LP, tais como identificadores, palavras reservadas, literais numricos, operadores e delimitadores, etc.
Essa parte da tarefa de anlise (anlise lxica) implementada separadamente, pela simulao de autmatos finitos

39

O que um Compilador?

Um dos modelos possveis para a construo de compiladores faz a separao total entre o front-end, encarregado da fase de anlise, e o back-end, encarregado da gerao de cdigo, de forma que

O front-end e back-end se comunicam apenas atravs de uma representao intermediria O front-end depende exclusivamente da linguagem fonte O back-end depende exclusivamente da linguagem objeto
40

O que um Compilador?

Um compilador tpico consiste de algumas fases onde cada uma passa sua sada para as fases seguintes
As principais fases so:

anlise lxica (ou scanner) anlise sinttica (ou parser) anlise semntica otimizao gerador de cdigo otimizao (novamente!)

41

Fases da Compilao
Programa Fonte Analisador Lxico Analisador Sinttico e Semntico Tabela de Smbolos Gerador de Cdigo Intermedirio Manipulador de erros

Otimizador de Cdigo
Gerador de cdigo Programa Objeto
42

Anlise Lxica

Tambm chamada de scanner Agrupa caracteres em smbolos (ou tokens)

Entrada: fluxo de caracteres Sada: fluxo de smbolos Smbolos so: Palavras reservadas, identificadores de variveis e procedimentos, operadores, pontuao, etc. Expresses regulares usadas para reconhecimento Scanner implementado como uma MEF (Mtodo dos Elementos Finitos) Lex/Flex (J) so ferramentas para gerar scanners

Token: <nome-token, valor-atributo>

43

Anlise Lxica

Por exemplo, os caracteres na instruo de atribuio position = initial + rate * 60 seriam agrupada nos seguintes tokens: O identificador position O smbolo de atribuio = O identificador initial O smbolo de adio + O identificador rate O smbolo de multiplicao * O nmero 60 <id, 1> <=> <id, 2> <+> <id, 3> <*> <60>
44

Anlise Sinttica

Tambm chamada de parser Agrupa smbolos em unidades sintticas

Ex.: os 3 smbolos A+B podem ser agrupados em uma estrutura chamada de expresso

Expresses depois podem ser agrupados para formar comandos ou outras unidades Sada: representao de rvore sinttca do programa Gramtica livre de contexto usada para definir a estrutura do programa reconhecida por um parser Yacc/Bison (J) so ferramentas para gerar parsers
45

Anlise Sinttica

Regras sintticas (1)


Qualquer identificador uma expresso Qualquer nmero uma expresso


expresso1 + expresso2 expresso1 * expresso2 ( expresso1 )

46

Anlise Sinttica

Regras sintticas (2)

Se identificador1 um identificador e expresso2 uma expresso, ento identificador1 = expresso2 um comando (statement) Se expresso1 uma expresso e statement2 um comando (statement), ento
while ( expresso1 ) { statement2 } if ( expresso1 ) { statement2 } so comandos (statements)
47

Anlise Sinttica
position = initial + rate * 60
comando de atribuio identificador position = expresso expresso + expresso expresso nmero 60
48

identificador
initial

expresso * identificador rate

Anlise Semntica

Verifica se estruturas sintticas, embora corretas sintaticamente, tm significado admissvel na linguagem

Um importante componente checagem de tipos Considerando A + B, quais os possveis problemas semnticos? Sada: rvore sinttica anotada

Ou seja se voc pode somar um INT a um DOUBLE ou a uma STRING ( caso de java)

49

Anlise Semntica

Anlise semntica insere uma converso de inteiro para real


= =

position

+
* 60

position

+
* int2real 60
50

initial rate

initial rate

Gerador de Cdigo Intermedirio

Usa as estruturas produzidas pelo analisador sinttico e verificadas pelo analisador semntico para criar uma sequncia de instrues simples (cdigo intermedirio) Est entre a linguagem de alto nvel e a linguagem de baixo nvel
51

Gerador de Cdigo Intermedirio

Considere que temos um nico registrador acumulador Considere o comando de atribuio x := a + b * c pode ser traduzido em:
t1 := b * c t2 := a + t1 x := t2

Pode-se fazer um gerador de cdigo relativamente simples usando regras como:


52

Gerador de Cdigo Intermedirio

53

Gerador de Cdigo Intermedirio

O comando de atribuio x := a + b * c
Gera o cdigo
Load Mult Store Load Add Store Load Store b c t1 a t1 t2 t2 x { t1 := b * c }

{ t2 := a + t1 }

{ x := t2 }

54

Otimizador de Cdigo

Independente da mquina Melhora o cdigo intermedirio de modo que o programa objeto seja menor (ocupe menos espao de memria) e/ou mais rpido (tenha tempo de execuo menor) A sada do otimizador de cdigo um novo cdigo intermedirio
55

Otimizador de Cdigo

Otimizador por sub-expresses comuns

56

Gerador de Cdigo

Produz o cdigo objeto final Toma decises com relao :


Alocao de espao para os dados do programa; Seleo da forma de acess-los Definio de quais registradores sero usados, etc.

Projetar um gerador de cdigo que produza programas objeto eficientes uma das tarefas mais difceis no projeto de um compilador
57

Gerador de Cdigo

Vrias consideraes tm que ser feitas:

H vrios tipos de instrues correspondendo a vrios tipos de dados e a vrios modos de endereamento H instrues de soma especficas, por exemplo para incrementar/decrementar de 1 Algumas somas no foram especificadas explicitamente Clculo de endereo de posies em vetores Incremento/decremento registrador de topo pilha Local onde armazenar variveis Alocao de registradores 58

Gerador de Cdigo
temp1 = id3 * 60.0 id1 = id2 + temp1 MOVF MULF MOVF ADDF MOVF id3, R2 #60.0, R2 id2, R1 R2, R1 R1, id1
59

Tabela de Smbolos

uma estrutura de dados usada para guardar informaes a respeito de todos os nomes usados pelo programa e registrar informaes importantes associadas a cada um, tais como seu tipo (inteiro, real, etc.), tamanho, escopo, etc.
60

Manipulador de Erros

ativado sempre que for detectado um erro no programa fonte Deve avisar o programador da ocorrncia do erro emitindo uma mensagem, e ajustar-se novamente informao sendo passada de fase a fase de modo a poder completar o processo de compilao

Mesmo que no seja mais possvel gerar cdigo objeto, a anlise lxica e sinttica deve prosseguir at o fim
61

Bibliografia

AHO, A., LAM, M. S., SETHI, R., ULLMAN, J. D., Compiladores: princpios, tcnicas e ferramentas. Ed. Addison Wesley. 2a Edio, 2008 (Captulo 1)

62

Anda mungkin juga menyukai