• Nenhum resultado encontrado

4.3 Compilador Gamma

4.3.2 Palavras Reservadas e Operadores

Conforme vimos no Cap´ıtulo 2, o paradigma Gamma foi proposto como um forma- lismo para a defini¸c˜ao de programas de maneira simples e natural, sem a adi¸c˜ao de restri¸c˜oes ou artificialidades comumente encontradas nos tradicionais paradigmas se- quenciais. Devido a esta natureza m´ınima da linguagem, o n´umero de recursos para a express˜ao de programas tamb´em ´e m´ınimo, e consequentemente, o n´umero de pa- lavras reservadas e operadores requeridos para uma implementa¸c˜ao de Gamma n˜ao ´e grande. Contudo, para possibilitar a express˜ao de programas um pouco mais com- plexos, surgiram propostas de extens˜oes lingu´ısticas ao Gamma, como por exemplo, os operadores de composi¸c˜ao de programas (ver Subse¸c˜ao 2.3.1), os quais possi- bilitaram criar algum tipo de restri¸c˜ao no acesso ao multiconjunto, al´em de uma melhor modulariza¸c˜ao do problema, atrav´es do uso de v´arias rea¸c˜oes conectadas pelos referidos operadores.

A implementa¸c˜ao Gamma-Base realizou exatamente o que expusemos, possuindo um n´umero reduzido de palavras reservadas, e dando suporte aos operadores de com- posi¸c˜ao de programas sequencial e paralelo, al´em dos operadores aritm´eticos, l´ogicos e relacionais mais tradicionais. Em rela¸c˜ao `a principal estrutura que armazena os dados do programa, Gamma-Base suporta o uso de um ´unico multiconjunto, o qual pode ser composto por elementos simples (valores num´ericos), elementos compostos

(tuplas), ou por uma mistura dos dois tipos. Na Tabela 4.1 temos um resumo dos s´ımbolos suportados pela implementa¸c˜ao Gamma-Base.

Tabela 4.1: S´ımbolos suportados pela implementa¸c˜ao Gamma-Base.

Tipo S´ımbolo Descri¸c˜ao

Palavra Reservada

if Teste da condi¸c˜ao de rea¸c˜ao

replace Padr˜ao de sele¸c˜ao de elementos do Bag by A¸c˜ao (Reescrita) no Bag

where Defini¸c˜ao de rea¸c˜oes true Valor booleano verdadeiro false Valor booleano falso empty Valor vazio

Operador L´ogico and Conectivo L´ogico E or Conectivo L´ogico OU Operador Relacional > Maior do que < Menor do que >= Maior ou igual a <= Menor ou igual a == Igual a != Diferente de

Operador Aritm´etico

+ Adi¸c˜ao - Subtra¸c˜ao * Multiplica¸c˜ao / Divis˜ao % M´odulo Operador de Composi¸c˜ao ; Sequencial

| Paralelo S´ımbolo B´asico , Separador de Elementos = Atribui¸c˜ao ( In´ıcio de Express˜ao ) Fim de Express˜ao [ In´ıcio de Tupla ] Fim de Tupla { In´ıcio do Multiconjunto } Fim do Multiconjunto

exemplos de programas Gamma escritos para a implementa¸c˜ao em quest˜ao, e poderemos notar o emprego das palavras reservadas e operadores suportados.

Exemplo 1: C´alculo do Fatorial

/* fatorial.gm */ fatorial { 1,2,3,...,N } where

fatorial = replace x,y by x*y if true

Esse exemplo ´e um programa simples, composto de uma ´unica rea¸c˜ao chamada "fatorial", que atua sobre os elementos do multiconjunto "{1,2,3,...,N}". A defini¸c˜ao da rea¸c˜ao aparece ap´os a palavra reservada "where", e ´e composta pelo par “a¸c˜ao(A) ⇐ condi¸c˜ao de rea¸c˜ao(C)” (A ⇐ C). A a¸c˜ao ´e o que est´a definido pelas palavras reservadas "replace" e "by", ou seja, "replace x,y by x*y", e s´o ocorre caso a condi¸c˜ao de rea¸c˜ao "if true" for satisfeita. Nesse programa, a condi¸c˜ao de rea¸c˜ao ´e sempre verdadeira, e a a¸c˜ao ocorre at´e que reste apenas um elemento no multiconjunto, que ser´a a resposta do c´alculo do fatorial de N (N! = N * N-1 * N-2 * ... * 1). Podemos notar que o programa utiliza o padr˜ao de constru¸c˜ao de rea¸c˜oes chamado de Redu¸c˜ao, pois a reescrita do multiconjunto ocorre retirando-se dois elementos e adicionando apenas um, que ´e o produto entre eles.

Exemplo 2: Algoritmo de Ordena¸c˜ao

/* sort.gm */

init ; sort { N elementos } where

init = replace x by [0,x] if true

by [i,x], [j+1, y] if (x <= y and i == j)

Neste caso, temos um programa Gamma composto por duas rea¸c˜oes co- nectadas pelo operador de composi¸c˜ao sequencial, o qual realiza a ordena¸c˜ao (sort ) dos elementos do multiconjunto. A primeira rea¸c˜ao, "init", aplica o padr˜ao de constru¸c˜ao de rea¸c˜oes chamado de Transforma¸c˜ao sobre o multiconjunto, transformando todos os elementos simples, em tuplas de tamanho dois, nas quais o primeiro elemento representa o ´ındice de ordena¸c˜ao (inicialmente todos os ´ındices recebem o valor zero), e o segundo elemento ´e o pr´oprio valor que estava no multiconjunto inicial. Quando a rea¸c˜ao "init" termina, a segunda rea¸c˜ao, "sort", pode iniciar seu processamento. Essa rea¸c˜ao tamb´em realiza a Transforma¸c˜ao sobre o multiconjunto, atrav´es da altera¸c˜ao dos ´ındices das tuplas, de acordo com o valor de seus elementos. No final, o multiconjunto resultante consiste em um conjunto de tuplas de dois elementos cada, que est˜ao ordenadas pelos valores de seu segundo elemento, seguindo a ordem sequencial de seus ´ındices: { [0, x1], [1, x2], . . . , [(N − 1), xn] } | (x1 ≤ x2 ≤ . . . ≤ xn).

Exemplo 3: Modelo Gen´erico de Programa

/* generico.gm */

R1 ; R2 ; ... ; RN { Elementos do Multiconjunto }

where

R1 = replace {x1, x2, ..., xn}

by f1(x1, x2, ..., xn)

if "condi¸c~ao de rea¸c~ao" R2 = replace {x1, x2, ..., xn}

by f2(x1, x2, ..., xn)

if "condi¸c~ao de rea¸c~ao" .

. .

RN = replace {x1, x2, ..., xn}

by fN(x1, x2, ..., xn)

Este ´ultimo exemplo demonstra de forma gen´erica a sintaxe suportada pela implementa¸c˜ao Gamma-Base. Como podemos notar, ´e poss´ıvel construir um programa com um n´umero ilimitado de rea¸c˜oes, conectadas pelos operadores de composi¸c˜ao sequencial (‘;’), como no c´odigo mostrado, ou paralelo (‘|’). Cada rea¸c˜ao tem sua pr´opria defini¸c˜ao, composta pela sequˆencia padr˜ao de comandos "replace...by...if...". Um detalhe importante que devemos ressaltar ´e a possibilidade de utiliza¸c˜ao de rea¸c˜oes n-´arias no escopo de cada defini¸c˜ao, e tamb´em, a capacidade de mesclar elementos simples e tuplas nos c´odigos das cl´ausulas de programa¸c˜ao "replace" e "by".