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——是一对好搭档吗?
评论