为什么 Jepsen 使用 Clojure 编写?

人们一直在问为什么 Jepsen 是用 Clojure 写的,所以我认为值得给出一个可参考的答案。我用二十种语言编写过程序。为什么选择奇怪 Lisp 类编程语言?

Jepsen 是为测试并发系统(主要是数据库)而构建的。因为要测试并发系统,所以语言本身需要良好的并发支持。Clojure 不可变、持久的数据结构让编写正确的并发程序变得更容易,而且语言和运行时都有出色的并发支持:真线程、promises、 futures、 atoms、锁、队列、cyclic barriers、所有 java.util.concurrent 等。我也曾考虑过对副作用有更严格控制的语言(如 Haskell),但最终还是觉得 Clojure 不那么教条的方法更可取。

由于 Jepsen 要测试数据库,因此需要广泛的客户端支持。几乎每个数据库都有一个 JVM 客户端,通常是用 Java 编写的,而 Clojure 具有良好的 Java 互操作性。

由于测试是一项实验性工作,我需要一种简洁、适应性强、适合原型开发的语言。Clojure 是一种简洁的语言,它的语法灵活性,尤其是它的宏系统,很好地实现了这一点。尤其是线程宏让链式转换变得可读,宏还能实现可重用的错误处理并轻松控制资源范围。Clojure REPL 在探索测试运行产生的数据时非常方便。

测试涉及表示、转换和检查复杂的嵌套数据结构。Clojure 的数据结构和标准库函数可能是我见过的最好的。我还将大量结构打印到控制台和文件中:Clojure 的数据语法(EDN)在这方面非常出色。

由于测试需要处理大量的数据,我需要一种性能 “足够好 “的语言。Clojure 当然不是最快的语言,但常用的 Clojure 性能通常在 Java 的一两个数量级之内,而且我可以在关键的地方缩小差距。JVM 拥有出色的剖析工具,这些工具在 Clojure 中也能很好地发挥作用。

Jepsen(天哪)已经有十年历史了:我想要一种内核成熟、强调稳定性的语言。无论从 JVM 目标还是语言本身来看,Clojure 都非常稳定。库不会像 Scala 或 Ruby 那样迅速 “腐烂”。

Clojure 确实有很大的缺点。它的工程社区规模小,没有(广为接受的、成功的)静态类型系统。这两点都会制约一个庞大的团队,但 Jepsen 的维护和使用人员每次只有 1-3 人。如果不使用 Java,使用 JVM primitive 可能会令人沮丧;我偶尔也会这样做。多态性系统的某些方面存在不足,但可以通过库来解决。错误信息非常糟糕。我对此毫无歉意。 😉

在选择 Clojure 之前,我用几种不同的语言对 Jepsen 进行了原型开发。十年过去了,我觉得这是个不错的选择。

本文文字及图片出自 Why is Jepsen Written in Clojure?

你也许感兴趣的:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注