网路的发展如何改变了程式语言的进化方向?

网路的发展如何改变了程式语言的进化方向?
计算机程式语言未来的发展是怎样的?这是一个充满争议的永恆话题。

Facebook 的工程师 Louis Brandy 和他的同事们在过去两年里重新打造了垃圾讯息清除系统,这个系统可以从全球最大的社群媒体中移除掉恶意的、有攻击性的或是其他不受欢迎的讯息。这可不是一个小工程——全球有超过 15 亿用户在 Facebook 上发布讯息——为了搞定这个问题, Louis 和团队做出了一个不寻常的选择:他们使用了一种被称为 Haskell 的程式语言。

Haskell

90 年代初,由学术人员组成的某个委员会发明了 Haskell,将其作为一种语言设计上的试验,许多年之后, Haskell 仍旧处在主流程式语言之外的状态。在网际网路最大的软体程式码平台之一 GitHub 上面, Haskell 排名在最受欢迎编程语言的第 23 位。即便如此, Facebook 仍旧选择这种语言用来设计其庞大複杂的反垃圾讯息系统。笔者在 Facebook 位于加州 Menlo Park 的总部採访了 Louis ,试图理解这个技术选择从整体来看对于程式语言的发展意味着什幺。

可能这个问题看上去很幼稚,但是针对一种程式语言某些优点优于另一种语言的直接讨论,都不可避免地会让人感觉有那幺一点点尖刻,尤其是还会涉及到一个更广泛的软体开发者社区。工程师决定使用某个程式语言基于一系列的技术原因,但是同样也有个人因素在内——两种原因又互相联

繫。如果笔者的採访对象过于称讚 Haskell ——或是过分批评——那幺有许多人会叫喊这不公平。他们很可能无论如何都会这幺做。

Louis 是这幺说的,他认为 Haskell 非常适合处理 Facebook 上的垃圾讯息,因为这种语言在同时处理许多不同的任务时,非常高效——而且能够让工程师可以随时对这些计算任务进行编写。 Facebook 这个社群网路实在是太庞大了,垃圾讯息的发送者变幻方法的速度很快, Facebook 的反垃圾引擎需要一边设计完善,一边能够正常运作,而且要快。「延迟是最关键的,我们希望能够马上阻止垃圾讯息的攻击,」他说道,「我们希望在最短的时间里做更多的检查, Haskell 在这一点上很有帮助。」

前瞻

如果我们认为 Facebook 、 Google 和 Amazon 的发展方向代表了整个网路行业的话——也就是说,随着网际网路的不断发展,许多其他线上服务也将会遇到这几家公司现在遇到的问题—— Facebook 的 Haskell 无疑为整个程式开发领域指出了一个方向。这并不意味着 Haskell 在未来几年会大量普及,因为 Haskell 和传统程式语言相比差异太大,经常有工程师用起来有问题;毫无疑问,这一点将会阻碍广泛普及。但是 Facebook 的工作标誌着,其他程式语言将会向 Haskell 的大方向上靠拢。

一些新的程式语言已经在这样做了。 Google Go 和 Mozilla 的 Rust 能够让开发者设计大规模并行程式码,迅速搭建项目。一些编码项目也在为其他语言设计类似 Haskell 的软体库,比如「反应式」 的程式项目 RxJava。

对于一些工程师来说,像 Go 和 Rust 这样的程式语言并不像 Haskell 那幺高效,但是它们更容易学习。而且 Go 和 Rust 至少也在贯彻 Haskell 社区过去 25 年来始终坚持的理念。「Haskell 推进了许多程式语言的发展,」资深工程师 Mathias Biilmann 这样认为,「我想未来也会继续如此。」

纯函数式

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 , Louis 承认 Haskell 的并行计算风格并不适用于所有任务,而且对于一些工程师来说,学起来很困难。但是他很有信心,未来几年这项技术会变得更加重要。「这种技术肯定有潜力,」他说,「每家公司基本上都在写类似的程式。你必须这幺做。你会看到许多程式语言出现,感觉和它一样,在底层机制上。」

「那幺 Haskell 呢?从长远来看,它是否能发展成一个更普遍的程式语言呢?工程师族群又是否能更大程度地接受它呢?「我不知道,」Louis 这样说,「不过我不认为那是件坏事。」

欢迎加入"Inside" Line 官方帐号,关注最新创业、科技、网路、工作讯息
网路的发展如何改变了程式语言的进化方向?
网路的发展如何改变了程式语言的进化方向?

Related Posts