Professional Documents
Culture Documents
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
MOV R1, &a ;; endereo de a R1 ADD R1, R0 ;; adiciona R0 a R1 MOV *R1, 6 ;; constante 6 endereo em R1
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
A Tabela de Smbolos deve ser estruturada de uma forma tal que permita rpida insero e extrao de informaes, porm deve ser to compacta quanto possvel.
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
O projetista de compilador, como qualquer desenvolvedor de software, pode tirar proveito dos diversos ambientes de desenvolvimento de software modernos contendo ferramentas como editores de texto, depuradores, gerenciadores de verso, profilers, ferramentas de testes e assim por diante. Alm dessas ferramentas gerais de desenvolvimento de software, outras ferramentas mais especializadas foram desenvolvidas para auxiliar na programao de diversas fases de um compilador. Essas ferramentas utilizam linguagens especializadas para especificar e implementar componentes especficos, e muitas usam algoritmos bastante sofisticados.
COMPILADORES
Prof. Anderson Favaro
As ferramentas mais bem-sucedidas so aquelas que ocultam os detalhes de seus algoritmos e produzem componentes que podem ser facilmente integrados ao restante do compilador. Algumas das ferramentas mais utilizadas na construo de compiladores so:
COMPILADORES
Prof. Anderson Favaro
Geradores de analisadores sintticos, que produzem automaticamente reconhecedores sintticos a partir de uma descrio gramatical de uma linguagem de programao. Geradores de analisadores lxicos, que produzem analisadores lxicos a partir de uma descrio dos tokens de uma linguagem em forma de expresso regular. Mecanismos de traduo dirigida por sintaxe, que produzem colees de rotinas para percorrer uma rvore de derivao e gerar cdigo intermedirio. Geradores de gerador de cdigo, que produzem um gerador de cdigo a partir de uma coleo de regras para traduzir cada operao da linguagem intermediria na linguagem de mquina para uma mquina alvo.
COMPILADORES
Prof. Anderson Favaro
Mecanismos de anlise de fluxo de dados, que facilitam a coleta de informaes sobre como os valores so transmitidos de parte de um programa para cada uma das outras partes. A anlise de fluxo de dados uma ferramenta essencial para a otimizao do cdigo. Conjuntos de ferramentas para a construo de compiladores, que oferecem um conjunto integrado de rotinas para a construo das diversas fases de um compilador.
COMPILADORES
Prof. Anderson Favaro
A interao entre os algoritmos, usados nas fases de um compilador, e as estruturas de dados, que do suporte a essas fases, bastante forte. O escritor do compilador tenta implementar esses algoritmos de forma to eficiente quanto possvel, sem incorrer em muita complexidade adicional. Idealmente, um compilador deveria ser capaz de compilar um programa em tempo proporcional ao tamanho do programa, ou seja, em tempo O(n), em que n mede o tamanho do programa (usualmente, o nmero de caracteres). Nesta seo, indicamos algumas das principais estruturas de dados necessrias para a operao de cada fase e para a comunicao entre fases.
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
O analisador semntico adiciona tipos de dados e outras informaes; e as fases de otimizao e gerao de cdigo utilizam a informao da tabela de smbolos para efetuar escolhas apropriadas para o cdigo-objeto. Corno a tabela de smbolos acessada, com bastante freqncia, a insero, a eliminao e o acesso precisam ser eficientes, preferivelmente de tempo constante. Uma estrutura de dados padro para isso a tabela de hashing, embora diversas estruturas de rvores possam ser utilizadas. Por vezes, diversas tabelas so utilizadas e mantidas em uma lista ou pilha.
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
Um exemplo tpico so os endereos de reviso retroativa durante a gerao de cdigo. Por exemplo, na traduo de uma declarao condicional como a seguinte, if x = 0 then ... else ... preciso gerar um salto do teste para a parte indicada pelo else antes de ser conhecida a localizao do cdigo para essa parte do programa: CMP X, 0 JNE NEXT ;; localizao do NEXT ainda no conhecida <cdigo para a parte then> NEXT: <cdigo para a parte ele> Normalmente, deve ser reservado um espao para valor de NEXT, que preenchido quando o valor conhecido. Isso pode
COMPILADORES
Prof. Anderson Favaro
A estrutura de um compilador pode ser vista por diferentes ngulos. Anteriormente descrevemos suas fases, que representam a estrutura lgica de um compilador. Outros pontos de vista so: a estrutura fsica do compilador, o seqenciamento das operaes etc. Quem escreve um compilador deve ter familiaridade com tantas vises quanto possvel da estrutura de um compilador, pois a estrutura do compilador tem grande impacto em sua confiabilidade, eficincia, utilidade e facilidade de manuteno. Agora consideraremos outros aspectos da estrutura de um compilador e indicaremos como cada viso se aplica.
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
Essa estrutura especialmente importante para a transportabilidade de compiladores, com o projeto do compilador considerando mudanas de cdigo-fonte (o que requer a reescrita da frente) ou de cdigo-alvo (o que requer a reescrita do fundo). Na prtica, difcil conseguir essa separao, e compiladores transportveis ainda apresentam caractersticas que dependem das linguagens-fonte e alvo. Parte da culpa disso advm de mudanas rpidas e fundamentais ocorridas nas linguagens de programao e nas arquiteturas de computadores, mas tambm difcil reter toda a informao necessria para mudar de linguagem-alvo ou tornar as estruturas de dados suficientemente gerais para permitir mudanas de linguagem-fonte. Ainda assim, tentativas consistentes de separar frente e fundo
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
Dependendo da linguagem, um compilador pode ser de uma passada, com todas as fases ocorrendo em uma nica passada. O resultado uma compilao eficiente, mas (normalmente) um cdigo-alvo menos eficiente. Pascal e C so linguagens que permitem compilao de uma passada. (Modula-2 uma linguagem cuja estrutura requer pelo menos duas passadas.) A maioria dos compiladores com otimizao utiliza mais de uma passada;
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
Uma situao mais comum a linguagem ser bem conhecida e j ter uma definio. Por vezes, essa definio pode ser considerada um padro para a linguagem, aprovado por uma organizao oficial de padronizao como o American National Standards Institute (ANSI) ou a International Organization for Standardization (ISO). Por exemplo, Fortran, Pascal e C tm padronizao ANSI. Ada tem uma padronizao aprovada pelo governo dos Estados Unidos. Nesse caso, preciso interpretar a definio da linguagem e implementar um compilador conforme essa definio.
COMPILADORES
Prof. Anderson Favaro
Isso no costuma ser uma tarefa fcil, mas , s vezes, simplificada pela existncia de um conjunto de programas de teste padro (um conjunto de teste) para verificar o compilador (existe um conjunto como esse para Ada). Ocasionalmente, uma linguagem tem sua semntica dada por uma definio formal e matemtica. Diversos mtodos atualmente em uso fazem isso, e nenhum dos mtodos atingiu o status de padro, embora a chamada semntica denotacional seja um dos mtodos mais comuns, especialmente na comunidade de programao funcional. Quando existe uma definio formal para uma linguagem, ento (teoricamente) possvel construir uma prova matemtica da correo do compilador com relao definio.
COMPILADORES
Prof. Anderson Favaro
Um aspecto da construo de compiladores que particularmente afetado pela definio da linguagem a estrutura e o comportamento do ambiente de execuo. Vale a pena notar, entretanto, que a estrutura dos dados permitidos em uma linguagem de programao, e particularmente os tipos de ativaes de funes e valores de retorno permitidos, tm efeito decisivo na complexidade do sistema de execuo. Em particular, os trs tipos bsicos de ambientes de execuo, em ordem crescente de complexidade, so:
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
Finalmente, linguagens funcionais e a maioria das linguagens orientadas a objetos, como LISP e Smalltalk, requerem um ambiente "totalmente dinmico", em que toda a alocao efetuada automaticamente pelo cdigo gerado no compilador. Isso complicado, pois requer que a memria seja liberada tambm automaticamente, o que exige algoritmos complexos de "coleta de lixo".
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
Por vezes, uma definio de linguagem especifica a necessidade de fornecer certa pragmtica. Por exemplo, Pascal e C especificam certos procedimentos de entrada/ sada (em Pascal, eles fazem parte da linguagem, e em C eles fazem parte da especificao de uma biblioteca padro). Em Ada, diversas diretivas do compilador, denominadas pragmas, fazem parte da definio da linguagem. Por exemplo, as declaraes Ada pragma LIST (ON) ; ... pragma LIST(OFF); geram uma listagem do compilador para a parte do programa contida entre os pragmas.
COMPILADORES
Prof. Anderson Favaro
COMPILADORES
Prof. Anderson Favaro
Tcnicas de tratamento de erros para cada fase sero, portanto, estudadas separadamente. Uma definio de linguagem requer usualmente no apenas que erros estticos sejam capturados por um compilador, mas tambm que certos erros de execuo sejam capturados. Isso exige que um compilador gere cdigo adicional para efetuar testes apropriados de execuo, a fim de garantir que todos esses erros causem um evento apropriado durante a execuo.
COMPILADORES
Prof. Anderson Favaro
Um evento dos mais simples interromper a execuo do programa. Freqentemente, entretanto, isso inadequado, e uma definio de linguagem deve requerer a presena de mecanismos para tratamento de erros. Isso pode complicar substancialmente o gerenciamento de um sistema de execuo, especialmente se um programa puder continuar a execuo do ponto no qual ocorreu o erro. No consideraremos a implementao desses mecanismos, mas mostraremos como um compilador pode gerar cdigo de teste para garantir que erros especficos de execuo interrompam a execuo.