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.