JRuby 和 Clojure——一对好搭档?

阅读数:1620 2009 年 3 月 28 日

话题:JavaRuby编程语言架构语言 & 开发

Clojure是一种 LISP 风格的语言,运行在 JVM 上。Clojure 的一大特色就是其并发机制,它支持不可变的数据结构(Clojure 是来自于可持久化的数据结构)。Clojure 还有一个特色是软件事务存储(Software Transactional Memory,STM),其支持用事务代替锁和互斥器来更新共享内存。STM 还是一个有争议的技术,还需要更好的证明自己,一个简单的办法就是访问一个 JVM 上的实现。

Clojure 有望在近期发行 1.0 版,已经有很多 Clojure 库已经可以用了。其中一些是受到了 Ruby 库的启发,这里只列出几个:

  • Compojure是一个 Clojure 的 web 框架。从它的 README 文件可以看出它是受到了 Ruby 的 web 框架 Sinatra 的启发。
  • Ring用来提供 HTTP 服务,类似于 Python 的 WSGI 和 Ruby 的 Rack。
  • clj-record是一个类似于 ActiveRecord 的 ORM 映射器。
  • Lancet是个 Clojure 构建工具,类似于 Rake,开发者是 Stuart Halloway。
  • clj-haml是从 Ruby 的 HAML 库移植过来的。

Clojure 库受 Ruby 库的启发,是这两种语言的相互影响的一种途径。另外一种途径是 JRuby——两种语言共享了相同的底层运行库——JVM。

Daniel Kwiecinski 在一篇博客中探索了融合 JRuby 和 Clojure的想法,并实验了让 Clojure 数据结构和一些特性作为 Ruby 对象在 JRuby 中能用。就这一点上特别有意思的是 Clojure 的可持久化的数据结构,例如它的可持久化向量(Persistent Vectors)。注意:在这里,“可持久”并不是指数据被保存在磁盘上。可持久化的数据结构是不可变的;像插入之类的操作也许能用,但需要对数据结构做一个完整的“拷贝”。Clojure 的实现和不变的约束允许避免被迫做一个完整的“拷贝”;而只主要复制一些相对较小的要素。Karl Krukow演示了 Clojure 的可持久化向量的实现,还解释了它的原理。

JRuby 开发人员的另一个机会是 Clojure 支持的STM,它提供了一条路让 Ruby 开发人员去尝试这个概念。即使 Ruby 代码没有明确使用任何 Clojure STM 特性,也可以用 Clojure 来写底层的应用模型,而让 JRuby 来做前端部分,比如 Rails 或者其他 Ruby 框架。

还有一个选择是用 Clojure 来解决性能瓶颈。尽管 JRuby 的性能还在稳步提升,但仍有一些时候需要在性能和 (J)Ruby 的多态与灵活性之间权衡。在 MRI 中,在一个 Ruby 应用程序中,性能瓶颈可以通过写一些本地扩展来解决。在 JRuby 中,一种方案是用 Java 写代码, 用 Java 源代码,或者生成 JVM 字节码都行(要么用 Ruby 的字节码 DSL 生成字节码,要么用 Clarles Nutter 的 Duby 之类的语言)。

选择一个低级的系统语言,比如 C(用于 MRI)或者 Java(用于 JRuby)有些短处:这降低了 Java 的等级,也丢掉了一些特性,比如 Block、很多类型的元编程等等。

要解决这个问题,Clojure 是一个可能的方案:这种语言具有多种级别的灵活性。例如,普通的 Clojure 函数都有较低的调用开销,因为它们都尽量降为静态函数调用。Clojure 还提供了不同风格的运行期多态,例如用multimethods的形式。

Clojure 是一种 LISP 语言,并且具有强大的宏系统。宏可以实现编译期的元编程(compile-time metaprogramming),帮你你把生成代码的工作扔给计算机(而不是写样板文件或者反复手工写 Java 代码)。Clojure 代码最终会编译成 JVM 字节码,并且支持提前(Ahead Of Time,AOT)编译。Azul 的 Cliff Click研究了几种 JVM 语言的性能,其中包括 Clojure 和 JRuby,并提供一些有关 Clojure 性能的信息。总之,Clojure 提供了很大的便利让你用优雅的风格写出运行飞快的代码。

硬币的另一面自然是依赖的问题:使用 Clojure 意味给项目增加一个新的依赖。这究竟是不是个好主意,把 Clojure 这样的语言加入一个工程,是许多团队都会面对的问题。

并发性的解决方案 STM,并且共享数据已经被广泛讨论。Clojure 的创建人Rich Hickey 跟 Azul 的 Cliff Click 有一个很长的讨论,议题就是 STM。关于 STM 的另一个信息来源是去年九月的 ACMQueye 的并发性专刊

你怎么认为:JRuby 和 Clojure——是一对好搭档吗?

查看英文原文:JRuby and Clojure - A Good Match?