• Nenhum resultado encontrado

4.2 Modelos de RIC: Estado da arte

4.2.5 Stanford University Intermediate Format

Uma das referˆencias mais importantes em termos de modelos de RIC, ´e oStanford Uni- versity Intermediate Format(SUIF), que se encontra tamb´em implementado atrav´es de uma linguagem orientada por objectos, neste caso C++, e ´e utilizado num dos mais conhecidos sistemas para constru¸c˜ao de compiladores, o SUIF Compiler System(ver Sec¸c˜ao 2.8).

O SUIF tem um conjunto de caracter´ısticas muito pr´oprias. Mas talvez a mais relevante advenha do facto de ser composta por conjunto de elementos organizados segundo uma estrutura em ´arvore (com algumas raras ocorrˆencias de referˆencias cruzadas), que faz uso de elementos com diferentes n´ıveis de abstrac¸c˜ao. Por exemplo, tem a capacidade de representar explicitamente estruturas condicionais e estruturas c´ıclicas, e em simultˆaneo (num n´ıvel de abstrac¸c˜ao inferior) construtores do tipo salto condicional.

´

E interessante observar que a RIC acaba por se assemelhar muito a uma ´arvore de sintaxe (que n˜ao obedece a uma sintaxe fixa), mas com n´ıveis extra de detalhe. Esta solu¸c˜ao, que `a primeira vista poder´a parecer banal, ´e na realidade muito relevante, isto porque a “sintaxe” utilizada ´e independente da linguagem fonte, ou seja, ´e gen´erica.

Esta ideia ´e extremamente interessante e ´e em parte antag´onica `a do RTL original. Este ´ultimo visava estar t˜ao pr´oximo quanto poss´ıvel da linguagem final, para assim facilitar o “mapeamento” em instru¸c˜oes assembly/c´odigo m´aquina. O SUIF posiciona-se no outro extremo, isto ´e, perto da linguagem fonte. O que resulta numa RIC semanticamente mais rica, que ´e mais adequada `a implementa¸c˜ao de rotinas de an´alise e de optimiza¸c˜ao de alto n´ıvel (que ´e um dos objectivos principais do SUIF System). A compara¸c˜ao entre estas duas solu¸c˜oes serve tamb´em para constatar que h´a uma certa tendˆencia para subir o n´ıvel de abstrac¸c˜ao dos modelos de RIC.

´

E de real¸car que, pelo facto da RIC se assemelhar a uma ´arvore de sintaxe, cada nodo interm´edio pode ser visto como um n´ıvel diferente de abstrac¸c˜ao. Este conceito de n´ıvel de abstrac¸c˜ao ´e no entanto bastante redutor. Isto porque a abstrac¸c˜ao ´e muito localizada e de forma alguma abrange todos os elementos do mesmo tipo. Por exemplo, apesar de ser

poss´ıvel aceder a um objecto que represente um procedimento (ProcedureDefinition), n˜ao h´a um n´ıvel de abstrac¸c˜ao que permita de forma conjunta ter uma perspectiva de todos os procedimentos do programa, nem mesmo acedendo ao elemento ascendente, que corresponde a ScopedObject.

No entanto, o SUIF consegue disponibilizar, no verdadeiro sentido do termo, alguns n´ıveis de abstrac¸c˜ao, fazendo para tal uso de iteradores1. Incluindo n´ıveis que n˜ao fazem directamente parte da RIC. Por exemplo, existe um iterador que permite aceder `as labels dos blocos de c´odigo, permitindo assim ter uma perspectiva da RIC ao n´ıvel do GFC. H´a ainda um iterador que permite percorrer as ´arvores de express˜oes (devolve a raiz de cada ´arvore), e outro que permite aceder `as referˆencias das vari´aveis que ocorrem na RIC.

O SUIF ´e tamb´em bastante flexibilidade. N˜ao s´o permite criar novos elementos deri- vando as classes j´a existentes, `a semelhan¸ca do que acontece no RLTS, como disponibiliza uma solu¸c˜ao que visa facilitar esta opera¸c˜ao. A qual ´e composta por uma linguagem de especifica¸c˜ao, designada por hoof, e por uma ferramenta de gera¸c˜ao, designada por Smgn, atrav´es da qual ´e poss´ıvel obter todo o c´odigo necess´ario `a implementa¸c˜ao e utiliza¸c˜ao dos elementos especificados atrav´es da hoof. ´E no entanto de alertar que, no sentido de maximi- zar a capacidade de reutiliza¸c˜ao dos componentes (aqui designados por passos), a defini¸c˜ao de novos elementos deve ser evitada. O que ali´as tamb´em ´e verdade para qualquer outro modelo de RIC.

Tanto quanto foi poss´ıvel apurar, o SUIF tamb´em possui mecanismos para manter a consistˆencia da RIC. Esses mecanismos servem de intermedi´arios entre elementos de n´ıveis adjacentes da RIC. De tal forma, que quando um elemento ´e alterado, se activa o mecanismo que vai actualizar os descendentes imediatos. A esses mecanismos designam-se por disman- tlers e na realidade n˜ao actualizam, mas recomputam os elementos descendentes. Tanto quanto foi poss´ıvel apurar, os dismantlers podem ser gerados atrav´es do Smgn e funcionam essencialmente no sentido descendente. ´E por este motivo que o SUIF System d´a prioridade de execu¸c˜ao aos componentes que operam sobre elementos de maior abstrac¸c˜ao.

O SUIF assegura a extensibilidade permitindo a anexa¸c˜ao de anota¸c˜oes `a RIC. Essas anota¸c˜oes s˜ao representadas atrav´es de objectos do tipo AnnotableObject ou de classes de- rivadas desta. Por omiss˜ao, o SUIF permite que uma anota¸c˜ao consista num inteiro, numa string ou em outros objectos do SUIF. Mas o utilizador pode sempre optar por definir novas classes para as anota¸c˜oes.

Acontece no entanto que as anota¸c˜oes s˜ao entidades aut´onomas, isto ´e, uma vez depo- sitada a informa¸c˜ao na RIC, n˜ao h´a qualquer v´ınculo entre essa informa¸c˜ao e o componente que foi respons´avel pela sua computa¸c˜ao. Significa isto que n˜ao h´a mecanismos de consistˆen- cia entre RIC e informa¸c˜ao anexa, ou seja, se a RIC for entretanto modificada, a informa¸c˜ao contida nas anota¸c˜oes poder´a ficar inutilizada. Com a agravante de que isto pode nem sequer ser detectado.

O problema s´o n˜ao ´e grave, porque o SUIF System faz uso das anota¸c˜oes essencialmente entre componentes que s˜ao executados consecutivamente, isto ´e, o primeiro componente apura a informa¸c˜ao e coloca-a na RIC, para ser utilizada exclusivamente pelo componente seguinte. N˜ao foi poss´ıvel apurar com precis˜ao, at´e que ponto ´e f´acil construir a RIC com este modelo. Mas dada a existˆencia de diversos n´ıveis de abstrac¸c˜ao, que s˜ao semanticamente redundantes e que tudo indica obrigat´orios, ´e de crer que esta seja uma tarefa complicada.

Em termos de implementa¸c˜ao de novos componentes, o facto do SUIF disponibilizar variad´ıssimos n´ıveis de abstrac¸c˜ao, consistentes entre si, e de ser um modelo gen´erico e flex´ıvel, contribui certamente para simplificar este tipo de tarefa.

N˜ao sendo necessariamente uma desvantagem, o SUIF segue no entanto a m´axima