BT

Concorrência Declarativa para Ruby utilizando Fluxo de Dados

por Sebastien Auvray , traduzido por Acyr Tedeschi em 12 Mai 2009 |

Parte da linguagem Ruby foi influenciada por técnicas de programação funcionais. Assim programadores Ruby adotaram técnicas das linguagens Erlang ou Haskell, ou criaram pontes para elas, ex. Erlectricity.

Larry Diehl trouxe o modelo de concorrência declarativa para o Ruby importando o conceito de unificação da linguagem Oz. Esta é uma linguagem de programação multi paradigmas. É mais conhecida como uma linguagem de programação funcional (avaliações "preguiçosas" e "inteligentes"), distribuída e concorrente. Também oferece suporte à restrições, lógica e programação orientada à objetos.

Em vista do aumento de cores nos processadores, Larry quis utilizar as vantagens do modelo de concorrência declarativa no Ruby. Elas são:

  • É fácil saber o que o programa faz;
  • É possível utiliza a concorrência de maneira simples, porém poderosa.

Para conseguir isto, Larry usa o conceito do "comportamento do fluxo de dados em multi tarefas" como descrito em Concepts, Techniques, and Models of Computer Programming:

O que acontece se uma operação tenta usar uma variável que ainda não foi declarada? De um ponto de vista puramente estético, seria educado que a operação simplesmente esperasse. Talvez alguma outra tarefa irá inicializá-la e, então, a operação possa continuar. Este comportamento civilizado é conhecido como fluxo de dados.

E para fazer isto da maneira Oz, ele utiliza unificação:

A ideia de unificação é descrever valores através de equações lógicas que possam ser resolvidas automaticamente por algum algoritmo (de unificação)
.

Isto pode ser transcrito desta maneira (retirado do site do projeto):

# Variáveis locais 
include Dataflow

local do |x, y, z|
	# reconhece como a ordem é automaticamente decidida
	Thread.new { unify y, x + 2 }
	Thread.new { unify z, y + 3 }
	Thread.new { unify x, 1 }
	z #=> 6
end

Você cria novas variáveis com local ou declare (para variáveis de instância), e usa unify para uni-las.

Exemplos de Ports Oz (comportamento não determinístico), ou atores Erlang-ish são oferecidos.

Briam Morearty frisou algumas considerações interessantes sobre debugging, desempenho e memória na utilização do Fluxo de Dados. Larry Diehl escreveu no blog de Brian:

Uma coisa para notar é que esta biblioteca faz com que JRuby brilhe sobre MRI através de suas tarefas seguras + conjunto de implementação nativas para tarefas.

Olá visitante

Você precisa cadastrar-se no InfoQ Brasil ou para enviar comentários. Há muitas vantagens em se cadastrar.

Obtenha o máximo da experiência do InfoQ Brasil.

Dê sua opinião

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber menssagens dessa discussão
Comentários da comunidade

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber menssagens dessa discussão

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber menssagens dessa discussão

Dê sua opinião

Conteúdo educacional

Feedback geral
Bugs
Publicidade
Editorial
InfoQ Brasil e todo o seu conteúdo: todos os direitos reservados. © 2006-2013 C4Media Inc.
Política de privacidade
BT