为什么 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?
你也许感兴趣的:
- 为什么Clojure不是另外一个Lisp
- 具有魔法的 H.264
- 多用户环境中的 rootless Docker
- 【外评】微软的人工智能聊天机器人将 “回忆 “您在其新 PC 上所做的一切
- 【外评】苹果需要解释重新出现已删除照片的错误
- 你需要知道的现代 CSS 技巧(2024 年春季版)
- 使用 :has() 作为 CSS 父选择器及其他更多内容
- 【外评】大科技公司致欧盟:“去死”
- npm又被滥用,灰产用《庆余年2》盗版资源——把开源公共基础设施的羊毛薅秃了
- 【外评】如果您没有在 Edge 中使用必应,微软现在会说您的电脑需要 “修复”
你对本文的反应是: