红帽白皮书新鲜出炉!点击获取,让你的云战略更胜一筹! 了解详情
写点什么

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:423313
用户头像

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

关注

评论

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

当我们谈注册中心时谈什么?

捉虫大师

zookeeper nacos 注册中心

程序员陪娃系列——育儿路上二三事续

孙苏勇

程序员 陪伴 随笔杂谈

LeetCode题解:21. 合并两个有序链表,递归,JavaScript,详细注释

Lee Chen

大前端 LeetCode

主权投资基金或有助于实现可持续发展目标

CECBC

贵州:“区块链+”促经济转型产业升级

CECBC

内存总是不够?HBase&GeoMesa配置优化了解一下

华为云开发者联盟

内存模型 内存 HBase 大集群 GeoMesa

程序员陪娃系列——小娃的到来

孙苏勇

程序员 陪伴 随笔杂谈

week 10

Geek_2e7dd7

学生党学编程,有这个开源项目就够了!

JackTian

GitHub 学习 编程 程序员 学生党

联盟链落地与激励机制

CECBC

移卡荣登2020「AI 最佳成长榜」,AI+金融科技赋能商业服务

DT极客

MySQL“被动”性能优化汇总!

王磊

MySQL

F5G的星光闪烁,为工业而明,向未来而歌

脑极体

Linkerd 2.8 - 實現超級簡單又安全的多叢集(multicluster) Kubernetes 架構

Rammus

Kubernetes DevOps 运维 云原生 Service Mesh

程序员陪娃系列——小小免费按摩师

孙苏勇

程序员 陪伴 随笔杂谈

程序员陪娃系列——见你的第一面

孙苏勇

程序员 陪伴 随笔杂谈

使用 supervisor 配置 ngrok 内网穿透为守护进程

jerry.mei

Linux 操作系统 ngrok 守护进程 内网穿透

多角度分析,通讯时序数据的预测与异常检测挑战

华为云开发者联盟

时序数据库 即时通讯 异常检测 网络智能体 时序预测

构造、析构期间被调虚函数发生的惨案,长教训!

华为云开发者联盟

代码 组合模式 封装、继承、多态 bug 回调函数

【漫画】最近,老王又双叒get了CDN的新技能—可编程化敏捷开发

阿里云Edge Plus

CDN

libuv 异步网络编程之 TCP helloworld

Huayra

网络编程 libuv

超英文邮件50%!Flink 中文邮件列表必须有姓名

Apache Flink

flink

太赞了!程序员应该访问的最佳网站都在这里了!

JackTian

GitHub 学习 编程 程序员 网站平台

趣文:那天我被拉入 C++ 亲友群

程序员生活志

c c++ 程序员

程序员陪娃系列——和孩子聊生死

孙苏勇

程序员 陪伴 随笔杂谈

程序员陪娃系列——育儿路上二三事

孙苏勇

程序员 陪伴 随笔杂谈

BIGO技术:实时计算平台建设

InfoQ_3597a20b53cc

互联网 BIGO

数据库外键

will

数据库 性能 外键

入职两周,怀疑自己进了假百度!跟传说中完全不一样!难道真有两家百度公司?

程序员生活志

百度 程序员

低代码平台会让程序员失业?测评了5个工具,谁能让效率提高N倍?

代码制造者

编程 编程语言 低代码 零代码 测评

煌煌中原 化鲲为鹏

脑极体

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