由于 Ruby 语言受到了一些函数式程序设计技术的影响,有些 Ruby 程序员随之采纳了 Erlang 或者 Haskell 的思想,甚者建立起了从 Ruby 到这些语言的桥梁,比如: Erlectricity 。
Larry Diehl 基于 Oz 语言的 Unification 概念,为 Ruby 引入了声明式并发控制模型。Oz 是一种多维编程语言,它主要作为一种函数式(包括延迟计算和即时计算)、分布式和并发编程语言而著称,但同时它也支持约束、逻辑、命令式和面向对象编程。
随着计算机中核心处理器数量的不断增加,Larry 希望声明式并发模型能给 Ruby 语言带来一些好处:
- 更加易读的代码
- 简单但强大的并发控制
为了实现这个目标,Larry 应用了《Concepts, Techniques, and Models of Computer Programming》一书中描述的数据流线程行为(Dataflow threading behavior)概念:
如果一个操作试图使用一个未绑定的变量,该怎么办?如果纯粹从审美角度来看,这个操作应该等待,直到其它线程绑定了这个变量再继续进行。这种“文明礼貌”的线程行为被称之为数据流线程行为(Dataflow threading behavior)。
为了用 Oz 实现这个概念,Larry 应用了 Unification:
Unification 的思想是用逻辑方程来描述值,而逻辑方程可以自动被一些合一算法(unification algorithm)所解决。
那么在实际应用中,我们就可以这样编写代码了(这段代码来自 Dataflow 项目网站):
# Local variables include Dataflow local do |x, y, z| # notice how the order automatically gets resolved Thread.new { unify y, x + 2 } Thread.new { unify z, y + 3 } Thread.new { unify x, 1 } z #=> 6 end
用 local 或者 declare(实例变量)创建一些变量,然后用 unify 来绑定这些变量。
Oz Ports (非确定行为) 或者 Erlang 化 Actors 就是两个很好的例子。
但 Brian Morearty 也指出了对 Dataflow 调试、性能和内存的一些有意思的担心 。随后 Larry Diehl 在 Brian 的博客中进行了解释 :
有一点需要注意的是,由于这个库支持绿色线程(green threads)和本地线程池实现,它已经让 JRuby 在 MRI 上光芒四射了。
评论