• Like
Artigo Sobre Compiladores
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

Artigo Sobre Compiladores

  • 882 views
Published

Este artigo tem a finalidade de apresentar o processo de geração de código intermediário e otimização em compiladores, sendo necessário para tanto, mostrar de que forma os mesmos funcionam.

Este artigo tem a finalidade de apresentar o processo de geração de código intermediário e otimização em compiladores, sendo necessário para tanto, mostrar de que forma os mesmos funcionam.

Published in Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
882
On SlideShare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
31
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. COMPILADORES: Geração de Código Intermediário Elias Paulino Augusto¹ Lidiane Marcelino de Carvalho² Phillipe Gandini Baldim³ Rafaela Zanin Ferreira4 RESUMO Este artigo tem a finalidade de apresentar o processo de geração de códigointermediário e otimização em compiladores, sendo necessário para tanto, mostrar de queforma os mesmos funcionam.Segundo Price (2001), a geração de código intermediário é a transformação da árvore dederivação em um segmento de código. Esse código pode, eventualmente, ser o códigoobjeto final, mas na maioria das vezes, constitui-se num código intermediário, pois atradução de código fonte para objeto em mais de um passo apresenta algumas vantagens.Palavras-chave: Compilador. Linguagem de Programação. Código Intermediário.1 INTRODUÇÃO Este projeto tem como intuito de nos proporcionar a experiência de construção deuma pesquisa, com um tema em uma área da computação que esteja cursando no semestreatual. Nos proporcionando assim a análise e a compreensão do tema da matéria escolhida,no caso da nossa equipe a matéria escolhida foi a de Compiladores, tendo como temaGeração de Código Intermediário. Um tradutor é um programa que recebe como dado de entrada um programa escritoem uma linguagem de programação (a linguagem fonte) e produz como saída de seuprocessamento um programa escrito em outra linguagem (a linguagem objeto). Se alinguagem fonte é uma linguagem de alto nível como Fortran, Pascal ou C, e a linguagem1Elias Paulino Augusto, aluno do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012. E-mail: elias_sgs@hotmail.com2 Lidiane Marcelino de Carvalho, aluna do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de2012. E-mail: lidianenep@hotmail.com3 Phillipe Gandini Baldim, aluno do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012.E-mail: phillipe_baldim@hotmail.com4 Rafaela Zanin Ferreira, aluna do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012. E-mail: rafa_zf@hotmail.com
  • 2. objeto é uma linguagem de baixo nível como a linguagem de montagem (assembly) ou demáquina o tradutor é chamado de compilador.O Compilador é um programa que lê um código escrito em uma linguagem fonte, e o traduzem um programa equivalente numa outra linguagem, a objeto; e são ferramentasindispensáveis para programação.Hoje, mais de 50 anos depois dessa concepção que originou o desenvolvimento decompiladores, a situação ainda está longe de ser ideal. Há uma grande diversidade delinguagens de programação e ainda há especialistas numa ou noutra linguagem. Mas,certamente, sem compiladores o desenvolvimento da programação estaria num estágio maisprimitivo do que o atual. O Compilador traz um código fonte escrito numa linguagem dealto nível, em um código semanticamente equivalente, escrito em código de máquina.Assim esse código alvo será enfim lido pela máquina e executado, como pode ser visto nafigura 01.Figura 01 – Estrutura de um CompiladorFonte: (http://campeche.inf.furb.br/tccs/2002-I/2002-1paulohenriquedasilvavf.pdf)A geração de código intermediário é a transformação da árvore de derivação em um seg-mento de código. Esse código pode, eventualmente, ser o código objeto final, mas, na mai-oria das vezes, constitui-se num código intermediário.2 ESTRUTURA DE UM COMPILADOR Como dito anteriormente, um compilador recebe como entrada um programa fonte eproduz como saída um programa objeto na forma de um conjunto de instruções emlinguagem de máquina. Esse processo é tão complexo que não é razoável, do ponto de vistalógico e de implementação, considerá-lo como sendo desenvolvido em um único passo. Poressa razão, costuma-se repartir o processo de compilação em uma série de sub-processoschamados fases, como podemos ver na figura 02.1Elias Paulino Augusto, aluno do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012. E-mail: elias_sgs@hotmail.com2 Lidiane Marcelino de Carvalho, aluna do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de2012. E-mail: lidianenep@hotmail.com3 Phillipe Gandini Baldim, aluno do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012.E-mail: phillipe_baldim@hotmail.com4 Rafaela Zanin Ferreira, aluna do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012. E-mail: rafa_zf@hotmail.com
  • 3. Figura 02 – Estrutura de um compiladorFonte: (http://www.facom.ufms.br/~ricardo/Courses/CompilerI-2009/Lectures/CompilersI_Lec01_Intro.pdf) Uma fase é uma operação que toma como entrada uma representação do programafonte e produz como saída uma outra representação.Um compilador pode ser dividido em dois componentes principais a análise e síntese. Aanálise (front-end) recebe o programa fonte, verifica as partes desse programa e impõe umaestrutura gramatical sobre elas.A síntese (back-end) recebe uma representação intermediária do programa e constrói oprograma para a máquina alvo.1Elias Paulino Augusto, aluno do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012. E-mail: elias_sgs@hotmail.com2 Lidiane Marcelino de Carvalho, aluna do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de2012. E-mail: lidianenep@hotmail.com3 Phillipe Gandini Baldim, aluno do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012.E-mail: phillipe_baldim@hotmail.com4 Rafaela Zanin Ferreira, aluna do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012. E-mail: rafa_zf@hotmail.com
  • 4. O processo de compilação opera em uma sequência de fases, onde em cada fase arepresentação do programa é modificada. Porém, as fases de um compilador não sãonecessariamente em sequências e ainda algumas fases podem não existir.2.1 Geração de Código Intermediário Certos tipos de tradutores transformam uma linguagem de programação em umalinguagem simplificada, chamada de código intermediário, que pode ser diretamenteexecutado por um programa chamado interpretador. Nós podemos imaginar o códigointermediário como uma linguagem de máquina de um computador abstrato projetado paraexecutar o código fonte. Por exemplo, o Basic, Prolog e Java, são frequentementeinterpretadas. Na fase de geração de código intermediário, ocorre a transformação da árvoresintática em uma representação intermediária do código fonte. Esta linguagemintermediária é mais próxima da linguagem objeto do que o código fonte, mas aindapermite uma manipulação mais fácil do que se código Assembly ou código de máquinafosse utilizado. A geração de código intermediário pode estar estruturalmente distribuída nas fasesanteriores (análise sintática e semântica) ou mesmo não existir (tradução direta para códigoobjeto), no caso de tradutores bem simples. No modelo de análise e síntese de um compilador, os módulos da vanguardatraduzem o programa-fonte numa representação intermediária, a partir da qual os módulosda retaguarda geram códigos-alvo. Apesar de se poder traduzir o programa-fontediretamente na linguagem alvo. Alguns dos benefícios em se usar forma intermediáriaindependente da máquina são: 1 – possibilita a otimização do código intermediário, de modo a obter-se o códigoobjeto final mais eficiente; 2 – simplifica a implementação do compilador, resolvendo, gradativamente, asdificuldades da passagem de código fonte para objeto (alto-nível para baixo nível), já que o1Elias Paulino Augusto, aluno do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012. E-mail: elias_sgs@hotmail.com2 Lidiane Marcelino de Carvalho, aluna do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de2012. E-mail: lidianenep@hotmail.com3 Phillipe Gandini Baldim, aluno do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012.E-mail: phillipe_baldim@hotmail.com4 Rafaela Zanin Ferreira, aluna do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012. E-mail: rafa_zf@hotmail.com
  • 5. código fonte pode ser visto como um texto condensado que “explode” em inúmerasinstruções elementares de baixo nível; 3 – possibilita a tradução de código intermediário para diversas máquinas. A desvantagem de gerar código intermediário é que o compilador requer um passo amais. A tradução direta do código fonte para o objeto leva a uma compilação mais rápida. A grande diferença entre código intermediário e o código objeto final é que ointermediário não especifica detalhes da máquina alvo, tais como quais registradores serãousados, quais endereços de memória serão referenciados, etc.2.1.2 Linguagens Intermediárias Price (2001) apresenta três categorias, nos quais os vários tipos de códigointermediários se encaixam: 1 – representações gráficas: árvore e grafo sintaxe; 2 – notação pós-fixada ou pré-fixada 3- código de três endereços: quádruplas e triplas. Uma árvore sintática mostra a estrutura hierárquica de um programa fonte, é oprocesso de determinar se uma cadeia de símbolos léxicos pode ser gerada por umagramática. Os três símbolos representando A + B poderiam ser agrupados em uma estruturasintática chamada de expressão; expressões poderiam ser posteriormente agrupadas paraformar comandos, e assim por diante. Já a notação pós-fixa é uma representação linearizada de uma árvore sintática; éuma lista dos nós da árvore na qual um nó aparece imediatamente após seus filhos. Sendo anotação pós-fixa para a árvore sintática a b c uminus * b c uminus * + assign. O atrativo da notação pós-fixa é que ela dispensa o uso de parênteses ao adotar anoção de pilha das expressões. Assim, quando um operador binário aparece na sequêncianessa representação, ele é aplicado aos dois últimos elementos e o resultado de suaaplicação está disponível como um novo elemento. Há algumas calculadoras eletrônicasque adotam esse formato para sua operação.1Elias Paulino Augusto, aluno do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012. E-mail: elias_sgs@hotmail.com2 Lidiane Marcelino de Carvalho, aluna do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de2012. E-mail: lidianenep@hotmail.com3 Phillipe Gandini Baldim, aluno do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012.E-mail: phillipe_baldim@hotmail.com4 Rafaela Zanin Ferreira, aluna do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012. E-mail: rafa_zf@hotmail.com
  • 6. O código de três endereços é composto por uma sequência de instruções envolvendooperações binárias ou unárias e uma atribuição. O nome "três endereços" está associado aespecificação, em uma instrução, tendo máximo três variáveis: duas para os operadoresbinários e uma para o resultado, na figura 03, abaixo pode ser visto a sua representação. Figura 03 – Representação em triplas Fonte: (Silva, 2001, p.40.) Assim, expressões envolvendo diversas operações são decompostas nesse códigoem uma série de instruções, eventualmente com a utilização eventualmente com autilização de variáveis temporárias introduzidas na tradução. Dessa forma, obtém-se umcódigo mais próximo da estrutura da linguagem assembly e, consequentemente, de maisfácil conversão para a linguagem-alvo. No exemplo abaixo A, B e C representam endereços de variáveis, op representaoperador (binário ou unário), oprel representa operador relacional, e L representa o rótulode uma instrução intermediária.A:= B op C; A:= op B; A:= B; Goto L; If A oprel B goto L O comando de atribuição a := x + y * z traduzido para o código de três endereços éo apresentado no exemplo abaixo, onde T1 e T2 são variáveis temporárias.T1 ;= Y * Z; T2 := X + T1; A := T22.1.3 Tipos de Enunciados de Três Endereços Os enunciados de três endereços são semelhantes ao código de montagem. Osenunciados podem ter rótulos simbólicos e existem enunciados para o fluxo de controle.Um rótulo simbólico representa o índice de um enunciado de três endereços num array que1Elias Paulino Augusto, aluno do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012. E-mail: elias_sgs@hotmail.com2 Lidiane Marcelino de Carvalho, aluna do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de2012. E-mail: lidianenep@hotmail.com3 Phillipe Gandini Baldim, aluno do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012.E-mail: phillipe_baldim@hotmail.com4 Rafaela Zanin Ferreira, aluna do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012. E-mail: rafa_zf@hotmail.com
  • 7. abriga o código intermediário. Os índices efetivos podem substituir os rótulos, querrealizando-se uma passagem separada, que utilizando-se a “retrocorreção”.O código de três endereços é composto por uma sequência de instruções envolvendooperações binárias ou unárias e uma atribuição. O nome “três endereços” está associado àespecificação, em uma instrução, de no máximo três variáveis: duas para os operadoresbinários e uma para o resultado. Assim, expressões envolvendo diversas operações sãodecompostas nesse código em uma série de instruções, eventualmente com a utilização devariáveis temporárias introduzidas na tradução. Dessa forma, obtêm-se um código maispróximo da estrutura Assembly e, consequentemente, de mais fácil conversão para alinguagem-alvo.2.1.4 Retrocorreção Segundo Aho (1995), a forma mais fácil de implementar as definições dirigidas pelasintaxe é usar duas passagens. Primeiro constrói-se uma árvore sintática para a entrada e,em seguida, caminha-se na árvore numa ordem de busca em profundidade, computando astraduções dadas na definição. O principal problema de se gerar código para expressõesboolenas e para o fluxo de controle numa única passagem está em que, durante a mesma,não se pode conhecer os rótulos para onde o controle deve ir, no tempo em que osenunciados de desvio são gerados. Pode-se solucionar esse problema pela geração de umasérie de enunciados de ramificação, com os alvos dos desvios deixados temporariamentenão especificados. Cada enunciado será colocado numa lista de enunciados de desvio cujosrótulos serão preenchidos quando o rótulo apropriado puder ser determinado. Aho (1995)define esse preenchimento subsequente de rótulos de retrocorreção, do inglês backpatching.2.1.5 Otimização do Código A etapa final na geração de código pelo compilador é a fase de otimização, a fase deotimização tenta melhorar o código intermediário, de forma que venha resultar um código1Elias Paulino Augusto, aluno do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012. E-mail: elias_sgs@hotmail.com2 Lidiane Marcelino de Carvalho, aluna do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de2012. E-mail: lidianenep@hotmail.com3 Phillipe Gandini Baldim, aluno do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012.E-mail: phillipe_baldim@hotmail.com4 Rafaela Zanin Ferreira, aluna do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012. E-mail: rafa_zf@hotmail.com
  • 8. de máquina mais rápido em tempo de execução. Existem otimizações das mais básicas atéas mais complexas.O objetivo da etapa de otimização de código é aplicar um conjunto de técnicas para detectartais sequências e substituí-las por outras que removam as situações de ineficiência. Como o código gerado através da tradução orientada a sintaxe contempla expressõesindependentes, diversas situações contendo sequências de código ineficiente podemocorrer.As técnicas de otimização que são usadas em compiladores devem, além de manter osignificado do programa original, ser capazes de capturar a maior parte das possibilidadesde melhoria do código dentro de limites razoáveis de esforço gasto para tal fim. Em geral,os compiladores usualmente permitem especificar qual o grau de esforço desejado noprocesso de otimização. As técnicas de otimização podem ser classificadas como independentes de máquina,quando podem ser aplicadas antes da geração do código na linguagem Assembly, oudependentes de máquina, quando aplicadas na geração do código Assembly.A otimização independente de máquina tem como requisito o levantamento dos blocos decomandos que compõem o programa. Essa etapa da otimização é conhecida como a análisede fluxo, que por sua vez contempla a análise de fluxo de controle e a análise de fluxo dedados. Estratégias que podem ser aplicadas analisando um único bloco de comandos sãodenominadas estratégias de otimização local, enquanto aquelas que envolvem a análisesimultânea de dois ou mais blocos são denominadas estratégias de otimização global.3 CONCLUSÃO Portanto, com a análise e compreensão do tema abordado chegamos ao final delecom a capacidade de identificar e formular as melhores soluções para os problemasencontrados, bem como o desenvolvimento da capacidade de trabalhar em equipe.Além disso, a realização dessa pesquisa acadêmica nos auxilia posteriormente naelaboração do nosso trabalho de conclusão de curso - TCC.1Elias Paulino Augusto, aluno do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012. E-mail: elias_sgs@hotmail.com2 Lidiane Marcelino de Carvalho, aluna do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de2012. E-mail: lidianenep@hotmail.com3 Phillipe Gandini Baldim, aluno do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012.E-mail: phillipe_baldim@hotmail.com4 Rafaela Zanin Ferreira, aluna do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012. E-mail: rafa_zf@hotmail.com
  • 9. No entanto, existem, portanto muitas e variadas otimizações que podem ser utilizadas, e oseu devido conhecimento e compreensão permitem ao programador produzir um códigomais eficiente. Principalmente, assim deve-se ter a noção do impacto da otimização nocódigo, o uso errado de otimizações pode resultar numa degradação de performance. COMPULERS: Intermediate Code Generation ABSTRACT This article aims to present the process of generating intermediate code in compilersand optimization, it is necessary to do so, show how they work. According to Price (2001), intermediate code generation is the transformation treebranch in a code segment. This code may eventually be the final object code, but most ofthe time, constitutes a intermediate code, for the translation of source code to object onmore than one step has some advantages. Keywords: Compiler. Programming Language. Intermediate Code.4 REFERÊNCIASAHO, V Alfred, Ravi Sethi, and J. D. Ullman. Compiladores: Princípios, Técnicas eFerramentas. Rio de Janeiro, 1995. Editora Guanabara Koogan.FAVARO, Anderson. Compiladores – Gerador de código Intermediário, 2010.Disponível em: <http://www.slideshare.net/favaro/cfakepathcompiladores-aula06> Acesso29 Agosto 2012.LEHRER, Cristiano. Geração de Código Intermediário. Disponível em:<http://www.ybadoo.com.br/ead/cmp/06/CMP_slides.pdf> Acesso 29 Agosto 2012.PALAZZO, Luiz A M. Introdução á Compilação. Pelotas, 2001. Disponível em :<http://ia.ucpel.tche.br/~lpalazzo/Aulas/LFA/LFA-T06.htm> Acesso 29 Agosto 2012.1Elias Paulino Augusto, aluno do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012. E-mail: elias_sgs@hotmail.com2 Lidiane Marcelino de Carvalho, aluna do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de2012. E-mail: lidianenep@hotmail.com3 Phillipe Gandini Baldim, aluno do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012.E-mail: phillipe_baldim@hotmail.com4 Rafaela Zanin Ferreira, aluna do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012. E-mail: rafa_zf@hotmail.com
  • 10. PETER. Introdução Compiladores. 2005.Disponível em:<http://www.dsc.ufcg.edu.br/~peter/cursos/cc/material/p1-introducao-2p.pdf> Acesso 29Agosto 2012.RICARTE, Ivan. Introdução à Compilação. 2008, Elsevier Editora LTDA.RICARTE, M. L. Ivan. Otimização de Código. 2003. Disponível em:<http://www.dca.fee.unicamp.br/cursos/EA876/apostila/HTML/node76.html> Acesso 10Outubro 2012.SANTOS, Ricardo. Compiladores I. Disponível em:<http://www.facom.ufms.br/~ricardo/Courses/CompilerI-2009/Lectures/CompilersI_Lec01_Intro.pdf> 2009. Acesso em 10 de Outubro de 2012.SILVA, Paulo Henrique. Implementação de Unidades Para Processos Concorrentes noAmbiente Furbol. Blumenau, 2002. Disponível em:<http://campeche.inf.furb.br/tccs/2002-I/2002-1paulohenriquedasilvavf.pdf> Acesso 29Agosto 2012.1Elias Paulino Augusto, aluno do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012. E-mail: elias_sgs@hotmail.com2 Lidiane Marcelino de Carvalho, aluna do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de2012. E-mail: lidianenep@hotmail.com3 Phillipe Gandini Baldim, aluno do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012.E-mail: phillipe_baldim@hotmail.com4 Rafaela Zanin Ferreira, aluna do 6º período de Ciência da Computação do Centro Universitário do Sul de Minas. Setembro de 2012. E-mail: rafa_zf@hotmail.com