分类:
2008-09-10 09:57:02
当前领域最激动人心的事情莫过于可允许其它编程语言运行于虚拟机上。围绕JRuby、Groovy、Scala还有 Rhino(JavaScript引擎)的讨论已经甚嚣尘上。可为什么要墨守陈规呢?如果你真的想跳出主流,投身于一种与Java截然不同的的语言,Lisp就不失为一种很好的选择。现在已有几种可运行于JVM上的Lisp程序设计语言的开源实现,准备好开始我们的探索之旅吧!
Lisp有什么值得研究呢?首先,作为已有50年历史的语言,它促成许多被我们今日视为理所当然的观念。if-then-else结构、早期的面向对象和带垃圾回收的自动内存管理的尝试都来源于此。目前Java程序员的热点话题——词汇闭包(Lexical Closure),最初的探索也是七十年代在Lisp中展开的。除此以外,Lisp还具备其它许多语言至今都未采用的特性,这些出色的思想必将在未来引起复兴潮流。
本文的目标读者是有意了解Lisp的Java开发人员。我们将在接下来的内容中讨论当前可以用在JVM上的不同Lisp方言(dialect),令你快速了解Lisp程序设计工作机理和其独特之处,文章的最后会演示如何将Lisp代码与Java系统进行整合。
目前存在许多可用于不同平台的Lisp系统,有免费的也有商业的。对于想要开始探索Lisp的Java用户,不离开JVM是首选,这样的话起步很容易,还可以很方便的使用所有自己熟悉的Java库和相关工具。
Lisp有两种主要方言(dialect):Common Lisp和Scheme。虽然设计理念大体相似,但是它们的差别仍然足够引起孰优孰劣的激烈争论。
Common Lisp是1991年完成的ANSI标准。统一了几种早期Lisp的理念,是可用于多种应用开发的大型环境,其最为著名的应用是人工智能。而Scheme 产生于学术界,特意进行了精简化设计,经验证是一种很好的语言,既可用于计算机科学教学,又可以作为脚本语言。你还可能会遇到其它一些比较有名的 Lisp:小型的特定于应用的DSLs,如Emacs Lisp或AutoCAD的AutoLISP。
上面提到的两种主要方言(dialect)在JVM上都有相应的实现,相较而言Schemes的实现要成熟一些。Armed Bear Common Lisp()非常彻底的实现了Common Lisp标准,但它存在一个问题,如果你没有安装别的Common List系统,就不能构建分发版本,这对新手可能是个困难。
在Scheme方面,两个主要的产品是Kawa()和SISC(——the Second Interpreter of Scheme Code)。在这篇文章的例子当中,我们会用到Kawa,它实际上是个框架,能创造可编译成Java字节码的新语言。Scheme只是它的实现之一。顺便说一句,Kawa的创建者Per Bothner目前就职于Sun,主要从事JavaFX项目的编译器方面的工作。
另外一个值得一提的竟争对手是Clojure(clojure.sourceforge.net)。这是一种新的语言,其Lisp方言(dialect)介于Scheme和Common Lisp之间。它是直接为JVM量身打造的,因此在上面提到的所有Lisp当中,有着最为清晰Java整合方案。它还具有其它一些激动人心的特性,例如内建的支持并发和事务内存。Clojure目前仍然处于探索阶段,因此在它基础上构建程序还有些为时尚早,但它绝对是一个值得关注的项目。
[1]