Introduo
Agenda
Apresentao da Disciplina
Objetivo
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
Habilidades Requeridas
Estruturas de dados
Linguagens formais Programao
Avaliao
prova escrita, 0-10 projeto, 0-1 prova escrita, 0-5 projeto, 0-5
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
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
Exemplo de instruo
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
ADD R1 R2 R3
Este tipo de programa passou a ser conhecido pelo nome de assembler ou montador
Um compilador primitivo
19
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
Fortran (1957) LISP (1959) COBOL (1960) BASIC (1964) C (1972) etc.
21
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
O nome alto nvel tem o sentido de alto nvel de abstrao, pois essas linguagens abstraem detalhes operacionais pouco relevantes
Veremos agora dois exemplos para comparar as linguagens de nvel alto e baixo
25
27
Caractersticas gerais
Dependentes de arquitetura
Caractersticas gerais
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
29
Introduo
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
Compilao x Interpretao
Compilao
compilao cdigo de mquina execuo resultados
cdigo fonte
Interpretao
interpretao resultados
cdigo fonte
32
Tanto compiladores como interpretadores so responsveis por tornar "real uma linguagem
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
Atualmente as tcnicas so aplicadas no s em linguagens de programao, mas tambm em outros contextos da computao
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?
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
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
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
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
46
Anlise Sinttica
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
Anlise Semntica
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
position
+
* 60
position
+
* int2real 60
50
initial rate
initial rate
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
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
53
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
56
Gerador de Cdigo
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
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