• Nenhum resultado encontrado

3.2 Estruturando Componentes Compostos

3.2.8 Opera¸c˜oes sobre Unidades

Unidades podem ser compostas, decompostas e replicadas, obedecendo restri¸c˜oes que garantem a preserva¸c˜ao do comportamento descrito por suas interfaces. Para isso, o mod- elo # define trˆes opera¸c˜oes que podem ser aplicadas sobre unidades, produzindo novas unidades que as substituem: unifica¸c˜ao, fatora¸c˜ao e replica¸c˜ao. As duas primeiras s˜ao consideradas opera¸c˜oes primitivas e s˜ao aplicadas sobre unidades virtuais, produzindo unidades virtuais. A terceira, por outro lado, pode ser aplicada sobre qualquer tipo de unidade, sendo um caso especial de fatora¸c˜ao quando aplicada sobre uma ´unica unidade virtual. As se¸c˜oes seguintes provˆeem detalhes e exemplos a respeito de cada uma das opera¸c˜oes. De forma geral, em uma opera¸c˜ao v´alida, deve haver uma rela¸c˜ao de equivalˆencia parcial da(s) unidade(s) resultante(s) `as unidade(s) original(is), de forma que o comportamento destas seja parcialmente preservado na rede de unidades resultante ap´os a aplica¸c˜ao da opera¸c˜ao.

3.2.8.1 Unifica¸c˜ao A unifica¸c˜ao aplica-se sobre um conjunto de unidades virtuais, resultando na cria¸c˜ao de uma nova unidade virtual que assume o papel das unidades originais na rede de processos, deixando estas de existir. O programador pode definir a

interface da nova unidade explicitamente ou delegar essa tarefa ao compilador, o qual

gerar´a uma interface default. Esta ´e obtida pela aplica¸c˜ao do operador # sobre as inter- faces das unidades originais. As interfaces das unidades originais podem ser sobrepostas na forma¸c˜ao da interface da unidade resultante, sendo o agrupamento de portas aplicado sempre que portas unificadas est˜ao conectadas a portas distintas. Exemplo de unifica¸c˜ao ´e ilustrado na Figura 3.9. Neste, s˜ao unificadas trˆes unidades virtuais, denominadas

unidade A, unidade B e unidade C, formando uma nova unidade virtual identificada por unidade ABC.

u s u r t t s r a b b a c c merge unify b c unidade_X unidade_Y unidade_XY a

unify unidade X # (a,b) → c, unidade Y # (b,a) → c

to unidade XY # (a,b) → c behaviour: repeat seq {a?;b?;c!} until <a & b & c> connections a:<>:merging

Figura 3.10. Exemplo de Unifica¸c˜ao

Observa-se a sobreposi¸c˜ao das interfaces das unidades originais na constitui¸c˜ao da interface da unidade resultante. Por exemplo, as portas identificadas por mA.l3 nas unidades unidade A e unidade C passam a representar na unidade ABC um ´unica porta de entrada de mesmo nome. Como as duas portas mA.l3 originais est˜ao conectadas a portas distintas na rede de processos, mA.l3 constituir´a um agrupamento de portas na unidade resultante. Cada porta no agrupamento (mA.l3[1] e mA.l3[2]) faz o papel de uma das portas originais, preservando a conectividade original da rede de unidades. A fun¸c˜ao de liga¸c˜ao do agrupamento de portas mA.l3 na unidade ABC ´e configurado explicitamente pelo programador (broadcast). O mesmo pode ser afirmado com respeito `as portas mA.l1 e mB.l3. Sempre que a fun¸c˜ao de liga¸c˜ao ´e omitida, assume-se a fun¸c˜ao

default. Atente-se ainda para o fato de que o n´umero de replica¸c˜oes da porta n˜ao precisa

ser explicitado na declara¸c˜ao do agrupamento. Este corresponde ao n´umero de ocorrˆencias da porta nas interfaces das unidades originais.

Como forma de simplificar o processo de composi¸c˜ao de programas utilizando unifica¸c˜ao, ´e poss´ıvel associar diretamente um componente a unidade resultante de uma unifica¸c˜ao, usando nota¸c˜ao semelhante a declara¸c˜ao de unidades n˜ao-virtuais. Observe o exemplo:

unify unidade A # mB # () → mA.l3, unidade B # (a,mA.l1) → (b,mB.l3), unidade C # mA

to unidade ABC # ExtMerge2

as AComponent ([1,3..],mB.l1,mA.l1,mA.l2) → (mB.l3,mA.l3, ) connections mA.l1<>:choice, mB.l3<>:merge, mA.l3<>:broadcast

Nesta nova configura¸c˜ao, a unidade ABC ´e uma unidade n˜ao-virtual, provendo a funcionalidade especificada pelo componente AComponent. Este recurso sint´atico evita que o programador precise aplicar o comando assign posteriormente, tornando o c´odigo # mais conciso.

factorize unidade_X l3 choice l1 l2 l1 l2 unidade_X1 unidade_X2 l3 l3

unit unidade X # Merge2 factorize unidade X

to unidade X1 # l1 → l3 like Pipe , unidade X2 # l2 → l3 like Pipe connections c<>:choice convert

Figura 3.11. Exemplo de Fatora¸c˜ao

factorize convert convert l1 l2 l3 unidade_X l1 l2 l3 l3 unidade_X2 unidade_X1

unit unidade X # Merge2 groups l3<2>:choice .

. .

factorize unidade X

to unidade X1 # l1 → l3 like Pipe , unidade X2 # l2 → l3 like Pipe connections c<>:choice convert

Figura 3.12. Exemplos de Fatora¸c˜ao

´

E poss´ıvel que um conjunto de portas unificadas, como resultado da unifica¸c˜ao de unidades cujas interfaces sobrep˜oem-se, n˜ao origine um agrupamento na unidade resul- tante. Isso ´e poss´ıvel quando os pares de comunica¸c˜ao das portas unificadas s˜ao os mesmos. Caso n˜ao houvesse unifica¸c˜ao das unidades detentoras dessas portas, o com- pilador indicaria um erro, uma vez que canais # s˜ao ponto-a-ponto. Entretanto, com a unifica¸c˜ao, as portas passam a fazer o papel de uma ´unica porta, tornando o canal ponto-a-ponto, como ilustrado na Figura 3.10.

3.2.8.2 Fatora¸c˜ao A opera¸c˜ao de fatora¸c˜ao ´e aplicada sobre uma unidade virtual, produzindo um conjunto de novas unidades virtuais. Exemplos de fatora¸c˜ao s˜ao ilustrados nas Figuras 3.11 e 3.12.

Na Figura 3.11, a unidade virtual unidade X ´e decomposta em duas unidades virtuais, denominadas unidade X1 e unidade X2. Observe que a fatora¸c˜ao da porta l3 causou a replica¸c˜ao de seu par de comunica¸c˜ao, formando um agrupamento de portas choice com fun¸c˜ao de liga¸c˜ao id (default).

merge broadcast id l1 l2 l3 l2 l1 l3 l3 l3 l1 l1 l2 l2 l1 l1 l1 l2 l2 l2 l3 l3 l3 l4 l4 l4 l1 l2 l3 l4 replicate unidade_A unidade_A unidade_B unidade_B unidade_X unidade_X unidade_X unidade_Y unidade_Y unidade_Y unidade_X unidade_Y

unit unidade X # Merge1 unit unidade Y # Merge2 .

. .

replicate 3 unidade X , unidade Y connections l1<>: broadcast, l2<>: choice, l3<>: merge

Figura 3.13. Um exemplo de replica¸c˜ao de unidades

Na Figura 3.12, ilustra-se o caso onde a porta l3 constitui um agrupamento de por- tas, ao inv´es de uma porta individual como no caso anterior. Neste caso, a fun¸c˜ao de liga¸c˜ao especificada ´e aplicada a cada uma das portas conectadas `as portas individuais em l3. Essa regra extende-se para qualquer tipo de agrupamento de portas, inclusive agrupamentos aninhados, discutidos na Se¸c˜ao 3.2.9.

3.2.8.3 Replica¸c˜ao Seja u1, . . . , unuma cole¸c˜ao de unidades. A opera¸c˜ao de replica¸c˜ao

permite que sejam criadas k c´opias da sub-rede de comunica¸c˜ao induzida por estas unidades, obedecendo-se as seguintes restri¸c˜oes:

• Para cada unidade ui, 1 ≤ i ≤ n, s˜ao criadas k c´opias, denominadas ui[1], . . . , ui[k];

• Se existe um canal, c, ligando uma porta p de certa unidade ur a uma porta q

de uma certa unidade us, ent˜ao ser˜ao criados k canais, c[1], . . . , c[k], cada qual

respectivamente ligando a porta p da unidade ur[i] `a porta q da unidade us[i],

1 ≤ i ≤ k;

• Para todo canal c que liga uma porta p de uma unidade v a uma porta q de um

unidade ui, onde v n˜ao pertence ao conjunto de unidade replicadas, ´e criado um

grupo de portas p na unidade v, contendo k r´eplicas da porta p, denominadas

p[1], . . . , p[k], usando a fun¸c˜ao de liga¸c˜ao explicitamente especificada na cl´ausula

connections. Al´em disso, s˜ao ainda criados k canais, identificados por c[1], . . . , c[k], cada qual ligando respectivamente a porta p[i] da unidade v `a porta q da unidade

h2 e h1 h1 h3 h2 de f a c b x y z replicate ou factorize c g f x y y y z d x x x a b[3] unify

replicate 3 b # y connections y<>: g unify d # x → (), e # x → ()

to de # x → () behaviour: repeat x? until x connections y<>: h3

Figura 3.14. Grupos Aninhados de Portas

O exemplo na Figura 3.13 ilustra o uso da opera¸c˜ao de replica¸c˜ao. Neste, a sub-rede formada pelas unidades X e unidade Y ´e replicada em trˆes c´opias. Somente as portas conectadas `as portas l1 e l2 da unidade X e l3 da unidade Y s˜ao replicadas. Atente-se para a configura¸c˜ao das fun¸c˜oes de liga¸c˜ao nestes grupos de portas, usando a cl´ausula connections.