• Nenhum resultado encontrado

Máquinas de Redução de Grafos

O termo Redução de Grafos, proposto inicialmente por Wadsworth [72], refere-se a uma técnica na qual uma expressão (redutível) é substituída por sua forma reduzida. Em detalhes, uma expressão é representada como um grafo orientado onde existe a noção de nó raiz. Cada nó pode representar, por exemplo, uma chamada de função com seus nós sucessores representando os argumentos para esta função. Este grafo será transformado durante a execução da expressão, sendo que cada sub-grafo avaliado será substituído por uma expansão do mesmo ou pelo valor da expressão. Este processo de substituição é realizado repetidamente até que o grafo alcance a sua forma normal, ou seja, tenha sido reduzido a um valor.

Um dos objetivos de utilizar esta teoria de redução de grafos é o de se obter ganhos em desempenho na implementação de linguagens de programa-

ção. Isto se deve ao compartilhamento de sub-expressões comuns que são representadas na forma de um único grafo o qual será reduzido uma única vez [6, 32].

Para um melhor entendimento, considere o exemplo retirado de [30], abaixo.

Exemplo: Dado o programa funcional escrito em uma linguagem com avaliação preguiçosa (lazy evaluation) a seguir.

letrec from n = n.from(succ n) in from 0

O resultado deste programa é a lista potencialmente infinita dos números naturais. Para este exemplo, Johnsson [30] considerou como forma normal (ou canônica) para uma expressão quando ela assumir valores inteiros, cons- tantes booleanas, lista de expressões e.e’ e aplicação de funções f e1...em

onde f é uma função que leva menos argumentos do que os m possíveis. No programa, succ é uma função sucessor pré-definida e ’.’ é um operador para construção de lista, sua justaposição indica uma aplicação de função.

A figura 2.8 apresenta o processo de redução de grafos para este programa. Nela o símbolo ’@’ denota a aplicação de função.

Aplicando-se a regra de reescrita da função from, a expressão inicial 2.8(a) é transformada para 2.8(b) onde temos uma referência para o inteiro 0 que substituiu o parâmetro ’n’ da regra. Em 2.8(b), a expressão está em sua forma normal. Agora, o inteiro 0 pode ser um valor de saída (output) e o nó raiz do grafo (.) é retirado como pode ser visualizado em 2.8(c). Novamente, a regra from deve ser aplicada ao grafo que está em sua forma normal e.e’. O próximo passo é reduzir a função succ (2.8(d)). O resultado dessa redução

Figura 2.8: Exemplo de redução de grafo. Os valores de saída (output) estão abaixo de cada grafo [30].

é mostrado em 2.8(e). Em 2.8(f), 1 é o resultado como saída e o nó raiz é novamente retirado do grafo. Este processo é repetido indefinidamente.

De acordo com [39] existem dois estilos de máquinas de redução de grafos: a pura e a programada. Elas se diferenciam no momento da escolha do próximo passo da redução. A máquina de redução pura tem a propriedade de que a seleção do próximo passo da redução é derivado dinamicamente da expressão atual em cada etapa da sequência de reduções [52]. Exemplos de máquinas puras são as que possuem arquitetura baseada no λ-calculo (Calculo lambda), redução de combinadores ou redução de strings. Já nas

máquinas programadas, os passos da redução são derivados da expressão original através de uma análise estática do programa. Um exemplo deste tipo de máquina é a máquina G [30].

É interessante notar que as máquinas de redução de grafos foram ampla- mente utilizadas para a implementação de linguagens funcionais lazy. Isto foi possível graças à contribuição original de Wadsworth [72] que idealizou o conceito de redução normal de grafos o que se constituiu em uma importante contribuição à programação funcional baseada no λ-calculus [66]. Várias im- plementações de máquinas de redução de grafos foram propostas. Turner [65] adaptou esta redução de grafos para os combinadores (SKI) e construiu uma máquina de redução pura na qual conseguiu otimizar a avaliação de expres- sões definidas em termos dos combinadores de maneira a alcançar desempe- nhos satisfatórios nos programas gerados [65]. Influenciada diretamente pela máquina de Turner, a máquina G (G-Machine) de Johnsson [30, 39], aparece com uma arquitetura para avaliar programas funcionais. Esta máquina usa a redução de grafos programada e possui um sistema de regras de transição de estados que define a forma em que os grafos são transformados até a sua avaliação. A configuração inicial da máquina é definida mediante regras de tradução do funcional a ser executado. Das máquinas que usam a redução de grafos, a Máquina G foi a que conseguiu atingir os melhores desempe- nhos para a implementação de linguagens funcionais lazy. Outras versões desta máquina foram implementadas em [6, 10, 33]. Darlington e Reeve [20] construíram uma máquina para a avaliação paralela de linguagens funcio- nais baseada em uma linguagem chamada Alice. Scheevel [57] projetou uma máquina de redução com otimizações para reduções de combinadores (imple-

mentada somente para os combinadores de Turner). Um grande esforço de pesquisa, como [24, 25, 34, 45, 63], foi dedicado à melhora no desempenho das implementações baseadas em máquinas de redução de grafos para linguagens de programação.

PEWS-AM: Arquitetura e

Implementação

Este capítulo destina-se a descrever a arquitetura e a implementação de PEWS-AM (Acrônimo de PEWS Abstract Machine), uma máquina de redu- ção de grafos para a implementação de orquestrações de serviços web. Nas próximas seções, serão apresentadas uma visão geral da máquina abstrata, a gramática utilizada, as regras de tradução desta gramática para grafos, as regras de redução destes grafos e questões pertinentes à implementação.

3.1

Visão Geral

Usar grafos para representar composições de serviços é uma abordagem co- mum a várias soluções de middleware para serviços web, tanto para fins acadêmicos como na indústria [7, 55]. Na maioria destas abordagens, a re- presentação do grafo é utilizada para gerar um programa o qual executa a

semântica do serviço.

Neste trabalho, diferentemente dessas abordagens, propõe-se a interpre- tação direta do grafo que representa a composição. Isso é possível devido a um conjunto de regras de tradução as quais implementam o comportamento de cada construtor do programa o qual descreve a composição.

Assim, a máquina abstrata é definida mediante dois elementos principais: (i) um conjunto de regras de tradução (definidas pela função de tradução T que traduz os programas PEWS em grafos); e (ii) um conjunto de re- gras de redução de grafos (para executar a orquestração). A execução de um programa PEWS corresponde à aplicação repetida de regras de redução, partindo do grafo gerado pela função T , até obter um grafo que não possa ser reduzido usando as regras da máquina. A próxima seção apresentará como é realizada a tradução de um programa para os grafos utilizados pela máquina abstrata.

Documentos relacionados