写点什么

Clojure 给 JVM 带来了 STM、LISP

  • 2009-02-01
  • 本文字数:2187 字

    阅读完需:约 7 分钟

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

2009-02-01 06:423502
用户头像

发布了 255 篇内容, 共 58.6 次阅读, 收获喜欢 10 次。

关注

评论

发布
暂无评论
发现更多内容

HTML(二)——用html设置文本

程序员的时光

程序员 28天写作

产品经理训练营-第一章作业

Ryun

你真的知道如何删除list集合中特定元素吗

万里无云

Java List remove

GMT UTC CST ISO 夏令时 时间戳,都是些什么鬼?

YourBatman

ISO 时间戳 GMT UTC

Kafka底层原理剖析(近万字建议收藏)

五分钟学大数据

大数据 kafka

「产品经理训练营」作业01:如果公司要招一个高级版的你

狷介

产品经理训练营

杭州产品岗位现状分析

王振

产品经理训练营-第一次作业

Jophie

产品经理训练营

产品经理训练营第0期 第一次作业

孙行者

第0期 产品经理训练营

28天瞎写的第二百二十二天:五道营胡同的葡萄芽儿

树上

28天写作

Zookeeper面试常见11个连环炮

田维常

面试

产品经理训练营第一章作业

王德文

产品经理训练营

你还在担心搞不定面试官?吃透这份4000道Java面试真题合集,金三银四的黑马就是你了

Java 编程 程序员 面试

高仿书旗小说 Flutter 版,学起来

GitHub指北

现在就开始倒数2030了? 华为的这条线索不能错过

脑极体

产品经理训练营——作业1

小匚

Python 字节跳动 产品经理训练营 极客大学产品经理训练营

安全白帽子可能会为DevSecOps铺平道路

啸天

DevSecOps 应用安全 开发安全

产品经理训练营第一周总结

happy-黑皮

产品经理训练营

第一章 认识产品经理(下)

郭栋

重学JS | cookie和localstorage的哪个更安全?

梁龙先森

面试 大前端 编程语言 28天写作

如果公司要找一个人代替我,该是个咋样的人?

再见陛下

offer

产品经理训练营——第一周总结

小匚

产品经理训练营 极客大学产品经理训练营

产品训练营作业:1、认识产品经理

Geek_06d2e5

细说MAC地址漂移

第一周作业

Geek_72d5ab

下一代消息队列pulsar到底是什么

比伯

Java 编程 架构 面试 计算机

产品经理训练营第一周作业

happy-黑皮

产品经理训练营

JVM性能调优实战:让你的IntelliJ Idea纵享丝滑

Silently9527

Java jvm调优

动力电池知识皮毛(28天写作 Day11/28)

mtfelix

自动驾驶 28天写作 电动汽车

产品训练营第一周作业【撰写岗位模型】

马悦

学习 产品 产品经理训练营

面试官:如果让你设计一个高并发的消息中间件,你会怎么做?

冰河

并发编程 高并发 消息队列 消息中间件

Clojure给JVM带来了STM、LISP_Java_Werner Schuster_InfoQ精选文章