诞生于2007年的Clojure是JVM平台上的Lisp实现,Lisp 以强大的功能和表达性而著称,但应用范围存在着固定的局限,于是发起人Rich Hickey设计Clojure的初衷便是希望得到一门能够服务于高并发应用场景,较Lisp更为先进的函数式编程语言。
Clojure 保持了函数式语言的主要特点,同时避免了不稳定状态、递归和高阶函数。Clojure在语法上非常简单,其设计优势在于,让开发者绝大部分工作专注在真正解决问题上,而非耗费在如何模块化设计和如何进行解耦层面上。与Lisp语言相似,Clojure也是基于S-表达式设计。S-表达式给出了表达半结构化数据的约定,以其在Lisp 语言中的广泛应用而为人熟知。S-表达式在Lisp 中既用作代码,也用作数据,其最通用的特性是使用S- 表达式作为括号化的前缀表示。
与JRuby 、Jython 、Scala等依托于JVM 运行的语言相同,Clojure 是运行在Java虚拟机平台上的Lisp 方言,能够直接调用Java 类库,借助JVM 平台广泛的适用性,为Clojure语言的应用拓展了空间。此外,Clojure 可以说是社区智慧的结晶,在Rich Hickey等核心开发者之外,Clojure 语言的补丁、文档、测试和不少新功能的开发思路都是来自于开源社区参与者的贡献。
Clojure 之所以受到广泛关注,最主要的原因来自于其并发特点,如支持软件事务存储(Software Transactional Memory,STM )等特性。在实际应用方面,站点FlightCaster为用户提供了航班延误的预告信息,同时也为iPhone和Blackberry提供了终端应用。FlightCaster的Web前台用Rails 实现并部署在Heroku上,后台数据分析和处理程序则由Clojure实现,同时在后台使用了Hadoop、Cascading、Cloudera等工具。在FlightCaster 站点中,数据预处理并转换成适当视图用以分析的操作,以及所有统计推断和机器学习代码都使用Clojure 实现。FlightCaster站点将Clojure数据结构用作通信和存储的中间表示,Clojure 代码分析得到的航班预告模型,以Json中间格式来表示,然后推送到Rails 前端,以Json格式读取数据并展示给用户。
对于Clojure 开发者来说,开发工具首选是使用NetBeans IDE的Enclojure插件,Enclojure 提供了支撑Clojure 开发的一组类库,包含独立的REPL(Read/Evaluate/Print/Loop)支持,同时支持REPL 和远程JVM 建立连接。Enclojure 提供的编辑器支持具备语法高亮显示、函数声明定位,S-表达式导航,Lisp 风格缩排,代码结构化导航,内置项目模板,断点设置和单步调试,并能够对代码错误给出超链接提示。此外Eclipse 也提供了专门的Clojure 语言开发插件CounterClockwise,在源代码编辑,代码调试,REPL 支持方面也有独到之处,适合于习惯于Eclipse 的开发者使用。
本文曾发表于《程序员》杂志-2010年09期-“程序天下事”栏目。