• Nenhum resultado encontrado

OGNU Compilers Collection-GCC [Sta00] ´e um projecto que visa, n˜ao a constru¸c˜ao de ferramentas para desenvolvimento de compiladores, mas a constru¸c˜ao dos pr´oprios com- piladores. Trata-se de um projecto, que tem a sigla daFree Software Foundation(FSF), que visa a constru¸c˜ao de compiladores para v´arias linguagens e arquitecturas de computa¸c˜ao, reaproveitando e partilhando as solu¸c˜oes entre si.

Em termos mais concretos, isto significa que para l´a das tarefas de front-end que s˜ao dependentes dalinguagem fonte(an´alise l´exica, sint´actica e semˆantica), e das tarefas deback- endque s˜ao dependentes da arquitectura de computa¸c˜ao (selec¸c˜ao de instru¸c˜oes, atribui¸c˜ao de registos e gera¸c˜ao de c´odigo assembly/bin´ario), tudo o resto ´e comum aos v´arios compiladores, nomeadamente a arquitectura e as muitas rotinas cuja a implementa¸c˜ao n˜ao depende nem da linguagem fonte, nem da arquitectura de computa¸c˜ao.

Apesar de ser um compilador, ou melhor dizendo v´arios compiladores, o GCC n˜ao deve ser menosprezado como solu¸c˜ao para desenvolvimento de novos compiladores. At´e porque existe uma comunidade bastante grande e activa que o utiliza neste sentido e s˜ao v´arios os motivos para que tal aconte¸ca, a saber:

• S˜ao muitas e diversificadas as rotinas (de an´alise e optimiza¸c˜ao) que j´a se encontram implementadas, de tal forma que o GCC ´e um dos mais eficientes compiladores que actualmente existe;

• Como h´a uma grande comunidade de utilizadores, que faz uso do GCC para desenvolver compiladores, ´e f´acil obter suporte e ter com quem trocar experiˆencias;

• O GCC comporta alguns mecanismos que visam facilitar a sua adapta¸c˜ao a novas arquitecturas de computa¸c˜ao;

2.5. GNU Compiler Collection 19

como ´e o caso do C/C++, Objective-C, Java, Fortran e Ada. Mas existem front-ends n˜ao oficiais para outras linguagens, como ´e o caso do PASCAL, Mercury e do COBOL; • S˜ao v´arios os back-ends j´a desenvolvidos para o GCC, que permitem gerar c´odigo para v´arias fam´ılias de processadores (Pentium, Alfa, MIPS, HPPA, PowerPc, Sparc, etc), incluindo arquitecturas DSP e arquitecturas de 64 bits;

• O GCC ´e tamb´em perfeitamente funcional comocross-compiler, isto ´e, tem a capacidade de gerar c´odigo para outras arquitecturas que n˜ao aquela em que est´a instalado. O que permite, por exemplo, compilar programas para sistemas integrados (embedded systems), nos quais nem sempre ´e poss´ıvel executar um compilador;

• Existem vers˜oes do GCC para muitas plataformas (Windows, Linux, Solaris, Ultrix, Irix, HPUX, etc);

• E finalmente, mas de forma alguma menos importante, o GCC ´e distribu´ıdo sob aGNU General Public License (GGPL), que de forma resumida se pode traduzir como sendo software livre.

No que diz respeito a este doutoramento, o GCC ´e ainda mais importante. N˜ao ´e a primeira solu¸c˜ao que introduz o conceito demedium-level, isto ´e, da utiliza¸c˜ao de uma camada que separa o front-end do back-end, que cont´em todas as tarefas que s˜ao independentes da linguagem fonte e da arquitectura de computa¸c˜ao, mas ´e o descendente que maior sucesso tem do sistema que introduziu este conceito, oPeephole Optimizer - PO [FD80].

A introdu¸c˜ao do medium-level ´e fundamental para garantir a reutiliza¸c˜ao das rotinas de c´odigo, sem que para tal seja necess´ario efectuar qualquer tipo de altera¸c˜ao. O que no entanto requer que, a este n´ıvel, seja utilizado uma representa¸c˜ao de c´odigo comum aos v´arios compiladores, a que se designa genericamente por RIC. A estrutura de um compilador do tipo GCC, que inclui o medium-level, encontra-se representada na Figura 2.1.

Figura 2.1: Estrutura dos compiladores GCC.

O modelo de RIC utilizado pelo GCC tem a sua origem na Register Transfer List (RTL), que foi introduzida pelo PO. Mais do que um simples modelo, a RTL introduz um conjunto de princ´ıpios que visam garantir a portabilidade das rotinas de compila¸c˜ao, a saber:

• ´E uma representa¸c˜ao pr´oxima doc´odigo final(assembly), mas independente de qualquer arquitectura de computa¸c˜ao;

• Faz uso apenas dos principais modos de endere¸camento e cont´em apenas operadores gen´ericos, que podem ser facilmente “mapeados” para qualquer tipo de microprocessa- dor;

• Abstrai-se de todas as restri¸c˜oes de hardware;

• Considera que as opera¸c˜oes s˜ao executadas, tanto quanto poss´ıvel, sobre pseudo-registos (conceito abstracto de registo sem qualquer tipo de restri¸c˜ao).

A introdu¸c˜ao dos conceitos de medium-level e de RIC, reestruturaram o modelo de compila¸c˜ao at´e a´ı existente, permitindo por exemplo fazer uma utiliza¸c˜ao mais intensiva do conceito de biblioteca. De notar, que mesmo uma rotina cuja implementa¸c˜ao n˜ao dependa das caracter´ısticas da linguagem fonte ou da arquitectura de computa¸c˜ao, ao ser implementada no front-end /back-end pode ficar comprometida com essas caracter´ısticas, colocando s´erias entraves `a sua reutiliza¸c˜ao.

Na realidade o GCC s´o n˜ao pode ser visto como uma grande biblioteca, porque n˜ao existe uma separa¸c˜ao clara de tarefas, o que dificulta claramente a reutiliza¸c˜ao individual das rotinas. Esta forma intrincada de desenvolvimento, que ´e propositada, foi uma das solu¸c˜oes encontradas para evitar a “transferˆencia” de tecnologia para fins que n˜ao visem o desenvolvimento de software livre. Pretenderam assim promover o desenvolvimento do GCC dentro do pr´oprio projecto que ´e o GCC. ´E de relembrar, que o GCC n˜ao s´o ´e open- source, como ´e software livre, permitindo inclusive aos utilizadores alter´a-lo para os fins que entenderem (desde que respeitem as condi¸c˜oes definidas na GNU General Public License).

N˜ao fosse este indesej´avel detalhe, de possuir uma estrutura intrincada, nomeadamente para quem apenas pretende utilizar o GCC para fins de investiga¸c˜ao, e este funcionaria certamente como uma excelente biblioteca para o desenvolvimento de compiladores. O mais certo seria mesmo evoluir para uma solu¸c˜ao do tipo framework, como a que foi utilizada na prepara¸c˜ao desta disserta¸c˜ao.

Apesar de n˜ao ser propriamente uma solu¸c˜ao para desenvolvimento de compilado- res, o GCC ´e uma referˆencia obrigat´oria para este doutoramento, dado que: ´e utilizado na constru¸c˜ao de compiladores por uma comunidade bastante significativa; ´e uma ferramenta consistente com uma forte componente de optimiza¸c˜ao; possui um vasto conjunto de tarefas j´a implementadas; e que faz uso de um modelo de compila¸c˜ao muito semelhante ao que ´e utilizado pelas solu¸c˜oes proposta nesta disserta¸c˜ao.

Conv´em apenas acrescentar que s˜ao muitos os programadores, incluindo aqueles que constroem compiladores, que utilizam no seu dia a dia o GCC como compilador.

H´a tamb´em que fazer justi¸ca ao contributo do PO, pelos conceitos que introduziu, que s˜ao hoje em dia utilizados na maioria dos modelos de RIC e que est˜ao na base do trabalho apresentado nesta disserta¸c˜ao, mas tamb´em em outros trabalhos bem mais sonantes, como o Zephyr (Sec¸c˜ao 2.6) ou oRTL System (Sec¸c˜ao 2.7).