2015-09-06 16:44:06 来源:虎嗅网
计算机编程语言未来的发展是怎样的?这是一个充满争议的永恒话题。
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 呢?从长远来看,它是否能发展成一个更普遍的程序语言呢?程序员群体又是否能更大程度地接受它呢?“我不知道,”路易斯这样说,“不过我不认为那是件坏事。”
免责声明:本网站(http://www.ciotimes.com/)内容主要来自原创、合作媒体供稿和第三方投稿,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证有关资料的准确性及可靠性,读者在使用前请进一步核实,并对任何自主决定的行为负责。本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。