经济型Geek - 采访Clojure创始人Rich Hickey

作者:Dirk Elmendorf

本月专栏偏离了以往报道我与技术斗争的模式。当我开始这个专栏时,我非常期待软件开发专题,因为我希望重点介绍我正在学习的语言——Clojure(发音像“closure”)。但是,我发现自己仍然在努力理解它,而截止日期临近,所以与其在我还在学习的时候试图教你,不如听听语言的创造者 Rich Hickey 的说法更有趣。

Economy Size Geek - Interview with Rich Hickey, Creator of Clojure

Clojure创始人Rich Hickey

DE: 在您开始Clojure项目之前,您是做什么的?

RH: 我是一名顾问,所以我做各种各样的事情。我认为我最近做的一件大事是,我参与了国家出口民意调查。

DE: 在发明您自己的语言之前,您使用过哪些其他语言?

RH: 我做了很长时间的C++开发人员。我曾在纽约大学教过一段时间。我从事调度系统和广播自动化工作,全部使用C++。然后我从那里转向Java和C#。与此同时,我也开始做一些Common Lisp。

DE: 大多数创建自己语言的人都是从头开始的——是什么吸引您做Lisp?

RH: 在使用C++十年后,我发现了Lisp,并对自己说:“我这辈子都在做什么?” 我意识到它对我来说效率更高。我立刻爱上了它。基本上,我对自己说,“在我生命中的某个时刻,这真的是我想做的事情。” 在那之后的几年里,我继续用Java和C#做我的商业工作,但一直希望在某个时候能够将Lisp融入其中。这就是促使我做Clojure的原因,因为我看到.NET或JVM是我遇到的所有客户的要求。Lisp真的无法触及这些平台,所以我决定做一个可以的Lisp。

DE: 为什么把它放在JVM上?

RH: 它的设计是为了对我正在做的工作有用,在这些工作中,您的客户有要求,即某些东西必须在这些标准平台之一上运行——平台不是指操作系统,而是指JVM或.NET等基础设施。

DE: 将其放在JVM上,是否让您摆脱了很多底层工作?

RH: 当然!我的意思是,作为一个与能够访问所有库的实用性分开的考虑因素,在JVM上可以让您在高级语言(这是我关注的重点)和运行时之间实现非常好的关注点分离,而运行时是JVM做得非常出色的事情。它有一个很棒的垃圾收集器和一个非常复杂的运行时编译基础设施。因此,作为一名语言开发人员,您不必担心发出机器代码或任何低级代码。但是,我不仅仅是为了在实现方面更轻松而使用JVM。能够接触和访问底层宿主平台是语言设计的重要组成部分,因为那里有很多价值。

DE: 库是这种价值的一部分,对吗?

RH: 可用的库数量真的非常棒。这意味着作为一种新语言,Clojure从一开始就拥有大量的库。人们不必等待Clojure库来处理套接字、与数据库对话或进行GUI。他们立即拥有了这些库。因此,他们可以立即使用Clojure进行生产。

DE: 您似乎非常务实。您谈到了生产力、库以及如何在日常生活中使用它。这似乎与语言是什么以及它如何适应的不同观点。

RH: 这有点不同。Common Lisp非常强大,这是毋庸置疑的。我只是认为它是在互联网普及之前标准化的。然后在20世纪90年代,市场发生变化,人工智能和Lisp存在的一些其他事物被关闭,因此很难迁移。这实际上与语言无关,但确实导致了一些停滞。因此,重新开始,不兼容,真的给了我一张白纸。作为一名商业开发人员,我知道我需要具备哪些条件才能使其具有实用性。

DE: Clojure不是面向对象的,为什么不呢?

RH: 嗯,它不像Java、C#或C++那样面向对象。这不是您构建事物的方式。在某些方面,这是对我的传承的拒绝,作为一名面向对象的程序员。我认为在做了二十年后,我不再相信它了。我只是不认为这是正确的开始方式。它可以帮助您组织代码,但它带来了一些复杂性,我发现在实际系统中总是会咬你——这与可变性有关。默认情况下,面向对象的程序是一个可变对象的图。这是一个非常、非常难以思考、调试和保持运行的东西。我曾参与过非常大的面向对象的系统,而且您总是会遇到与该架构相关的问题。我认为,即使在您接触到并发之前,可变对象的复杂性问题基本上也会影响到每个大型面向对象的应用程序。当您加入并发时,这些问题变得更加清晰。

因此,即使在我用C#编写的程序中,我也已经开始采用函数式方法。例如,国家出口民意调查系统中有一些部分是非常函数式的,即使它是一个C#系统,因为防御这种复杂性的方法是以更函数式的风格编写,并具有更多的不变性。问题是,在C#或Java中这样做不是很惯用。我想制作一种语言,使其成为惯用方式——默认情况下是做正确的事情。当您需要可变性时,将有一个关于如何与并发兼容地做到这一点的良好故事。

DE: 这就是您内置事务系统的原因吗?

RH: 一旦你说默认情况下所有东西都应该是不可变的,真实系统就不能在所有地方都以这种方式工作。必须有地方让人们看到效果,就好像某些东西正在改变一样。那么你如何模仿呢?Clojure系统说,“好吧,我们将拿一些不可变的东西并将其放入单元格或引用中,我们将从一个不可变的东西到另一个不可变的东西交换该引用中的内容。” 而且,这对程序来说看起来像是变化。它与变量有点不同,因为您向自己承诺,您将永远放入其中的唯一东西是不可变的东西。但是,这为您提供了很好的关注点分离。因为这样您就有了这些不可变的值,您的程序大部分都在操作这些值。您可以对这些引用说,“这就是并发程序中发生的事情。” 其中一件事可能是事务,这就是STM(软件事务内存)。

所以这是一个很好的故事。您可以根据应用程序中将有多少共享在不同的构造之间来回切换。但是,是的,这就是内置它的原因。因为如果没有它,您只会让人们想知道,“好吧,当我需要更改时,我该怎么办?我回到锁吗?”,诸如此类。

DE: Clojure一次引入了很多不同的想法。您如何入门?

RH: 嗯,您从小处着手。我认为大多数人的入门方式是了解Clojure如何使用关联数据结构(Clojure中的映射)。它们在其他语言中被称为字典或哈希。因此,使用过Python和Ruby的人对将对象视为通用字典有很好的感觉。

您将面临挑战,因为您习惯的一些东西不存在了。另一方面,您也获得了很多更简单、更清晰、更适合在一起的东西。因此,您会遇到一些障碍来尝试改变您的习惯,但您会立即获得回报,即程序更容易理解、更容易测试并且更接近您思考问题的方式。

DE: 这就是您看到的力量吗——它使您更容易清楚地编写您试图解决的问题的代码?

RH: 当然。我的意思是,这真的是Lisp或Haskell等最高级函数式语言的优点,程序几乎完全由重要的东西组成。任何不重要的东西,您都可以使其消失。然而,如果您查看Java、C#或C++程序,它充满了不重要的东西——因为您必须这样做或语法和语言而存在的东西。

DE: 嗯,我注意到在2009年5月,你们宣布Clojure为1.0。开源项目似乎经常徘徊在1.0以下。您是如何决定这是1.0的?

RH: 我认为Lisp的一个好处是,您对语言所做的大多数添加实际上并不在语言中,它们只是库。添加起来非常容易,而且不会破坏任何东西。Clojure增长得非常迅速,但却以非破坏性的方式增长,因为新事物只是新事物。如果您不使用它们,它们就不会影响您。

DE: 您发展语言的过程是如何运作的?

RH: 这不是很正式。我正在努力与人们正在做的事情、哪些有效以及哪些需要改进保持联系。有时我想解决性能问题。有时人们需要库中的新东西,我会解决这些问题。这不像有一个大的路线图,因为我真的不相信走得太远。事情是逐步完成的。

DE: 代码是如何进入Clojure的?只有您一个人,还是有一个团队?

RH: 在核心方面,是我一个人。还有另一个人可以应用我批准的补丁。然后contrib的范围更广。在contrib中,我认为大约有十几个人可以提交,并且有100名注册贡献者。

DE: 如何注册成为贡献者?

RH: 您签署一份贡献者协议。它很像Sun使用的那个,然后您就成为贡献者了。

DE: 如果我想为语言做出贡献,我应该从哪里开始?

RH: 嗯,您应该熟悉Clojure已经拥有的东西。通常,您会擅长Clojure的核心,然后您将开始构建应用程序并使用contrib的各个部分。然后,也许您可以找到contrib没有涵盖的东西,并在那里贡献一个全新的库。或者,您会在contrib中找到一些可以增强的东西。您可以与拥有该部分的人交谈,说:“嘿,我有想法”,然后一起工作。这并不困难。没有很多障碍。我认为核心语言更加集中非常重要,因为我认为语言通常不是由团队构建的。您必须有一个愿景,而且您真的不想一次朝多个方向发展。特别是对于Clojure,核心保持非常小对我来说至关重要。在事物的核心保持简单是使其良好的部分原因。

DE: 您对这种增长感到惊讶吗?

RH: 这已经失控了。当我发布它时,我有一个现实的期望,如果10-100人使用它,那将是惊人的。因为这就是您所能期望的全部。但出于某种原因,它起飞了。这不是我预料到的。在我们谈话时,我们的Google群组有2,999名成员。谁能知道会发生这种情况?这太疯狂了。非常疯狂。

DE: 对于您来说,获得一些验证,证明您不是唯一一个想要可以使用Lisp的人,这是否令人兴奋?

RH: 是的,我认为有Lisp方面,然后有很多人使用Clojure,Lisp最初对他们来说是一种障碍。他们不是来寻找Lisp部分的。他们想要动态开发。他们想要不变性。他们想要一个好的并发故事。他们想要函数式编程。Lisp部分不是吸引力所在。

DE: 我注意到在您的一篇帖子中谈到了Clojure in Clojure。这是什么意思?

RH: 嗯,Clojure是从头开始编写的。所以我开始用Java编写它。Clojure的很多引导程序、底层都是用Java编写的。基本数据结构都是用Java编写的,第一个编译器是用Java编写的。然后,一旦您有了编译器和数据结构,您就可以用Clojure编写语言的其余部分。所以我想做的是回到那些用Java编写的部分,并在Clojure存在的情况下用Clojure重写它们。最近,我一直在做很多工作,所以它具有实现自身最低级别部分所需的功能和性能。我们可以回去用Clojure重新实现Clojure。

DE: 那么目标是使您拥有更多惯用的灵活性吗?还是仅仅为了完整性?

RH: 嗯,目标是摆脱Java代码。它证明Clojure具有足够的性能和表现力来完成Java部分所做的一切。另一部分是它将使未来的发展变得更加容易。David Miller一直在将所有Java移植到C#,以将其移植到.NET。因此,当有很多Java时,就会有很多C#。当Clojure的大部分是用Clojure编写的时,只有非常少的部分是特定于Java的。而且,只有那一小部分需要移植到.NET。此外,我认为JavaScript将是Clojure的一个非常重要的目标。因此,将Clojure主要转移到Clojure意味着将移植的占用空间减少到非常小的量,我认为这是一个有价值的目标。

DE: 当您转向这些其他类型的东西时,您是否担心您一直依赖JVM的底层东西?

RH: 整个事情不是要尝试使所有这些平台都相同。而是要说,“好吧,我知道如何在Clojure中快速完成事情。” 而且,当我的目标平台是浏览器时,我也可以在那里利用我对Clojure的了解来做到这一点。当您在JavaScript中时,您仍然希望拥有与Java相同类型的访问主机的能力。您最终会获得大量的专业知识。您将拥有在所有这些地方都适用的库,这些库不是特定于主机的。因此,更轻松和更易于移植是Clojure in Clojure的目标。而且,人们对其进行黑客攻击也会更有趣。

DE: 您的典型Clojure用户是什么样的?

RH: 没有典型的用户。它在背景非常不同的人之间非常分散。您有坚实的Lisper,他们期待能够轻松地接触世界其他地方,他们实际上对Java知之甚少或一无所知。然后您有Java人员,他们希望获得那种表现力和敏捷性,但他们想知道它是否足够可靠,可以完成他们在Java中所做的一切,包括性能和线程。我们从Ruby和Python那里获得了一些人,他们知道他们已经喜欢动态语言,但发现性能或其他问题。或者他们只是想提高自己的水平,更多地了解函数式编程。然后我们将从函数式阵营(Haskell或ML)获得一些人,他们正在寻找在JVM等平台上实现的实用性。最棒的是他们可以互相帮助。

DE: 他们都有不同的部分。您的平台提供了一些他们每个人都可以带来并且他们每个人都需要的东西。

RH: 这是一种很好的表达方式。它造就了一个很棒的社区,那些正在努力学习函数式编程方面的人可以立即转过身来,成为其他人的CLASSPATH专家,因为他懂Java。所以这很棒。我对社区的评价再高也不为过——它太棒了!我认为有很多事情正在发生。很多库。数量和增长是Clojure吸引力的很大一部分。有书籍。一本书已经出版,更多的书正在路上。所以我认为现在在获得大量帮助方面非常容易接近。

DE: 您认为未来有什么让您兴奋的事情?

RH: 我认为对于那些希望利用他们将拥有的所有CPU的人来说,仍然有很多挑战。我对Clojure in Clojure以及它的发展感到兴奋。总的来说,我正在努力解决程序中处理时间的一般问题。我认为这是Clojure的一部分。我仍然有很多关于这方面的想法,我还没有实现。

DE: 当您说程序中的时间时,您是什么意思?

RH: 嗯,当我们谈论事物变化、并发和可变性以及诸如此类的事情时,这些都与时间有关。我认为我们迄今为止拥有的语言对于时间来说还不够明确。因此,我们遇到了很多问题,因为我们没有明确地考虑时间。Clojure使时间变得明确。我想在这方面做更多的工作,因为我认为当我们转向这些多核平台时,这将是一件非常重要的事情。

DE: 那么您是否试图创建其他语言中缺少的东西?

RH: 嗯,我的意思是,我肯定会尽可能多地借鉴我能借鉴的地方。我绝对是站在巨人的肩膀上。但在这一领域,我从不声称Clojure有任何新颖之处。Clojure主要是在于尝试将可能没有组合在一起的现有好想法组合在一起。它当然在Java、C#和C++等更传统的语言中是缺失的。但是,还有其他方法可以解决它,例如在Erlang和Haskell中存在的方法。

DE: 还有什么最后的想法吗?

RH: 我想鼓励大家尝试一下。这是一个热情的社区,初学者总是受欢迎并受到友善的对待。而且,我们很高兴有更多的用户。

资源

如果您有兴趣了解更多信息,请访问主网站 (clojure.org)。

您还可以在 clojure.blip.tv 上查看许多演示文稿。我真的很喜欢“Clojure for Lisp Programmers”,即使我对Lisp非常陌生。

如果您有兴趣了解更多关于Hickey关于程序中时间的看法,请查看他在InfoQ上的“持久数据结构和托管引用”: www.infoq.com/presentations/Value-Identity-State-Rich-Hickey

Dirk Elmendorf 是 Rackspace 的联合创始人,有时是家庭酿酒师,长期Linux倡导者,甚至是更长期的程序员。

加载Disqus评论