BT

Disseminando conhecimento e inovação em desenvolvimento de software corporativo.

Contribuir

Tópicos

Escolha a região

Início Notícias Concorrência Declarativa para Ruby utilizando Fluxo de Dados

Concorrência Declarativa para Ruby utilizando Fluxo de Dados

Favoritos

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.

Avalie esse artigo

Relevância
Estilo/Redação

Conteúdo educacional

BT