Clojure给JVM带来了STM、LISP

Clojure是Lisp语言家庭中的新近成员,运行于Java平台之上。它于2007年面世,并已获得了广泛关注。原因之一在于Clojure解决并发问题的方法是建立于软件事务性内存(STM)之上的。

Stuart Halloway是《Programming Clojure》(由Pragmatic Programmers出版社出版)一书的作者,该书目前尚处于beta版阶段。我们和Stuart就Clojure、STM、工具等内容进行了交谈。

InfoQ:Clojure使用STM来实现并发;你能对STM进行一番简明扼要的介绍吗?

STM是一个更大故事的一部分:针对可变状态的明确API(explicit APIs for mutable state)。通过将代码分成纯函数层和可变层,你可以得到2个极大的好处:
* 你的纯函数代码更容易测试和重用
* 你可以选择符合你的并发性和伸缩性需要的明确可变API(explicit mutable API)。Clojure为不同状况提供了4种不同的API:refs和STM、agents、vars和atoms。此外,你总能向下再深入一层,使用Java并发API。

InfoQ:另一类对Clojure感兴趣的是已经熟悉Lisp的程序员;在尝试使用Clojure时,他们有什么需要注意的?

我对Lisp使用者的建议是“一开始要有耐心。”Clojure是自由的Lisp,不存在和其他Lisp向后兼容的问题。这意味着在实际过程中有很多东西是不同的。一旦你在Clojure上花了些时间,你可能就会同意Rich的设计决策,认为其动机是非常不错的。

Clojure网站已经有了一份文档来说明它和很多其他Lisp的区别。Clojure的创造者Rich Hickey提供了一些幻灯片(PDF链接)来向Java开发者讲解Clojure,以及反过来从Lisp使用者的角度来讲解Clojure。

InfoQ:对于Java使用者,或更普遍的,使用OOP的开发者来说,有什么习惯是他们在使用Clojure时需要抛弃的?

不象其他新的VM热门语言,Clojure*不是*面向对象的。这一开始可能会把人给吓住:“没有对象,我该怎么来设计一个系统?”
但是Clojure*的确*提供了很多你想从OO中得到的东西:
* 封装(通过名字空间、私有定义和闭包)
* 强大的多态(multimethods)
* 函数重用比继承更胜一筹。(函数和不可变状态组合比继承层次更优。)
Clojure和众多OO语言的区别在于:OO语言提供的是套餐,选择有限;而Clojure提供的则是散餐,可照单随意选择。

InfoQ:对于Lisp的初学者,你有什么资源可推荐的(当然,除了你的书之外)?

Clojure和很多好思想联系紧密。除了《Programming Clojure》之外,我会推荐
* Seibel的《Practical Common Lisp》很适合想尽快提高Lisp的人
* Graham的《On Lisp》有助于了解Lisp的宏
* Goetz等人所写的《Java Concurrency in Practice》讨论了并发性
* O'Sullivan等人所写的《Real World Haskell》可帮助了解函数编程
* Abelson和Sussman的《Structure and Interpretation of Computer Programs》,因为每个人都应该读一读它

附注:这些书大多数同时还是可在线免费获得的:《Practical Common Lisp》、《On Lisp》、《Real World Haskell》和《SICP》。

InfoQ:Clojure开发者应该避免哪些旧的Lisp模式/实践?(如,不要到处都使用list,取而代之尽量优先使用Clojure的数据结构,如maps、vectors等?)。

你真是说到了这个问题的点子上。在Clojure中,list主要是用于代码。至于数据,则要根据不同情况选择合适的结构,拥抱sequences库。不要害怕直接调用Java API。

InfoQ:Clojure的库生态系统怎样?

对于任一已知需求(Web开发、数据库存取、测试、BDD)都有3到4个即将面世的Clojure库。这本书中“Clojure in the Wild”一章对它们进行了简要的介绍,并进一步提供了使用test-is测试框架和Compojure的例子。

在Clojure的邮件列表中,Rich Hickey最近要求Clojure库的维护者报告他们正在开发的库。在GitHub中的Clojure语言分类下可找到大量的Clojure项目。

InfoQ:你愿意看到一个多平台的Clojure(不只是针对于Java平台的Clojure)出现吗?

不愿意。Clojure和Java的紧密集成是其动力的关键。当然,我很高兴看到与.NET平台有关的实用Lisp——但它不应该是Clojure。

InfoQ:你使用什么工具来进行Clojure编程?

我使用Emacs,偶尔再加上SLIME。但我已经是一名Emacs使用者了,因而上述选择显而易见。另外,还存在针对于vi、Eclipse、IDEA和NetBeans的插件。

支持Clojure的一些IDE/编辑器的例子是:clojure-dev(Eclipse)、clojure-intellij-plugin(IntelliJ)、enclojure(NetBeans)。Gorilla(VIM),它类似SLIME(Emacs)(Bill Clementson已经写了一篇在Emacs和SLIME中配置Clojure环境的指南)。

由于很多这些工具都需要完成类似的工作,已经出现了关于在这些工具的一个公共后台之上进行合作的呼声。一种选择是采用类似SLIME和Gorilla的做法,即运行一个Clojure实例,然后通过查询它来完成文档查看(Clojure符号将它们的文档字符串作为元数据携带),代码查看、名字空间浏览等工作。

InfoQ:你现在会在复杂的商业项目中使用Clojure吗?

如果身处一个敏捷团队,有好的测试套件,我目前会毫不犹豫的将Clojure用于产品环境之中。

InfoQ最近报道了一个将Clojure应用投入生产环境的例子。(InfoQ上更多关于Clojure的内容)。

你会考虑Clojure吗?Clojure的哪方面最让你感兴趣——它的Lisp血统、STM或其他?

查看英文原文:Clojure Brings STM, LISP to the JVM

你可能感兴趣的:(Clojure给JVM带来了STM、LISP)