• Nenhum resultado encontrado

2.3 PEWS

2.3.2 Máquina de Redução de Grafos

2.3.2.1 Regras de Tradução

Para podermos especiĄcar composições, é necessário o uso de uma gramática. Dessa forma, utilizaremos uma variante de PEWS, proposta em [8]. A linguagem usada tem uma estrutura que é representada pela gramática abaixo:

P ::= S( ¯I, ¯O) | P1 || P2 | P1 ; P2 | [E1]P1 + [E2]P2

| IF[E1]P1 | unfold | unfolding P1

E ::= id | n | t | E1 + E2 | E1 - E2 | E1 * E2 | E1 / E2 | − E1

| E1 and E2 | E1 or E2 | not E1 | E1 == E2 | E1 ≤ E2

| E1 < E2

O símbolos não-terminais P e E representam, respectivamente, os serviços de uma orquestração e as expressões aritméticas e booleanas da variante da linguagem PEWS. A partir desta gramática, é possível realizar as seguintes operações:

• S( ¯I, ¯O) Ű Chamadas a serviços, com ¯I representando as variáveis de entrada do serviço e ¯O representando as variáveis de saída;

• P1 || P2 Ű Paralelismo entre serviços, onde as operações realizadas em P1 ocor-

rem simultaneamente as de P2, respeitadas algumas restrições que serão mostradas

posteriormente;

• P1 ; P2 Ű Sequência entre serviços, onde qualquer operação em P2 só é executada

após o término de todas as operações de P1;

• [E1]P1 + [E1]P2 Ű Escolhas não determinísiticas, onde a execução de P1 ou P2

depende da avaliação das expressões aritméticas E1 e E2 que retornam valores

booleanos;

IF [E1] P1 Ű Condicional simples, onde a expressão E1 é avaliada e, caso seja

• U nf olding P1 Ű Repetições de P1, onde toda a ocorrência do símbolo terminal

unfold representa o local onde deve ser repetido o procedimento de P1;

• Expressões Ű Representam os conhecidos identiĄcadores (id), números (n), e as ex- pressões aritméticas, relacionais e booleanas (E1+E2, E1−E2, E1 < E2, E1 and E2,

etc.).

Para a construção do grafo, precisamos transformar cada uma das estruturas acima num conjunto de vértices e arestas. O conjunto de vértices será representado por V, onde cada vértice é uma entidade que será avaliada de acordo com determinadas regras (cha- madas a serviços, expressões condicionais, etc.). As arestas são as estruturas que ligarão vértices e relacionarão os mesmos colocando restrições quanto à avaliação. Representare- mos arestas com o símbolo Ş7→Ť. Em PEWS-AM, são descritos dois tipos de restrições: restrições de Ćuxo de controle e restrições de Ćuxo de dados. As restrições de Ćuxo de controle determinam o Ćuxo de execução dos serviços através de arestas de controle, re- presentadas por Ac e as restrições de Ćuxo de dados representam as dependências de algumas variáveis dos vértices em relação a outros através de arestas de dependência, representadas por Ad. O termo indegree(v) é usado para representar o número de arestas que chegam a v, ou seja, a soma das arestas de controle − indegreec(v) − e as arestas de dependência − indegreed(v). Sendo assim, a deĄnição de grafos é representada por hV, Ac, Adi, sendo V o conjunto de vértices, Ac as arestas de controle e Ad as arestas de dependência. Para a tradução da linguagem variante de PEWS, é usada a função T .

Veremos agora como é feita a tradução de uma composição de serviços P para grafos. A regra de tradução para uma chamada a serviço é feita da seguinte forma:

T JS( ¯I, ¯O)K =D{w: S! ¯I, w: S? ¯O}, {w 7→ w}, ∅E

Uma chamada a serviço é traduzida para um grafo de dois vértices, w e wŠ, que representam, respectivamente, expressões de entrada para o serviço S (S! ¯I) e variáveis

de saída do serviço S (S? ¯O). Uma aresta de controle é criada entre esses dois vértices,

garantindo que os dados resultantes da execução da operação S! ¯I serão armazenados nas

variáveis da operação ¯O. Isso é mostrado na Ągura 3.

2.3. PEWS 39 Para a tradução de uma operação em paralelo, consideremos T JP1K= hV, Ac, Adi

e T JP2K= hV′′, A′′c, A′′di. Dessa forma temos a seguinte tradução:

T JP1||P2K = hV∪ V′′, Ac ∪ Ac′′, Ad ∪ A′′dΔd′ ∪ Δd′′i

Os vértices resultantes representam a união dos vértices dos dois grafos, P1 e P2.

Como eles estão executando em paralelo, não existem arestas de controle adicionais, por- tanto, o conjunto de arestas de controle é formado pela união das arestas de controle dos dois grafos. Apesar de estarem executando em paralelo, é possível que a execução de um vértice dependa de alguma variável que está presente na operação de algum vértice do outro grafo. Isso gera possíveis arestas de dependência entre esses dois vértices. As possíveis arestas de dependência de dados são deĄnidas por Δde Δd′′, descritos abaixo:

Δd= {v1 7→ v2 | v1 : S1? ¯O ∈ V

[(v2 : S2! ¯I ∈ V′′ ∧ ∃x ∈ V ars( ¯I).x ∈ V ars( ¯O)) ∨

(v2 : E ∈ V′′ ∧ ∃x ∈ V ars(E).x ∈ V ars( ¯O))]}

Δd= {v2 7→ v1 | v2 : S2? ¯O ∈ V

[(v1 : S1! ¯I ∈ V′′ ∧ ∃x ∈ V ars( ¯I).x ∈ V ars( ¯O)) ∨

(se v1 : E ∈ V′′ ∧ ∃x ∈ V ars(E).x ∈ V ars( ¯O))]}

Para que haja uma aresta de dependência de um vértice w para um vértice w′, é

preciso que w seja um vértice de saída de serviço (S? ¯O). Já o vértice w′ tem de utilizar

alguma dessas variáveis de w, sendo, portanto, um vértice que possui expressões para avaliação. Existem dois possíveis casos: (i) wé uma chamada de serviços (S! ¯I) que utiliza

variáveis de saída do vértice w, ou (ii) w′ é uma expressão que é usada em um vértice

Ş+Ť. A Ągura 4 mostra como seria graĄcamente a tradução desta operação.

Figura 4 Ű Tradução da operação P1|| P2 para grafos

Da mesma forma, para a tradução de uma operação em sequência, consideremos T JP1K = hV, Ac, Adi e T JP2J= hV′′, A′′c, A′′di. Dessa forma temos a seguinte tradução:

Os vértices resultantes representam a união dos vértices dos dois grafos, P1 e

P2. Como eles estão executando em sequência, as atividades de P2 só podem começar a

executar quando todas as atividades de P1 tiverem terminado, ou seja, haverá uma aresta

de controle dos vértices de P1 para os vértices de P2 que possuem indegreec = 0, indicado por Δc. A criação de arestas de dependência entre os dois grafos é igual a forma de criação do paralelismo entre serviço, mostrado anteriormente:

Δc = {v1 7→ v2 | v1 ∈ V, v2 ∈ V′′, indegreec = 0}

Δd= {v1 7→ v2 | v1 : S1? ¯O ∈ V

[(v2 : S2! ¯I ∈ V′′ ∧ ∃x ∈ V ars( ¯I).x ∈ ¯O) ∨

(v2 : E ∈ V′′ ∧ ∃x ∈ V ars(E).x ∈ ¯O)]}

Figura 5 Ű Tradução da operação P1; P2 para grafos

Na tradução de uma escolha não-determinística, consideremos T JP1K= hV, Ac, Adi

e T JP2K= hV′′, A′′c, A′′di. Neste caso, temos:

T J[E1]P1 + [E2]P2K=

hV∪ V′′∪ {v : +, v1 : E1, v2 : E2}, A

c∪ A′′cΔ, Ad∪ A′′di

Os vértices resultantes representam a união dos vértices dos dois grafos, P1 e P2,

com a adição de mais 3 vértices: v, v1 e v2. O vértice v representa uma escolha não-

determinística entre os vértices v1 e v2, que são expressões. Devido a isto, as arestas de

controle são representadas pela união das arestas de controle já existentes em P1 e P2,

adicionando-se duas arestas a mais, que saem de v para v1 e v2 (indicados por Δ), além

das arestas que partem dos vértices v1 e v2 para, respectivamente, os vértices de V1 e V2

que possuem indegreec = 0. As arestas de dependência são formadas apenas pela união entre as arestas de dependência dos grafos P1 e P2:

Δ = {v 7→ v1, v 7→ v2} ∪Δ′∪Δ′′

Δ′ = {v1 7→ w | w ∈ V, indegree

c(w) = 0} Δ′′ = {v

2.3. PEWS 41

Figura 6 Ű Tradução de uma escolha não-determinística para grafos

A tradução de uma expressão condicional simples é bem parecida com a transfor- mação da escolha não-determinística, mostrada anteriormente. Portanto, seja T JP1K =

hV, A

c, Adi em:

T JIF[E1]P1K=

hV∪ {v : +, v

1 : E1, v2 : false}, Ac∪ {v 7→ v1, v 7→ v2} ∪Δ, Adi

Os vértices resultantes representam a união dos vértices do grafo P1 e mais 3

vértices: v, v1 e v2. O vértice v representa uma escolha não-determinística entre os vértices

v1 e v2, que são expressões. Entretanto, a expressão de v2 já é avaliada como sendo falsa,

ou seja, a mesma está descartada. Devido a isto, as arestas de controle são representadas pela união das arestas de controle já existentes em P1, adicionando-se duas arestas a mais,

que saem de v para v1 e v2, além das arestas que partem dos vértices v1 para os vértices

de V1 que possuem indegreec=0, representadas por Δ, mostrado abaixo. Isto é descrito

na Ągura 7:

Δ = {v1 7→ w | w∈ V, indegreec(w′) = 0}

Figura 7 Ű Tradução de uma estrutura condicional simples para grafos

Por Ąm, para a tradução de uma estrutura de repetição, consideremos T JP1K =

hV, Ac, Adi. Vejamos abaixo:

T JU nf olding P1K= h{V [v : µ], AcΔ, Adi

Os vértices resultantes representam a união dos vértices do grafo P1 com o vértice

especial µ (Mu), que representará o início de um laço. As arestas de controle são repre- sentadas pela união das arestas de controle já existentes em P1, adicionando-se arestas

que saem de µ para os vértices de V que possuem indegreec = 0, representadas por Δ. As arestas de dependência são as arestas já existentes em P1:

Δ = {v 7→ w | w∈ V, indegree

c(w′) = 0}

Figura 8 Ű Tradução de uma estrutura de repetição para grafos

A tradução de um vértice do tipo unfold não envolve a criação de arestas. É ape- nas criado o vértice que irá representar pontos especíĄcos onde o controle é transferido para o início da iteração, deĄnida pelo vértice µ.