2018 年 8 月初,随着的 版本发布的消息确认,一门名为“Julia”的高性能动态编程语言一夜之间刷爆了朋友圈和 GitHub。2018 年 12 月,Julia 的创始团队被授予 James H. Wilkinson Prize,对他们创建 Julia 这一可用于分析和解决计算科学问题的高性能工具,加以表彰。
图 | Julia 语言的团队部分成员即获奖人(来源:MIT News)
这个编程语言的新版本之所以受到整个人工智能界的关注,最主要的原因正是其将 C 语言的速度、Ruby 的灵活、Python 的通用性前所未有地结合在一起,支持并行处理,易于学习和使用,尤其适合科学和工程计算。
更早之前,在今年 TOIBE 8 月份编程语言排行榜上,Julia 已迅速攀升至第 50 名。根据 Julia 开发团队的说法,在七项基础算法的测试中,Julia 比 Python 快 20 倍,比 R 快 100 倍,比 Matlab 快 93 倍。也有越来越多的人相信,Julia 会成为未来的主流编程语言。
图丨在过去的三个月中,Julia 在 RedMonk 的排名中上升了三位,排名第 36 位(来源:RedMonk)
Julia 的崛起,与目前编程语言发展遭遇的瓶颈息息相关:随着人工智能尤其是机器学习的兴起,现实世界对计算的速度及性能要求也越来越高,不同的编程语言由于自身的局限性难以兼顾,例如说,在 Julia 诞生之前,很多人不得不把同样的程序进行多次处理:首先使用 Python 或 R 这样的语言来开发一种算法,并通过这些语言制作图表,然后再用 C++或 Java 改写程序,以获得更好的计算机处理性能。
突破这种瓶颈无疑有两个方向,一是基于现有编程语言进行优化,二是“将革命进行到底”——专门开发一门新语言。后者自然成本更高。
Julia 的开发人员显然选择了后者,而且他们的野心不小:Julia 被专门设计为用于快速运行基础数学,这正是大多数数据科学的基础,如矩阵表达式和线性代数。
它的诞生可追溯到 2009 年。当时,正是基于对现有编程语言的“不满”,麻省理工学院启动了一个新型编程语言开发计划,到了 2012 年的时候,这个计划有了初步的成果,也就是如今的 Julia。
图 | 麻省理工学院 Julia 实验室(来源:Julia 实验室官网)
具体而言,Julia 项目由麻省理工学院教授Alan Edelman领导,另外几位关键创造者则包括Jeff Bezanson(“Julia”名字来自于 Bezanson 的一个旧项目)、Stefan Karpinski 和 Viral Shah。其大部分关键发展成果都来自麻省理工学院的 Julia 实验室,也有超过 700 名志愿者参与了 版本的制作。
“我们想开发一种开源的编程语言,我们希望这门语言有 C 语言一样的速度、R 语言一样的灵活性,有同像性(homoiconicity), 有像 Lisp 语言那样拥有真正的宏特性,但是也像 Matlab 一样有易于理解、被人所熟悉的数学标记。我们希望它像 Python 一样易用,像 R 语言一样适用于统计,像 Perl 一样适用于字符串处理,处理线性代数像 Matlab 一样强大,像 DOS 命令一样擅长粘合程序。这似乎看起来简单易学,但是想要让黑客乐意去迎合它却不是简单之事。我们希望它具有互动性且能够被编译”,在《Why we created Julia》这篇文章中,Julia 团队如此解释他们开发这个语言的初衷。
图丨Viral Shah(来源:DT 君)
Viral Shah 也曾经表示:“如果你是一名数学家、科学家或者工程师,你可以选择一种速度快的语言,比如 C++或 Java,又或是任意一种容易学习的语言,比如 Matlab,R,或 Python,所以我们创造了 Julia 这种又快又便捷的语言。”如今,他已经成为 Julia Computing 公司的 CEO,该公司致力于帮助其他公司使用 Julia 语言。
当然,Julia 的问世,除了让人感慨 IT 行业发展之快、推陈出新之迅猛,另一方面也向所有人提出了一个新的问题:我究竟要不要学习这门新语言。这个问题将非常重要,就像 Y-Combinator 的联合创始人 Paul Graham 所说的,“当你可以选择你要用的编程语言时,不使用最强的那一种将是一个错误”。
近日,DT 君独家采访了上文提到的 Julia 开发团队的四位创始人员。Julia 能否成为主流编程语言,以及它是否值得学习,许多关于 Julia 的疑问,或许你能从创始团队的回答中找到答案。
图丨Alan Edelman(来源:麻省理工学院官网)
一、在团队看来,Julia 语言的核心创新点是什么?
开发一种基于多分派(Multiple dispatch)的语言。在最初的一段时间里,我们并不 100% 清楚怎么做。多方法和外部调度看起来很酷,但我们不清楚它们有多么有用和强大。
重视多分派特性改变了我们编程语言的编程方式。这是一件很奇怪的事情,因为当人们问“多重调度有什么了不起?”时,很难具体回答有什么特别的地方,但是一旦你习惯了这种特性,就很难回头了。
除了高性能,Julia 还有一些与众不同的特性。例如,Julia 能够访问异常广泛的编程堆栈。你可以以良好的性能操作比特和字节(并查看汇编代码),同时也可以处理高阶函数、设计宏定义、进行面向对象编程,所有这一切都可以很好地融合在一起。剥离这些层也很容易。为完成不同任务,人们经常需要转换语言。Julia 程序员对不同的任务或许使用的技术和样式不同,但完全可以使用相同的语言(即 Julia)。
二、在 Julia 的开发过程中,哪一部分投入的精力最多?有什么遵循的标准吗?
设计并搞清楚内部的工作原理总是最花时间的。
开发好的编程语言的关键是设计一组简单、强大的原语,能够很好地执行,然后根据这些原语定义所需的大部分功能。在语言开发的早期,添加许多“内置”结构似乎是个好主意,但在编写优化编译器时,这些结构可能会带来很多麻烦。用一种语言本身编写该语言的标准库既有利于性能(从长远来看),也可以提供宝贵的使用语言的经验,这些经验又可以反馈到语言的设计中。当一个函数运行得太慢时,我们会去看检查一下是否可以改进编译器让函数运行得更快。反复如此,我们不仅可以改善这个函数,还可以解决一系列类似的问题。
三、Julia 具体是如何实现同时具备 Python 的简单、C 语言的执行速度、R 语言一样的数据分析库支持?
正如上一个问题,简单性来自于有少量精心选择的原语。自动垃圾收集(一种计算机内存管理手段)对语言的可用性也有很大的贡献,这一点在编程语言领域已经是很久以来的共识了。
为提高速度,我们研究了所有使大多数动态语言变慢的因素,并仔细考虑了哪些因素可以消除。例如,动态语言通常允许数组元素和对象字段保存任何类型的值。然而,研究表明,即使在这些语言中,具有常量类型的同构数组和字段也非常普遍。因此,设计 Julia 利用了这一点,更容易添加类型限制,并在任何可能的情况下默认使用类型统一的集合。
四、Julia 目前宣称和 C 语言一样快。但是否在所有情况下都是这么快?还是只在数据处理的时候和 C 一样快?和目前主流语言如 Python、C 等的兼容性如何?
是的,对于大多数用例,Julia 可以和 C 一样快。不过必须注意避免过度的内存分配,并确保代码是类型稳定的。Julia 提供了各种各样的工具,编程者无需花费太多精力就可以编写高性能的像 C 一样快的代码。
调用 C 和 Fortran 在 Julia 中是本地的——甚至不需要提供编译器。可以运行下面的代码完成调用:
julia> ccall(:clock, Int32, ())
2539697
同样, 使得调用 C++库、模板等变得非常容易。我们可以通过 和 这样的集成接口调用 Python 和 R。反过来,Python 和 R 通过调用 PyJulia 和 RJulia 包来调用 Julia 语言。 可以让 Julia 调用 Java。我们也有一个干净清晰的嵌入编程接口,让任何其他语言都很容易地调用 Julia。
五、从实际应用来说,Julia 已经用于自动驾驶汽车、机器人和 3D 打印机,此外还广泛应用于精准医疗、增强现实、基因组学及风险管理。那么 Julia 语言本身适合什么应用? 团队有没有自己特别看好的一个实际应用方向?为什么?
我们一直致力于构建一种通用语言,这种语言对于所有形式的数学计算都有很好的抽象。因此,看到各种各样领域应用的蓬勃发展比看到任何一个特定应用的蓬勃发展更让我们兴奋。
(来源:Julia 官网)
六、目前 Julia 语言主打科学计算,下载者包括谷歌、Facebook 和美国能源部等各个部门的开发者。未来,Julia 是否会扩展其目标人群,用于更多面向对象程序设计?公布了 以后,有没有来自一些用户的收获或反馈?
Julia 的目标受众在过去几年里每 9 个月就会翻一番。我们认为,多分派、通用函数和专门化的语言特性是为该语言的用户精心设计的。
Julia 在 GitHub 上已经收到了超过 700 名开发者的贡献。许多人贡献超过 2000 个包。我们估计大约有 30 名核心开发人员对 Julia 语言本身贡献了大量工作。
在用户方面,Julia 的下载量超过 200 万次。作为一种开放源码语言,很难将这个数字转换为真实用户数量。此外,在 Julia Computing 方面,我们看到来自 700 所大学和 1000 多家公司的用户下载或使用了 Julia。Julia 非常受欢迎,语言社区会追求长期稳定,每个人都为此感到兴奋。我们也受到非常多的反馈,有中文的也有英文的。对于 ,在考虑添加新特性之前,我们将关注长期稳定性。
七、团队目前对 Julia 在商业项目应用上有何计划?
所有 Julia 的创建者都聚集在一起,形成了遵循开源商业模式的 Julia Computing 公司。Julia Computing 公司的产品已经被成千上万的用户下载,JuliaBox 被广泛用于 Julia 的教学。
此外,Julia Computing 为许多企业提供开发人员和生产支持,并为全球用户提供培训和咨询。
八、用 Julia 写的项目中,哪一个让你们觉得印象最深刻?
最印象深刻的包是以下几个:
用于数学优化研究的 JuMP:
用于微分方程相关的 DiffEq:
用于机器学习的 Flux:
另一个用于机器学习(深度学习)的 Knet:
除此之外,这些包也都非常有用:
Revise 包,真的太棒了,Tim Holy 是个天才!:
https://github.com/timholy/Revise.jl
BenchmarkTools,一个测试性能相关的包:https://github.com/JuliaCI/BenchmarkTools.jl
StaticArrays 包,这个包很可能作为标准库:https://github.com/JuliaArrays/StaticArrays.jl
UnicodePlots 包,唯一一个到处都能可靠安装使用的画图的包:
图丨Julia 团队(来源:vccircle)
九、Julia 在中国的开发者中引起了很大的讨论,但有人认为 Julia 本身又没有很强的推广力度,可能很难有公司会将 Julia 使用在商业项目上,对于这种说法团队怎么看?
Julia 是一种“草根”语言,是由真正喜欢开发和使用它的人开发出来的。也许将来一些更大的公司会采用它——但我们认为这不是成功的必要条件。Python、PHP、Perl、Ruby、Lua 等语言都不是由任何组织推动的。至少从目前来说,它是由社区开发的,这也是它能吸引用户的原因。
十、Julia 的野心很大,想要集成多种语言的优点,规避掉这些语言不足的地方。不过一个语言是否值得我们学习,还要看它的学习氛围、市场环境以及具体适用的场景,目前团队认为 Julia 在这些方面还存在哪些不足?现阶段最大的挑战是什么?下一个版本计划将优先解决哪些问题?
近期我们一直在努力的方向是提升编译器的效率。
开发一种具有高度抽象并且能够在各种硬件上工作的快速语言的时机已经成熟。我们将关注当前特性的稳定性,但也会添加新特性。
一个主要考虑的特性是多线程。虽然我们今天已经有了多线程功能,但它还不能以一种每一个库和用户代码都可以并行的方式进行组合(很少有语言有这种情况)。英特尔的 Kiran Pamnany 已经发出了拉取请求(pull request),要求实现这一目标。我们还将关注我们的 GPU 支持、谷歌的 TPU 和各种新硬件。此外,将来还会有相当多的人关注开发工具。
十一、团队心目中最理想的科学计算语言是什么样的?
我们还有很多事情还需要去做。在硬件方面,在最大的超级计算机上工作、在 GPU 上工作对于大型科学应用是必不可少的。机器学习应用程序正在驱动硬件的发展,这将给软件开发人员带来许多挑战。在 ARM 处理器和嵌入式硬件上运行 Julia 对于设备部署也是至关重要的,因为机器学习算法在物联网应用程序上也越来越常见了。
多线程目前也是一个尚未解决的问题,对科学用例的可组合性还未能让人满意。这是我们希望在不久的将来解决的问题,设计基于 Cilk 编译器。
Julia 创建者将来华,出席 EmTech China