Compiladores - Introdu§£o

  • View
    29

  • Download
    0

Embed Size (px)

DESCRIPTION

Compiladores - Introdução. Guilherme Amaral Avelino gavelino@gmail.com. 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. - PowerPoint PPT Presentation

Text of Compiladores - Introdu§£o

  • Compiladores - Introduo

    Guilherme Amaral Avelinogavelino@gmail.com

  • 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.

  • 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 compreendidoAnlise lxica, sinttica e semnticaSntese, ou gerao de cdigo, em que o texto de sada (na linguagem objeto) gerado, de forma a corresponder ao texto de entrada

  • 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.

  • 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.

  • Compiladores Separando em partesUm dos modelos possveis para a construo de compiladores faz a separao total entre o frontend, encarregado da fase de anlise, e o back-end, encarregado da gerao de cdigo, de forma queO front-end e back-end se comunicam apenas atravs da representao intermediriaO front-end depende exclusivamente da linguagem fonte;O back-end depende exclusivamente da linguagem destino.Simplifica a implementao de novos compiladoresFront-end especfico para cada linguagemBack-end especfico para a arquitetura alvo

    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 queO front-end e back-end se comunicam apenas atravs da representao intermediriaO front-end depende exclusivamente da linguagem fonte;O back-end depende exclusivamente da linguagem objeto.

    Front-endBack-end

  • Compiladores - FasesConjunto de alteraes feitas no cdigo as quais so responsveis por uma atividade especfica do processo de compilaoAnlise Lxica (scanner)Anlise Sinttica (parser)Anlise SemnticaOtimizaoGerao de cdigo

  • Anlise LxicaTambm 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,...Uso de expresses regulares no reconhecimentoLex/Flex so ferramentas que geram scanners.

  • Anlise LxicaDado os caracteres da instruo montante := saldo + taxa_de_juros * 30;So identificados os seguintes tokens:Identificador montantSmbolo de atribuio :=Identificador saldoSmbolo de adio +Identificador taxa_de_jurosSmbolo de multiplicao *Nmero 30

  • Anlise SintticaTambm chamada de parserAgrupa smbolos em unidades sintticasEx.: 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 rvore de parse do programaGramtica livre de contexto usada para definir a estrutura do programa reconhecida por um parserYacc/Bison so ferramentas para gerar parsers

  • Anlise SintticaComandoExpressoIdentificadorExpressoExpressoExpressoExpresso:=+*IdentificadorIdentificadormontantesaldotaxa_de_jurosNmero60rvore gerada para: montante := saldo + taxa_de_juros * 60

  • Anlise SemnticaVerifica se estruturas sintticas, embora corretas sintaticamente, tm significado admissvel na linguagem.Por exemplo, no possvel representar em uma gramtica livre de contexto uma regra como todo identificador deve ser declarado antes de ser usadoUm importante componente checagem de tipos.Utiliza informaes coletadas anteriormente e armazenadas na tabela de smbolosConsiderando A + B, quais os possveis problemas semnticos?Sada: rvore de parse anotada

  • Anlise Semnticamontante+*saldotaxa_de_juros*60montante+*saldotaxa_de_juros*inttorealConverso de inteiro para real inserida pela anlise semntica

  • Gerador de Cdigo IntermedirioUsa as estruturas produzidas pelo analisador sinttico e verificadas pelo analisador semntico para criar uma seqncia de instrues simples (cdigo intermedirio)Est entre a linguagem de alto nvel e a linguagem de baixo nvel

  • Gerador de Cdigo IntermedirioConsidere que temos um nico registrador acumulador. Considere o comando de atribuiox := a + b * c pode ser traduzido em:t1:=b*ct2:=a+t1x:=t2Pode-se fazer um gerador de cdigo relativamente simples usando regras como:

  • Gerador de Cdigo IntermedirioToda operao aritmtica (binria) gera 3 instrues. Para b*cCarga do primeiro operando no acumuladorload bExecuta a operao correspondente com o segundo operando, deixando o resultado no acumuladormult cArmazena o resultado em uma nova varivel temporriastore t1Um comando de atribuio gera sempre duas instrues. Para x:= t2Carrega o valor da expresso no acumuladorload t2Armazena o resultado na varivelstore x

  • Para o comando de atribuiox := a + b * c; gerado o cdigo intermedirio:Load b{ t1 := b * c }Mult cStore t1Load a{ t2 := a + t1 }Add t1Store t2Load t2Store x{ x := t2 }

  • 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

  • Otimizador de CdigoLoad bMult cStore t1Load aAdd t1Store t2Load t2Store xLoad bMult cAdd aStore x

  • Otimizador de Cdigo

  • Gerador de CdigoProduz 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

  • Gerador de CdigoVrias 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 pilhaLocal onde armazenar variveis;Alocao de registradores