写点什么

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

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

关注

评论

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

30% 代码由 AI 生成,单测准确率达到 90%,我在阿里巴巴国际站推广通义灵码

阿里巴巴云原生

阿里云 云原生 通义灵码

顺应数字化趋势!Flexus X实例助力中小企业开启数字转型“必修课”

轶天下事

中小企业数字化转型难点凸显,华为云Flexus X实例革新上云体验

YG科技

重塑云服务,华为云Flexus X实例破解云服务传统难题

YG科技

顺应数字化浪潮,华为云Flexus X实例助力中小企业破局崛起

轶天下事

华为云Flexus X实例,以创新技术打造中小企业高质量发展新引擎

轶天下事

华为云Flexus X实例创新柔性算力技术,助力企业提质、增效、降本

轶天下事

可观测产品剖析——日志统一管理

嘉为蓝鲸

日志监控 日志管理 日志采集

30% 代码由 AI 生成,单测准确率达到 90%,我在阿里巴巴国际站推广通义灵码

阿里云云效

阿里云 云原生 通义灵码

开发者生产力提升的API终极指南

幂简集成

API

性能易用二合一!华为云Flexus X实例加快中小企数字转型

YG科技

华为云Flexus X实例性能出众,降本显著,促进中小企业高质量发展

YG科技

华为云Flexus X实例全方位为中小企业护航,加速迈进“专精特新”

YG科技

激发云服务效能,华为云Flexus X实例助力破除中小企上云痛点

YG科技

DARPA计划“消灭”C语言代码

我再BUG界嘎嘎乱杀

网络安全 编程语言 C语言 内存安全 DARPA

GitHub星标4000!清华大牛的CTF竞赛入门指南,真的太香了!

我再BUG界嘎嘎乱杀

黑客 网络安全 信息安全 PWN CTF竞赛

华为云Flexus X实例创新柔性算力!直击中小企业数字化转型痛点

轶天下事

华为云Flexus X实例全方位创新,开拓企业数字化发展新边界

YG科技

SpringBoot项目中HTTP请求体只能读一次?试试这方案

小明同学的学长

springboot java

充分发挥数字经济赋能效应,Flexus X实例协助企业高效转型

轶天下事

论如何利用仿真技术轻松攻克电子产品热流体仿真难题

Altair RapidMiner

设计 汽车 电子产品 仿真 altair

解锁携程美食与景点数据接口:打造个性化旅行体验的秘密武器

tbapi

携程API 携程景点列表接口 携程酒店API 携程美食列表API

华为云Flexus X实例:最高6倍算力提升,满足中小企业多元需求

轶天下事

可观测产品剖析——硬件监控

嘉为蓝鲸

运维 监控 数据监测 数据接入

自动化业务状态码设计

三七互娱后端技术团队

效率 自动化 状态码

生成式 AI 时代数据库与大模型的融合探索

编程猫

数字化转型正当时!华为云Flexus X实例助力中小企业高效便捷上云

轶天下事

双倍性能、跃级体验!华为云Flexus X实例助力企业轻松上云

轶天下事

直击中小企业痛点!Flexus X实例让中小企业也可以上好云、用好云

YG科技

掀起性能巨浪:华为云Flexus X实例定义业务负载多面手

YG科技

华为云Flexus X实例依托生态优势,破解中小企业数字化转型困局

YG科技

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