BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

JRuby和Clojure——一对好搭档?

| 作者 Werner Schuster 关注 9 他的粉丝 ,译者 贾晓楠 关注 0 他的粉丝 发布于 2009年3月29日. 估计阅读时间: 5 分钟 | ArchSummit北京2018 共同探讨机器学习、信息安全、微服务治理的关键点

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?

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

错字 by Li Cao

第一节
“其支持用事物代替锁”

Re: 错字 by Li Ming

Fixed. Thanks :-)

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

2 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT