You are on page 1of 57

COMPILADORES

Prof. Anderson Favaro

O O PROCESSO PROCESSO DE DE TRADUO TRADUO ESTRUTURA ESTRUTURA DE DE UM UM TRADUTOR TRADUTOR

COMPILADORES
Prof. Anderson Favaro

GERADOR GERADOR DE DE CDIGO CDIGO INTERMEDIRIO INTERMEDIRIO


Esta fase utiliza a representao interna produzida pelo Analisador Sinttico e gera como sada uma seqncia de cdigo. Esse cdigo pode, eventualmente, ser o cdigo objeto final mas, na maioria das vezes, constitui-se num cdigo intermedirio, pois a traduo de cdigo fonte para objeto em mais de um passo apresenta algumas vantagens: possibilita a otimizao de cdigo intermedirio, de modo a obter-se o cdigo objeto final mais eficiente; resolve, gradualmente, as dificuldades da passagem de cdigo fonte para cdigo objeto (alto nvel para baixo nvel), j que o cdigo fonte pode ser visto como um texto condensado que explore em inmeras instrues elementares de baixo nvel.

COMPILADORES
Prof. Anderson Favaro

GERADOR GERADOR DE DE CDIGO CDIGO INTERMEDIRIO INTERMEDIRIO


A gerao de cdigo intermedirio pode estar estruturalmente distribuda nas fases anteriores (anlise sinttica e semntica) ou mesmo no existir (traduo direta para cdigo objeto), no caso de tradutores bem simples. A grande diferena entre o cdigo intermedirio e o cdigo objeto final que o intermedirio no especifica detalhes tais como quais registradores sero usados, quais endereos de memria sero referenciados, etc.

COMPILADORES
Prof. Anderson Favaro

GERADOR GERADOR DE DE CDIGO CDIGO INTERMEDIRIO INTERMEDIRIO


Exemplo de cdigo intermedirio while I < 100 do I := J + I ; Para o comando while apresentado anteriormente, o gerador de cdigo intermedirio, recebendo a rvore de derivao mostrada na figura, poderia produzir a seguinte seqncia de instrues:

COMPILADORES
Prof. Anderson Favaro

GERADOR GERADOR DE DE CDIGO CDIGO INTERMEDIRIO INTERMEDIRIO


L0 if I < 100 goto L1 goto L2 L1 TEMP := J + I I := TEMP goto L0 L2 ... H vrios tipos de cdigo intermedirio: qudruplas, triplas, notao polonesa ps-fixada, etc. A linguagem intermediria do exemplo acima chamada "cdigo de trs endereos", pois cada instruo tem no mximo trs operandos.

COMPILADORES
Prof. Anderson Favaro

GERADOR GERADOR DE DE CDIGO CDIGO INTERMEDIRIO INTERMEDIRIO


Resumindo... No processo de traduzir um programa fonte para um cdigo objeto, um compilador pode produzir uma ou mais representaes intermedirias, as quais podem ter diversas formas. As rvores de sintaxe denotam uma forma de representao intermediria; elas normalmente so usadas durante as anlises sinttica e semntica. Depois das anlises sinttica e semntica do programa fonte, muitos compiladores geram uma representao intermediria explcita de baixo nvel ou do tipo linguagem de mquina, que podemos imaginar como um programa para uma mquina abstrata. Essa representao intermediria deve ter duas propriedades importantes:

COMPILADORES
Prof. Anderson Favaro

GERADOR GERADOR DE DE CDIGO CDIGO INTERMEDIRIO INTERMEDIRIO


Consideramos uma forma intermediria, chamada cdigo de trs endereos, que consiste em uma seqncia de instrues do tipo assembler com trs operandos por instruo. Cada operando pode atuar como um registrador. A sada do gerador de cdigo intermedirio na Figura consiste em uma seqncia de instrues ou cdigo de trs endereos...

COMPILADORES
Prof. Anderson Favaro

GERADOR GERADOR DE DE CDIGO CDIGO INTERMEDIRIO INTERMEDIRIO

COMPILADORES
Prof. Anderson Favaro

GERADOR GERADOR DE DE CDIGO CDIGO INTERMEDIRIO INTERMEDIRIO


Vrios pontos precisam ser observados em relao aos cdigos de trs endereos. Primeiro, cada instruo de atribuio de trs endereos possui no mximo um operador do lado direito. Assim, essas instrues determinam a ordem em que as operaes devem ser realizadas; a multiplicao precede a adio no programa fonte. Segundo, o compilador precisa gerar um nome temporrio para guardar o valor computado por uma instruo de trs endereos. Terceiro, algumas "instrues de trs endereos", como a primeira e ltima na seqncia, possuem menos de trs operandos.

COMPILADORES
Prof. Anderson Favaro

GERADOR GERADOR DE DE CDIGO CDIGO OBJETO OBJETO


O gerador de cdigo gera, a partir do cdigo intermedirio (IR), o cdigo para a mquina-alvo. Neste texto, escreveremos o cdigo-alvo em forma de linguagem de montagem para facilitar o entendimento, embora a maioria dos compiladores gere diretamente o cdigo-objeto. nessa fase da compilao que as propriedades da mquinaalvo se tornam o fator principal. No apenas necessrio usar as instrues conforme apresentadas na mquina-alvo, mas tambm as decises sobre a representao de dados assume um papel importante, como, por exemplo, quantos bytes ou palavras as variveis de inteiros e de ponto flutuante ocuparo na memria.

COMPILADORES
Prof. Anderson Favaro

GERADOR GERADOR DE DE CDIGO CDIGO OBJETO OBJETO


Em nosso exemplo, precisamos decidir como armazenar inteiros para gerar o cdigo de indexao de matrizes. Por exemplo, uma seqncia de cdigo possvel para a expresso dada poderia ser (em uma linguagem de montagem hipottica): MOV R0, index MUL R0, 2 ;; valor de index R0 ;; dobra valor em R0

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

GERADOR GERADOR DE DE CDIGO CDIGO OBJETO OBJETO


Nesse cdigo, usamos uma conveno de C para os modos de endereamento, assim, &a o endereo de a (ou seja, o endereo inicial da matriz) e *R1 significa o endereamento indireto de registro (ou seja, a ltima instruo armazena o valor 6 no endereo contido em R1). Nesse cdigo, tambm assumimos que a mquina efetua endereamento de bytes e que inteiros ocupam dois bytes de memria (da o uso de 2 como fator de multiplicao na segunda instruo).

COMPILADORES
Prof. Anderson Favaro

GERADOR GERADOR DE DE CDIGO CDIGO OBJETO OBJETO


Esta fase tem como objetivos: produo de cdigo objeto, reserva de memria para constantes e variveis, seleo de registradores, etc. a fase mais difcil, pois requer uma seleo cuidadosa das instrues e dos registradores da mquina alvo a fim de produzir cdigo objeto eficiente. Existem tradutores que possuem mais uma fase para realizar a otimizao do cdigo objeto, isto , otimizao do cdigo dependente de mquina.

COMPILADORES
Prof. Anderson Favaro

GERADOR GERADOR DE DE CDIGO CDIGO OBJETO OBJETO


Resumindo... O gerador de cdigo recebe como entrada uma representao intermediria do programa fonte e o mapeia em uma linguagem objeto. Se a linguagem objeto for cdigo de mquina de alguma arquitetura, devem-se selecionar os registradores ou localizaes de memria para cada uma das variveis usadas pelo programa. Depois, os cdigos intermedirios so traduzidos em seqncias de instrues de mquina que realizam a mesma tarefa. Um aspecto crtico da gerao de cdigo est relacionado cuidadosa atribuio dos registradores s variveis do programa.

COMPILADORES
Prof. Anderson Favaro

GERADOR GERADOR DE DE CDIGO CDIGO OBJETO OBJETO


Por exemplo, usando os registradores R1 e R2, o cdigo intermedirio em (1.4) poderia ser traduzido para o cdigo de mquina LDF MULF LDF ADDF STF R1, R2, R2, R1, R1, R2 id1, R1 id3 id2 R2, #60.0

COMPILADORES
Prof. Anderson Favaro

GERADOR GERADOR DE DE CDIGO CDIGO OBJETO OBJETO


O primeiro operando de cada uma das instrues especifica um destino. O F em cada uma das instrues nos diz que ela manipula nmeros de ponto flutuante. O cdigo em (1.5) carrega o contedo do endereo id3 no registrador R2, depois o multiplica pela constante de ponto flutuante 60.0 O # significa que o valor 60.0 deve ser tratado como uma constante imediata. A terceira instruo move id2 para o registrador R1, e a quarta o soma com o valor previamente calculado no registrador R2. Finalmente, o valor no registrador R1 armazenado no endereo de id1, portanto o cdigo mostrado implementa corretamente o comando de atribuio.

COMPILADORES
Prof. Anderson Favaro

GERADOR GERADOR DE DE CDIGO CDIGO OBJETO OBJETO


A organizao de memria em tempo de execuo depende da linguagem sendo compilada. Decises sobre a alocao de espao podem ser tomadas em dois momentos: durante a gerao de cdigo intermedirio ou durante a gerao do cdigo.

COMPILADORES
Prof. Anderson Favaro

OTIMIZADOR OTIMIZADOR DE DE CDIGO-ALVO CDIGO-ALVO


Nessa fase, o compilador tenta melhorar o cdigo-alvo, gerado pelo gerador de cdigo. Entre as melhorias, podemos ter a escolha de modos de endereamento para melhorar o desempenho, a substituio de instrues lentas por outras mais rpidas e a eliminao de operaes redundantes ou desnecessrias. No cdigo-alvo, dado como exemplo, diversas melhorias so possveis. Uma delas usar a instruo de deslocamento para substituir a multiplicao na segunda instruo (o que consome muito tempo de execuo). Outra usar um modo de endereamento mais poderoso, como o endereamento indexado para armazenar a matriz. Com essas duas otimizaes, nosso cdigo-alvo fica assim:

COMPILADORES
Prof. Anderson Favaro

OTIMIZADOR OTIMIZADOR DE DE CDIGO-ALVO CDIGO-ALVO

MOV R0, index SHL R0 MOV &a[R0], 6

;; valor de index R0 ;; dobra valor em R0 ;; constante 6 endereo a + R0

COMPILADORES
Prof. Anderson Favaro

GERNCIA GERNCIA DE DE TABELAS TABELAS


Este mdulo no constitui uma fase no sentido das anteriores, mas compreende um conjunto de tabelas e rotinas associadas que so utilizadas por quase todas as fases do tradutor. Algumas das tabelas usadas so fixas para cada linguagem, por exemplo, a tabela de palavras reservadas, tabelas de delimitadores, etc. Entretanto, a estrutura que possui importncia fundamental aquela que montada durante a anlise do programa fonte, com informaes sobre: declaraes de variveis; declaraes dos procedimentos ou subrotinas; parmetros de subrotinas; etc.

COMPILADORES
Prof. Anderson Favaro

GERNCIA GERNCIA DE DE TABELAS TABELAS


Essas informaes so armazenadas na Tabela de Smbolos (s vezes chamada de tabela de nomes ou lista de identificadores). A cada ocorrncia de um identificador no programa fonte, a tabela acessada, e o identificador procurado na tabela. Quando encontrado, as informaes associadas a ele so comparadas com as informaes obtidas no programa fonte, sendo que qualquer nova informao inserida na tabela.

COMPILADORES
Prof. Anderson Favaro

GERNCIA GERNCIA DE DE TABELAS TABELAS


Os dados a serem coletados e armazenados na tabela de smbolos dependem da linguagem, do projeto do tradutor, do programa objeto a ser gerado. Entretanto, os atributos mais comumentemente registrados so: - para variveis: classe (var), tipo, preciso, tamanho, endereo associado; - parmetros formais: classe (par), tipo, forma de passagem; - procedimentos/subrotinas: parmetros; classe (proc), nmero de

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

GERNCIA GERNCIA DE DE TABELAS TABELAS


Resumindo... Uma funo essencial de um compilador registrar os nomes de variveis usados no programa fonte e coletar informaes sobre os diversos atributos de cada nome. Esses atributos podem prover informaes sobre o espao de memria alocado para um nome, seu tipo, seu escopo, ou seja, onde seu valor pode ser usado no programa, e, no caso de nomes de procedimento, informaes sobre a quantidade e os tipos de seus argumentos, o tipo retomado e o mtodo de passagem de cada argumento, por exemplo, por valor ou por referncia. A tabela de smbolos uma estrutura de dados contendo um registro para cada nome de varivel, com campos para os atributos do nome. A estrutura de dados deve ser projetada para permitir que o

COMPILADORES
Prof. Anderson Favaro

ATENDIMENTO ATENDIMENTO A A ERROS ERROS


Este mdulo tem por objetivo "tratar os erros" que so detectados em todas as fases de anlise do programa fonte. Qualquer fase analtica deve prosseguir em sua anlise, ainda que erros tenham sido detectados. Isso pode ser realizado atravs de mecanismos de recuperao de erros, encarregados de re-sincronizar a fase com o ponto do texto em anlise. A perda desse sincronismo faria a anlise prosseguir de forma errada, propagando o efeito do erro. fundamental que o tradutor prossiga na traduo, aps a deteco de erros, de modo que o texto seja totalmente analisado.

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.

FERRAMENTAS FERRAMENTAS PARA PARA CONSTRUO CONSTRUO DE DE COMPILADOR COMPILADOR

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:

FERRAMENTAS FERRAMENTAS PARA PARA CONSTRUO CONSTRUO DE DE COMPILADOR COMPILADOR

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.

FERRAMENTAS FERRAMENTAS PARA PARA CONSTRUO CONSTRUO DE DE COMPILADOR COMPILADOR

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.

FERRAMENTAS FERRAMENTAS PARA PARA CONSTRUO CONSTRUO DE DE COMPILADOR 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.

PRINCIPAIS PRINCIPAIS ESTRUTURAS ESTRUTURAS DE DE DADOS DADOS EM EM UM UM COMPILADOR COMPILADOR

COMPILADORES
Prof. Anderson Favaro

PRINCIPAIS PRINCIPAIS ESTRUTURAS ESTRUTURAS DE DE DADOS DADOS EM EM UM UM COMPILADOR COMPILADOR


MARCAS Quando um sistema de varredura armazena caracteres em uma marca, ele, em geral, representa a marca simbolicamente, ou seja, como um valor de um tipo de dado enumerado que representa o conjunto de marcas da linguagem-fonte. Por vezes, tambm necessrio preservar a cadeia de caracteres ou outras informaes derivadas dela, como, por exemplo, o nome associado a uma marca identificadora ou o valor de uma marca numrica. Na maioria das linguagens, o sistema de varredura precisa apenas gerar uma marca por vez (isso chamado de verificao frente de smbolo nico). Nesse caso, uma nica varivel global pode ser usada para preservar a informao da marca.

COMPILADORES
Prof. Anderson Favaro

PRINCIPAIS PRINCIPAIS ESTRUTURAS ESTRUTURAS DE DE DADOS DADOS EM EM UM UM COMPILADOR COMPILADOR


A RVORE SINTTICA Se o analisador sinttico gera uma rvore sinttica, ela normalmente construda como uma estrutura padro baseada em ponteiros, que alocada dinamicamente medida que a anlise sinttica ocorre. A rvore toda pode ser armazenada como uma nica varivel que aponta para o n-raiz. Cada n na estrutura um registro cujos campos representam a informao coletada pelo analisador sinttico e, posteriormente, pelo analisador semntico.

COMPILADORES
Prof. Anderson Favaro

PRINCIPAIS PRINCIPAIS ESTRUTURAS ESTRUTURAS DE DE DADOS DADOS EM EM UM UM COMPILADOR COMPILADOR


Por exemplo, o tipo de dados de uma expresso pode ser um campo no n da rvore sinttica para aquela expresso. Por vezes, para economizar espao, esses campos so tambm alocados dinamicamente, ou ento armazenados em outras estruturas de dados, como a tabela de smbolos, que permitem a alocao e a liberao seletivas. Cada n da rvore sinttica pode requerer o armazenamento de diferentes atributos, dependendo do tipo de estrutura da linguagem representada (por exemplo, um n de expresso tem requisitos diferentes de um n de declarao). Nesse caso, cada n na rvore sinttica pode ser representado por um registro variante, com cada tipo de n

COMPILADORES
Prof. Anderson Favaro

PRINCIPAIS PRINCIPAIS ESTRUTURAS ESTRUTURAS DE DE DADOS DADOS EM EM UM UM COMPILADOR COMPILADOR


A TABELA DE SMBOLOS Essa estrutura de dados guarda informaes de identificadores: funes, variveis, constantes e tipos de dados. A tabela de smbolos interage com quase todas as fases do compilador: varredura, anlise sinttica e anlise semntica podem fornecer identificadores tabela;

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.

PRINCIPAIS PRINCIPAIS ESTRUTURAS ESTRUTURAS DE DE DADOS DADOS EM EM UM UM COMPILADOR COMPILADOR

COMPILADORES
Prof. Anderson Favaro

PRINCIPAIS PRINCIPAIS ESTRUTURAS ESTRUTURAS DE DE DADOS DADOS EM EM UM UM COMPILADOR COMPILADOR


A TABELA DE LITERAIS Insero eficiente e acesso rpido so tambm essenciais para a tabela de literais, que armazena constantes e cadeias de caracteres usados em um programa. Entretanto, uma tabela de literais no precisa permitir eliminaes, pois seus dados se aplicam globalmente ao programa, e uma constante ou cadeia de caracteres aparece apenas uma vez nessa tabela. A tabela de literais importante para reduzir o tamanho de um programa na memria, pois permite o reaproveitamento das constantes e das cadeias de caracteres. Ela tambm usada pelo gerador de cdigo para construir endereos simblicos para literais e para fornecer definies de dados ao arquivo de cdigo-fonte.

COMPILADORES
Prof. Anderson Favaro

PRINCIPAIS PRINCIPAIS ESTRUTURAS ESTRUTURAS DE DE DADOS DADOS EM EM UM UM COMPILADOR COMPILADOR


CDIGO INTERMEDIRIO Dependendo do tipo de cdigo intermedirio (por exemplo, cdigo de trs endereos e P-cdigo) e das otimizaes efetuadas, esse cdigo pode ser armazenado como uma matriz de cadeias de caracteres, um arquivo-texto temporrio ou uma lista ligada de estruturas. Nos compiladores com otimizaes complexas, dada ateno especial escolha de representaes que permitam reorganizao fcil.

COMPILADORES
Prof. Anderson Favaro

PRINCIPAIS PRINCIPAIS ESTRUTURAS ESTRUTURAS DE DE DADOS DADOS EM EM UM UM COMPILADOR COMPILADOR


ARQUIVOS TEMPORRIOS Antigamente, os computadores no possuam memria suficiente para que um programa inteiro fosse mantido na memria durante a compilao. Esse problema era resolvido com arquivos temporrios que preservavam os resultados dos passos intermedirios de traduo ou pela compilao "sob demanda", ou seja, pelo armazenamento apenas de informao das partes anteriores do programa-fonte que possibilitavam a continuao da traduo. Restries de memria so agora um problema muito menor, e possvel manter na memria uma unidade completa de compilao, especialmente se a linguagem contar com compilao separada. Ainda assim, os compiladores ocasionalmente consideram til

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

PRINCIPAIS PRINCIPAIS ESTRUTURAS ESTRUTURAS DE DE DADOS DADOS EM EM UM UM COMPILADOR COMPILADOR

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.

OUTROS OUTROS ASPECTOS ASPECTOS DA DA ESTRUTURA ESTRUTURA DE DE UM UM COMPILADOR COMPILADOR

COMPILADORES
Prof. Anderson Favaro

OUTROS OUTROS ASPECTOS ASPECTOS DA DA ESTRUTURA ESTRUTURA DE DE UM UM COMPILADOR COMPILADOR


ANLISE E SNTESE Segundo essa viso, as operaes do compilador que analisam o programa-fonte para computar suas propriedades so classificadas como anlise, enquanto as operaes que produzem cdigo traduzido so classificadas como sntese. Naturalmente, anlise lxica, anlise sinttica e anlise semntica fazem parte da anlise, enquanto a gerao de cdigo faz parte da sntese. Os passos de otimizao podem envolver tanto anlise como sntese. A anlise tende a ser mais matemtica e mais bem entendida, enquanto a sntese requer tcnicas mais especializadas.

COMPILADORES
Prof. Anderson Favaro

OUTROS OUTROS ASPECTOS ASPECTOS DA DA ESTRUTURA ESTRUTURA DE DE UM UM COMPILADOR COMPILADOR


FRENTE E FUNDO Segundo essa viso, o compilador separado em operaes que dependem somente da linguagem-fonte (a frente) e operaes que dependem somente da linguagem-alvo (o fundo). Isso similar diviso entre anlise e sntese: a varredura, a anlise sinttica e a anlise semntica fazem parte da frente, e a gerao de cdigo faz parte do fundo.

COMPILADORES
Prof. Anderson Favaro

OUTROS OUTROS ASPECTOS ASPECTOS DA DA ESTRUTURA ESTRUTURA DE DE UM UM COMPILADOR COMPILADOR


Entretanto, a anlise de otimizao pode ser dependente do alvo, e, portanto, parte do fundo, e a sntese de cdigo intermedirio freqentemente independente do alvo e, portanto, parte da frente. Teoricamente, o compilador seria dividido estritamente em duas partes, com a representao intermediria servindo como meio de comunicao entre elas:

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

OUTROS OUTROS ASPECTOS ASPECTOS DA DA ESTRUTURA ESTRUTURA DE DE UM UM COMPILADOR COMPILADOR

COMPILADORES
Prof. Anderson Favaro

OUTROS OUTROS ASPECTOS ASPECTOS DA DA ESTRUTURA ESTRUTURA DE DE UM UM COMPILADOR COMPILADOR


PASSADAS Para um compilador, freqentemente conveniente processar o programa-fonte diversas vezes antes de gerar o cdigo. Essas repeties recebem o nome de passadas. Aps a passada inicial, que constri uma rvore sinttica ou ento um cdigo intermedirio a partir da fonte, cada passada consiste em processar a representao intermediria, acrescentando informaes, alterando a estrutura ou produzindo uma representao diferente. Passadas podem ou no corresponder a fases - geralmente uma passada ser composta por diversas fases.

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;

OUTROS OUTROS ASPECTOS ASPECTOS DA DA ESTRUTURA ESTRUTURA DE DE UM UM COMPILADOR COMPILADOR

COMPILADORES
Prof. Anderson Favaro

OUTROS OUTROS ASPECTOS ASPECTOS DA DA ESTRUTURA ESTRUTURA DE DE UM UM COMPILADOR COMPILADOR


Uma organizao tpica uma passada para varredura e anlise sinttica, uma passada para a anlise semntica e otimizao de fonte, e uma terceira passada para a gerao de cdigo e otimizao de alvo. Compiladores com otimizao pesada podem usar ainda mais passadas: cinco, seis ou at mesmo oito passadas.

COMPILADORES
Prof. Anderson Favaro

OUTROS OUTROS ASPECTOS ASPECTOS DA DA ESTRUTURA ESTRUTURA DE DE UM UM COMPILADOR COMPILADOR


DEFINIO DE LINGUAGEM E COMPILADORES Observamos que as estruturas lxica e sinttica de uma linguagem de programao so usualmente especificadas formalmente e utilizam expresses regulares e gramticas livres de contexto. A semntica de uma linguagem de programao, entretanto, ainda comumente especificada em ingls (ou outra linguagem natural). Tais especificaes (juntamente com a estrutura formal lxica e sinttica) so usualmente agrupadas em um manual de referncia da linguagem, ou definio da linguagem. Para linguagens novas, a definio e o compilador so freqentemente desenvolvidos simultaneamente, pois as tcnicas disponveis para o compilador podem ter grande impacto na

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.

OUTROS OUTROS ASPECTOS ASPECTOS DA DA ESTRUTURA ESTRUTURA DE DE UM UM COMPILADOR COMPILADOR

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.

OUTROS OUTROS ASPECTOS ASPECTOS DA DA ESTRUTURA ESTRUTURA DE DE UM UM COMPILADOR COMPILADOR

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:

OUTROS OUTROS ASPECTOS ASPECTOS DA DA ESTRUTURA ESTRUTURA DE DE UM UM COMPILADOR COMPILADOR

COMPILADORES
Prof. Anderson Favaro

OUTROS OUTROS ASPECTOS ASPECTOS DA DA ESTRUTURA ESTRUTURA DE DE UM UM COMPILADOR COMPILADOR


Primeiro, o Fortran77, sem ponteiros ou alocao dinmica e sem ativaes recursivas de funes, possibilita um ambiente de execuo completamente esttico, no qual a alocao de memria efetuada antes da execuo. Isso torna a tarefa de alocao particularmente fcil para quem escreve o compilador, pois no existe a necessidade de gerar cdigo para manter o ambiente. Segundo, Pascal, C e outras linguagens similares Algol possibilitam uma forma limitada de alocao dinmica e ativaes recursivas de funes e requerem um ambiente de execuo "semidinmico", baseado em pilhas com uma estrutura dinmica adicional denominada heap, de onde o programador pode escalonar a alocao dinmica.

COMPILADORES
Prof. Anderson Favaro

OUTROS OUTROS ASPECTOS ASPECTOS DA DA ESTRUTURA ESTRUTURA DE DE UM UM COMPILADOR COMPILADOR

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

OUTROS OUTROS ASPECTOS ASPECTOS DA DA ESTRUTURA ESTRUTURA DE DE UM UM COMPILADOR COMPILADOR


OPES E INTERFACES DE UM COMPILADOR Um aspecto importante da construo de compiladores a incluso de mecanismos para a interface com o sistema operacional e para fornecer opes ao usurio. Exemplos de mecanismos de interface so recursos de entrada e sada e acesso ao sistema de arquivos da mquina-alvo. Exemplos de opes para o usurio so a especificao de caractersticas de listagens (comprimento, mensagens de erros, tabelas de referncias cruzadas) e opes de otimizao de cdigo (desempenho de certas otimizaes). Interface e opes so denominadas coletivamente como a pragmtica do compilador.

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.

OUTROS OUTROS ASPECTOS ASPECTOS DA DA ESTRUTURA ESTRUTURA DE DE UM UM COMPILADOR COMPILADOR

COMPILADORES
Prof. Anderson Favaro

OUTROS OUTROS ASPECTOS ASPECTOS DA DA ESTRUTURA ESTRUTURA DE DE UM UM COMPILADOR COMPILADOR


TRATAMENTO DE ERROS Uma das funes mais importantes de um compilador sua resposta a erros no programa-fonte. Erros podem ser detectados durante quase todas as fases de compilao. Esses erros estticos (ou em tempo de compilao) devem ser reportados por um compilador, e importante que ele possa gerar mensagens de erro inteligveis e concluir a compilao aps cada erro. Cada fase de um compilador requer um tratamento de erros ligeiramente diferente, e assim um sistema para tratamento de erros necessita de diferentes operaes, cada uma apropriada para uma fase e situao especficas.

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.

OUTROS OUTROS ASPECTOS ASPECTOS DA DA ESTRUTURA ESTRUTURA DE DE UM UM COMPILADOR COMPILADOR

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.

OUTROS OUTROS ASPECTOS ASPECTOS DA DA ESTRUTURA ESTRUTURA DE DE UM UM COMPILADOR COMPILADOR

You might also like