• Nenhum resultado encontrado

4.3 Dolphin Internal Representation

4.3.1 Estrutura e classes da DIR

A DIR ´e um modelo cuja parte execut´avel da RIC, assenta em ´arvores de express˜oes. Mas disponibiliza tamb´em v´arias classes para representar elementos mais abstractos. As principais fam´ılias de classes, a sua rela¸c˜ao e a especifica¸c˜ao formal, encontra-se representada na Figura 4.3.

(a) Organiza¸c˜ao das classes da DIR.

Program :: Function*. Function :: IdentTable CFG Function*. IdentTable :: (string,CellTable)*. CFG :: FlowNode*. FlowNode :: LDT FlowNode* [IdentTable]. LDT :: DT DT* DT. DT :: Expression.

(b) Especifica¸c˜ao gramatical da DIR.

Figura 4.3: Classes principais da DIR.

Todas as classes apresentadas s˜ao de utiliza¸c˜ao obrigat´oria. O que significa que a RIC ´e constru´ıda atrav´es dos diversos n´ıveis de abstrac¸c˜ao, como acontece no RTLS, mas ao contr´ario deste modelo, a parte execut´avel da DIR est´a toda ela representada no n´ıvel inferior, composto por ´arvores de express˜oes.

A descri¸c˜ao que se faz em seguida das principais classes, descreve apenas as vari´aveis e aspectos mais relevantes de cada uma.

A classe Program representa o programa submetido ao compilador. ´E essencialmente composta por uma lista de apontadores para objectos do tipo Function. Dependendo da sintaxe da linguagem fonte, Program pode conter um ou mais objectos deste tipo.

4.3. Dolphin Internal Representation 55

A classe Function ´e utilizada para representar fun¸c˜oes, procedimentos, instru¸c˜oes com- postas ou simples declara¸c˜oes/defini¸c˜oes (a que designaremos genericamente por fun¸c˜oes). Para al´em de uma string com o identificador da fun¸c˜ao, cujo preenchimento ´e opcional, esta classe cont´em um apontador para um objecto do tipo IdentTable, outro para um objecto do tipo CFG e ainda uma lista de apontadores para objectos do tipo Function.

A classe IdentTable ´e uma tabela de hash implementada atrav´es de uma template que permite construir as tabelas de identificadores. As chaves s˜ao do tipo string e os valores associados `as chaves s˜ao definidos atrav´es do parˆametro da template, o qual dever´a obedecer a um protocolo m´ınimo para assim poder funcionar em conjunto com IdentTable. Esse protocolo est´a definido atrav´es da interface CellTable. Por omiss˜ao existem duas fam´ılias de classes derivadas de CellTable, que servem para representar respectivamente tipos (cellType) e s´ımbolos (cellSymbol ). Essas classes foram implementadas com base na solu¸c˜ao utilizada no SUIF.

A classe CFG representa explicitamente oGrafo de Fluxo de Controlo(GFC). Consiste essencialmente num conjunto de apontadores para objectos do tipo FlowNode.

FlowNode ´e a classe principal de um conjunto de classes que visam representar os nodos (v´ertices) do GFC. Associado a cada FlowNode est´a um apontador para um objecto do tipo LDT e um conjunto de apontadores para objectos do tipo FlowNode, que representam os antecessores do presente nodo. Derivam de FlowNode trˆes classes: o JNode, que representa um nodo que termina com uma express˜ao de salto incondicional; o CJNode, que representa um nodo que termina com uma express˜ao de salto condicional; e o RNode, que representa um nodo que termina com uma express˜ao de retorno (de fun¸c˜ao). Existe ainda uma quarta classe, que deriva de JNode e que cont´em um apontador para um objecto do tipo Function. Esta classe, que ´e designada por CSNode, visa representar partes do GFC que possuam identificadores pr´oprios (salvaguardados na IdentTable de Function) e funciona como um nodo que cont´em mais nodos (atrav´es do CFG de Function). A hierarquia da fam´ılia de classes FlowNode, encontra-se representada na Figura4.4(a).

(a) Classes da fam´ılia FlowNode. (b) Classes da fam´ılia DT.

Figura 4.4: Classes FlowNode e DT.

A classe LDT ´e essencialmente uma lista de DTs, cada um deles associado a uma express˜ao. Esta classe, para al´em da referida lista, cont´em mais duas vari´aveis do tipo DT : uma que est´a associada uma express˜ao do tipo Label, que identifica o LDT e implicitamente o FlowNode; e outra que est´a associada `a ´ultima express˜ao do LDT, e implicitamente `a ´ultima express˜ao do FlowNode. Express˜ao essa que serve para representar uma express˜ao de salto incondicional (Jump), uma express˜ao de salto condicional (CJump), ou ent˜ao uma express˜ao

de retorno (Return).

A classe DT ´e semelhante ao RegisterTransfers do RTLS. ´E utilizada essencialmente com dois objectivos: manter uma estrutura com as dependˆencias entre express˜oes; e man- ter uma representa¸c˜ao sequencial das express˜oes (e n˜ao apenas das ´arvores de express˜oes). De notar que determinadas optimiza¸c˜oes, nomeadamente de baixo n´ıvel, tˆem por objectivo reordenar as express˜oes de forma a rentabilizarem: os pipelines, a utiliza¸c˜ao dos registos e da mem´oria cache, ou outros recursos da arquitectura de computa¸c˜ao. A utiliza¸c˜ao de sim- ples ´arvores de express˜oes n˜ao permite manter a ordem pela qual as express˜oes devem ser processadas, da´ı a necessidade dos DTs.

Conforme j´a foi dito, cada DT est´a associado a uma express˜ao, atrav´es de um aponta- dor. As classes derivadas de DT s˜ao substancialmente diferentes das utilizadas pelo RTLS. At´e porque determinados elementos da RIC, nomeadamente os que definem o fluxo de con- trolo do programa, s˜ao no RTLS considerados como RegisterTransfers, enquanto na DIR s˜ao tratados como express˜oes comuns. Existem assim trˆes tipos distintos de DTs, a saber: RAssign, que est´a associado a express˜oes que produzem resultados interm´edios (que corres- pondem nos outros modelos aos pseudo-registos); Assign, que est´a sempre associado a uma express˜ao do tipo AsgnExpr e que representa uma atribui¸c˜ao expl´ıcita para uma vari´avel ou qualquer outra referˆencia de mem´oria; VAssign, que est´a associado a express˜oes das quais n˜ao resulta qualquer tipo de valor, como por exemplo, a express˜oes de salto (Jump/CJump), a labels (Label ), etc. Para al´em destes DTs existem ainda mais dois derivados de RAssign, para casos relativamente espec´ıficos: o CAssign, que est´a sempre associado a uma expres- s˜ao de invoca¸c˜ao de procedimento/fun¸c˜ao (Call ); e o PhyAssign, que est´a sempre associado a uma express˜ao do tipo PhyFunction ou PhyTFunction (utilizadas na representa¸c˜ao Sta- tic Single Assignment). A hierarquia da fam´ılia de classes DT encontra-se representada na Figura 4.4(b).

Expression ´e uma classe abstracta que serve para representar uma qualquer express˜ao, e da qual derivam as seguintes classes: Terminal, conjunto de classes que na sua maioria servem para representar elementos terminais das ´arvores de express˜oes; JmpExpr, classes que implementam as express˜oes de fluxo de controlo; UnaryExpr, classes que representam opera¸c˜oes un´arias; e BinExpr, que deriva de UnaryExpr e que serve para representar opera- dores bin´arios. Para al´em destas classes, que s˜ao todas elas abstractas, existem v´arias classes concretas, que se encontram representadas na Figura 4.5.

Apesar de n˜ao ser muito vulgar, a DIR admite a utiliza¸c˜ao de operadores com mais do que dois operandos, para tal disponibiliza o ArgExpr e o LExpr. O primeiro permite decompor os operadores em express˜oes bin´arias; e o segundo faz uso de uma lista de operandos, todos eles do tipo apontador para Expression. Dois exemplos que ilustram a utiliza¸c˜ao destas classes encontram-se representados na Figura 4.6(a)e 4.6(b).

Conv´em acrescentar que, directa ou indirectamente, todas as classes da DIR derivam da classe abstracta DObject, que na realidade nada acresce de novo, mas permite representar uma qualquer classe da DIR.

´

E tamb´em importante real¸car que quase todas as classes anteriormente definidas, con- tˆem um apontador para o objecto que as inclui, permitindo assim navegar na RIC no sentido ascendente e descendente (subentende-se que a RIC corresponde a um grafo ac´ıclico). Por exemplo, cada objecto do tipo CFG cont´em um apontador para o objecto Function no qual est´a inclu´ıdo.

A RIC passa de componente para componente atrav´es do objecto Program. Em alter- nativa ´e poss´ıvel utilizar a classe DIR (que tem a mesma designa¸c˜ao do modelo), que para al´em do objecto do tipo Program, cont´em informa¸c˜ao das op¸c˜oes de compila¸c˜ao.

4.3. Dolphin Internal Representation 57

Figura 4.5: Hierarquia da fam´ılia de classes Expression.