扫码打开虎嗅APP
注:原文来自 Wired,虎嗅编译。
计算机编程语言未来的发展是怎样的?这是一个充满争议的永恒话题。
Facebook 的工程师路易斯 (Louis Brandy) 和他的同事们在过去两年里重新打造了垃圾信息清除系统,这个系统可以从全球最大的社交媒体中移除掉恶意的、有攻击性的或是其他不受欢迎的信息。这可不是一个小工程——全球有超过 15 亿用户在 Facebook 上发布信息——为了搞定这个问题,路易斯和团队做出了一个不寻常的选择:他们使用了一种被称为 Haskell 的编程语言。
Haskell
90 年代初,由学术人员组成的某个委员会发明了 Haskell,将其作为一种语言设计上的试验,许多年之后,Haskell 仍旧处在主流编程语言之外的状态。在互联网最大的软件代码平台之一 GitHub 上面,Haskell 位列最受欢迎编程语言的第 23 位。即便如此,Facebook 仍旧选择这种语言用来设计其庞大复杂的反垃圾信息系统。笔者在 Facebook 位于加州 Menlo Park 的总部采访了路易斯,试图理解这个技术选择从整体来看对于程序语言的发展意味着什么。
可能这个问题看上去很幼稚,但是针对一种程序语言某些优点优于另一种语言的直接讨论,都不可避免地会让人感觉有那么一点点尖刻,尤其是还会涉及到一个更广泛的软件开发者社区。程序员决定使用某个编程语言基于一系列的技术原因,但是同样也有个人因素在内——两种原因又互相联系。如果笔者的采访对象过于称赞 Haskell ——或是过分批评——那么有许多人会叫喊这不公平。他们很可能无论如何都会这么做。
路易斯是这么说的,他认为 Haskell 非常适合处理 Facebook 上的垃圾信息,因为这种语言在同时处理许多不同的任务时,非常高效——而且能够让工程师可以随时对这些计算任务进行编程。Facebook 这个社交网络实在是庞大了,垃圾消息的发送者变换方法的速度很快,Facebook 的反垃圾引擎需要一边设计完善,一边能够正常运作,而且要快。“延迟是最关键的,我们希望能够马上阻止垃圾消息的攻击,”他说道,“我们希望在最短的时间里做更多的检查,Haskell 在这一点上很有帮助。”
前瞻
如果我们认为 Facebook、Google 和 Amazon 的发展方向代表了整个互联网行业的话——也就是说,随着互联网的不断发展,许多其他在线服务也将会遇到这几家公司现在遇到的问题——Facebook 的 Haskell 项目无疑为整个程序开发领域指出了一个方向。这并不意味着 Haskell 在未来几年会大量普及,因为 Haskell 和传统编程语言相比差异太大,经常有程序员用起来有问题;毫无疑问,这一点将会阻碍广泛普及。但是 Facebook 的工作标志着,其他编程语言将会向 Haskell 的大方向上靠拢。
一些新的程序语言已经在这样做了。Google Go 和 Mozilla 的 Rust 能够让开发者设计大规模并行代码,迅速搭建项目。一些编程项目也在为其他语言设计类似 Haskell 的软件库,比如“反应式”(reactive) 的编程项目 RxJava。
对于一些程序员来说,像 Go 和 Rust 这样的编程语言并不像 Haskell 那么高效,但是它们更容易学习。而且 Go 和 Rust 至少也在贯彻 Haskell 社区过去 25 年来始终坚持的理念。“Haskell 推进了许多程序语言的发展,”资深程序员 Mathias Biilmann 这样认为,“我想未来也会继续如此。”
纯函数式 (purely functional)
Biilmann 在旧金山一家创业公司工作,为网站设计软件。有一次,他在设计一个能够让用户打开网站时自动调整图像大小的工具,发现 Haskell 是最理想的编程语言,很大程度上是因为在并发运行程序的时候效率非常高。在一个互联网站点为如此多用户完成如此多不同任务的世界,Haskell 的这个特性非常有价值。“你会收到特别多的图像缩放请求,”Biilmann 介绍说,“必需要能够处理许多并发链接才行。”
Haskell 之所以能做到这一点,是因为它是一种“纯函数式程序语言”。从本质上来讲,开发者基于一系列函数功能设计程序,每一个函数都能够独立于其他来运行。也就是说,你能够用任何需要的方式执行计算,而不需要依序运行程序。
这样做会改进速度,也能帮助开发者想清楚他们在干什么。“大部分编程语言是,你要写:‘首先,做这个。之后,再做那个,’”他解释说,“一旦你用上百个线程同时来做这件事的时候,人类就很难弄清楚到底在发生什么,程序执行的先后顺序又是什么。”
随时编码
这些基本的语言特性正是 Haskell 吸引 Facebook 的地方,后者需要一种程序语言来帮助工程师编写“规则”,判断网站上的垃圾信息。判断垃圾信息需要从来自 Facebook 庞大计算中心中的大量机器提取数据,Haskell 提供了一种快速实现的方式。“在 Haskell 里,同时运行两个函数是很安全的,你知道不会有任何副作用。可对于大部分程序语言来说就不行了,”路易斯说,“Haskell 能够让你将看起来依序排列的代码提出,同时运行他们。”
不仅如此,Facebook 的工程师还可以在不必担心代码将如何运行的情况下去编写“规则”。“我们希望从并发的状态中抽象出来,”Haskell 大师 Simon Marlow 介绍说,“尽管并行处理对于效率很重要,我们却不希望写反垃圾系统的工程师去担心这一点。Haskell 很擅长抽象化。”
Instagram 也使用 Facebook 的系统处理垃圾信息,该公司的工程师介绍,在遭受垃圾信息攻击的时候会随时编写规则,“如果我们使用的是纯函数式的编程语言,完全没有副作用,那么就能更快做出行动。”
对于更大范围的程序世界来说,这一点也很重要。现代互联网服务一定要快速进化,不仅是为了服务不断扩大、变化的用户群,而且要保持竞争状态。
“不是坏事”
现状是:Biilmann 已经不再用 Haskell 了。Haskell 并非完全实用。使用该编程语言的人不够多,而且很难改变这一点。“Haskell 就像一个来自未来的程序语言,但这是一个永远不会到来的未来,”Biilmann 说道,“它解决了所有声称要解决的问题。但是它太过与众不同,不可能成为通用语言。”
如今,在设计需要并发性能的服务时,Biilmann 更倾向于使用 Go 或者 Rust。他说这两种语言不如 Haskell 强大,但是发展方向是对的。而且对于主流程序员来说更适合。“如果今天我要重写图像缩放器的话,很可能会用 Go,”他这样说,“Go 解决了 80% 的问题,而且基本上没有学习曲线。”
在 Facebook ,路易斯承认 Haskell 的并行计算风格并不适用于所有任务,而且对于一些程序员来说,学起来很困难。但是他很有信心,未来几年这项技术会变得更加重要。“这种技术肯定有潜力,”他说,“每家公司基本上都在写类似的代码。你必须这么做。你会看到许多程序语言出现,感觉和它一样,在底层机制上。”
那么 Haskell 呢?从长远来看,它是否能发展成一个更普遍的程序语言呢?程序员群体又是否能更大程度地接受它呢?“我不知道,”路易斯这样说,“不过我不认为那是件坏事。”