关于编程语言 Julia,开发团队有这些想告诉你

来源: 投稿
作者: 达尔文
2018-08-19 07:57:00

Julia 1.0 正式版发布已过去一周多,官方表示 1.0 版本积累了富有野心的程序员们的十年心血。Julia 可以看作是一门集众家之所长的编程语言,在首次公开时开发团队就已明确其需求:

我们想要一种拥有自由许可的开源语言,同时拥有 C 的速度和 Ruby 的灵活。我们想要一种同像性语言,有像 Lisp 这样真正的宏,也有像 Matlab 这样的浅显熟悉的数学符号。我们想要一门像 Python 一样可用于通用编程,像 R 一样易于统计,像 Perl 一样自然地用于字符串处理,像 Matlab 一样强大的线性代数,像 shell 一样擅长将程序粘合在一起的语言。它简单易学,却能让严苛的黑客为之倾心。我们希望它是交互式的,具备可编译性。

编程语言排行榜每月都有,排名前 10 常见 Java,JavaScript,Python,PHP 和 C#等,大家已不足为奇。但是在 RedMonk 的语言排行榜中,开源编程语言 Julia 成功引起了大家的注意,连续四个季度增长(52,40,39,36),本季度成功升至第36位。

与此同时,Julia 的开发人员在 Reddit 上参与了 AMA(Ask me Anything)你问我答的活动。 Jeff Benzanson,Stefan Karpinski,Alan Edelman,Viral B. Shah 和 Keno Fischer 回答了社区关于该语言创建,成长的一些问题,并透露了一些内幕消息。

先来介绍一下 Julia 开发团队中参与本次 Reddit AMA 活动的主要成员。

  • Jeff Bezanson(JeffBezanson):编程语言爱好者,一直专注于 julia 的子类型(subtyping)、分派(dispatch)和类型推断系统(type inference systems)。让 Jeff 完成在麻省理工学院博士学位(关于 Julia))的是一个与 Julia 相关的 issue(#8839),对该 issue 的修复于2015年与 Julia 0.4 一起发布。他在 Alan 的最后一家创业公司 Interactive Supercomputing 遇到了 Viral 和 Alan。

  • Stefan Karpinski(StefanKarpinski):在加州大学圣巴巴拉分校攻读计算机科学与技术专业,运用数学技术分析计算机的网络流量。Stefan 是 Julia 标准库大部分内容的作者,也是 Julia 软件包管理器 Pkg 的三次迭代中每次迭代的主要设计者。

  • Alan Edelman(AlanEdelman):Alan 是麻省理工学院的数学教授和计算机科学与人工智能实验室的成员,他也是 Julia 公司的首席科学家,Alan 不仅喜欢解释什么是 Julia,还喜欢 Julia 看起来如此简洁而又如此特别。

  • Viral Shah(ViralBShah):Viral 于2007年在加州大学圣巴巴拉分校获得 CS 专业博士学位,但随后于2009年回到印度(同时也开始参与 Julia 的开发),曾与 Nandan Nilekani 一起为印度政府的 Aadhaar 项目工作。他还曾经与人合著过“重启印度(Rebooting India)”这本书。

  • Keno Fischer(loladiro):Keno 参与 Julia 开发工作时还是马里兰州东部一所小高中的交换生,在继续开发 Julia 的同时,他还就读于哈佛大学,并获得物理学硕士学位。他是 Julia 编译器关键部分和许多流行的 Julia 软件包的作者。

Q&A

Q1:由于各种各样的原因,从零开始开发一门语言变得十分困难,其中之一就是如何在无法预料多年后结果的情况下被迫做出设计决策。那么事后看来,你做出的最好和最坏的决定是什么?

>>>jeffbezanson
正如你所说的,从零开始开发一门语言十分困难,这也是我们花了几年时间开发“实验性” 0.x 版本的主要原因之一。大约一年左右的时间,我们会收集有关哪些有效和无效的经验,然后进行重大的变更 —— 有时候会发生很多的变化。我们这样持续做了7个周期,直到我们觉得真的已经可以处理问题。

最好的决定是为 Julia 开发了多分派(multiple dispatch),并使用多分派作为编程范式。在刚开始的短期内,目标尚不明晰,多重方法和外部分派这样的特性看起来十分酷,但我们无法知晓它的强大,以及能给我们带来多大用处。

最糟糕的决定是把终端的所有文字都加粗 :-P 谢天谢地,我们现在已经解决了这个问题。

>>>loladiro
有时候,我很惊讶看似微小的功能会改变语言的使用方式。
在第一个 JuliaCon 大会之后的黑客马拉松中,Tim Holy 和我实现了一个名为生成函数(generated functions)的功能(当时的阶段函数 staged functions),它基本上是一个回到编译器内的钩子,可让你根据参数的类型生成代码。我想要它用于我的 C++ 包(基本上允许 julia 充当 CC++ REPL 的角色),而 Tim 希望它能加速数组。如今,它不再用于数组,因为编译器已经改进到足以使其不必要,但它是 https://github.com/jrevels/Cassette.jl 的基础,这是常见的非标准(non-standard)执行框架 —— 我们计划用于从调试到自动微分(Automatic Differentiation) 的所有内容的框架。

Q2:普遍来说,开源开发者们费力不讨好的工作并没有得到该有的赞赏。所以,首先感谢你们为 Julia 付出的努力!
我的问题是:多年以前,我感觉到 Julia 拥有很强的战斗力 —— 替代 R 和 Python 以将其作为用于数据科学的语言。但最近我感觉到这种势头有所放缓。你们是否同意我的看法,如果是的话,你们觉得重燃这种热情需要怎么做?

>>>loladiro
我不会像以前一样使用“战斗”之类的词语来描述我们和 R 或 Python 之间的关系。我们通过与像 PyCall.jl 和 RCall.jl 这样的集成,以及使用 Jupyter notebooks 一起进行开发,与它们有很好的兼容性。我认为各自都有足够的空间。

关于数据科学这方面,在与其他一些数字应用的领域相比,我承认 Julia 确实是稍有落后。但 1.0 版本,我们尝试做了很多底层的基础工作来改变它。使用 1.0 版本,我们的编译器支持高性能的缺失值(https://julialang.org/blog/2018/06/missing),这是 Julia 数据科学社区呼声的请求之一,所以我也希望使用者能充分利用它,因为这是一项耗费了我们大量付出的工作。

在软件包生态系统方面,像 https://github.com/queryverse/Queryverse.jl 这样的元软件包(meta-packages)开始确保在一个统一的软件包中提供所有不同的功能。还有 https://github.com/JuliaComputing/JuliaDB.jl,如果你碰巧拥有非常大的数据集,可以将其视为 pandas 的分布式核心替代方案。尽管如此,我认为 Julia 的未来非常光明,特别是现在核心语言特性已经稳定,我们可以将更多的注意力集中在核心生态系统建设上。

Q3:你们是否认为在科学计算领域 Julia 可以取代 Python?

我正在研究机器学习,主要是使用 Python 进行编程。一年前我曾尝试过使用 Julia,而且我很喜欢它,但问题是我在 Python 及其库的生态方面投入了大量的精力和时间(我也讨厌 MATLAB 用于转置的运算符)。

你们打算如何说服开发者切换到使用 Julia 进行开发?是否打算将 sklearn 和 pytorch 这些流行的库移植到 Julia。

>>>jeffbezanson
我一直记得 Steve Martin 的一句话:“你要好到让人不得不注意你。”

在生态系统方面,Julia 的优势就是,它的库由纯 Julia 编写,而不是使用 C 或者 C++。这给我们带来许多便利。用 Julia 开发灵活、高性能的库非常容易。所以,功能方面也会慢慢赶上来的。

>>>StefanKarpinski
很多年以前,我想许多人都不会相信 Julia 包的生态系统会发展到如今的状态。在许多领域 Julia 生态系统都做得很好,如优化(optimization)、微分方程(differential equations)、线性代数(linear algebra)、数值分析等。这使得我们能在短时间内赶上并超越其他生态系统。

Julia 已经有了 OpenMP 风格的循环多线程,我们已经准备好合并一个 PR,将任务的 M:N 映射实现到硬件线程上,这将使 Julia 的线程系统与 Go 类似,但我们会将它的计算性能调高而不是用于编写并发服务器(不过你也可以这样做)。

Q4:作为一名 CS 专业的学生,你们是否可以告诉我学习 Julia 而不是业内已经普遍使用的其他任何语言的理由?
我应该在什么类型的项目中使用 Julia?

>>>jeffbezanson
我可以告诉你的是,julia 可以让你接触到异常广泛的编程语言。你可以凭借良好的性能来操作位和字节(并查看汇编代码),然后还可以进行更高级的(相对于汇编的底层)编程,宏和面向对象的设计,它们全都可以组合在一起。开发者会经常需要切换编程语言来完成不同类型的任务,Julia 程序员针对不同的任务使用不同的技术和风格,但保持在同一种语言中进行开发。

>>>StefanKarpinski
补充一下 Jeff Bezanson 提到的“查看汇编代码”
当然,在任何编译型语言中都是如此,但在 Julia 中这十分容易:

julia> f(x, y) = 2x^2 + 3y - 1
f (generic function with 1 method)

julia> f(4, 5)
46

julia> @code_native f(4, 5)
    imulq   %rdi, %rdi
    leaq    (%rsi,%rsi,2), %rax
    leaq    (%rax,%rdi,2), %rax
    addq    $-1, %rax
    retq
    nopw    %cs:(%rax,%rax)

可以看到,Julia 的这种容易程度完全不同 —— 我从来都不想费心去看C中的汇编代码,因为这样做很痛苦,但我一直在看 Julia 汇编代码,因为它的可读性很好,而且我知道很多其他代码也是如此。这既是一种学习工具,也是指导整个生态系统实现卓越性能的一种方式。

Q5:是否有计划为机器学习和 AI 工具包创建一致的环境?也许像 sklearn for Python 这种?
目前看来,Julia 的生态系统仍然比较分散,大多数软件包未能兼容 Julia 1.0
所以,Julia 的路线图是什么,对于项目的将来,你们是如何设想的?

>>>ViralBShah
社区非常关注 Julia 对 AI 的所有合理用途,但重点不是创建另一个框架,而是确保 Julia 可用于机器学习。这几乎可以归结为两件事:对自动微分(Automatic Differentiation)提供很好的支持,以及对硬件加速器上的原生代码生成提供很好的支持(主要是 GPU,但也有越来越多的 TPU 和管道中的各种新东西)。

在 JuliaCon 大会上,Jarrett Revels 宣布了 Cassette.jl(https://github.com/jrevels/Cassette.jl) 和 Capstan.jl(利用 Cassette 编译器增强功能的 AD 软件包)。有了这些软件包,我们现在有了在整个 Julia 应用程序上进行 AD 操作的通用方法。CUDANative.jl 和相关的 GPU 软件包也为我们提供了在 GPU 上运行 Julia 应用程序的通用方法,而底层的重构可以轻松定位 TPU 和其他专用处理器。随着所有这些项目在 1.0 版本趋于稳定,我们认为 Julia 已经成为 AI 研究人员和用户值得关注的语言。

同时,我们有 Mike Innes 开发的 Flux.jl (https://github.com/FluxML/Flux.jl) 和 Deniz Yuret 开发的 Knet.jl (https://github.com/denizyuret/Knet.jl),两者都提供了重要的 AI 功能。目标是实现无框架(Framework-less)AI。只需直接编写 Julia 代码,我们就能对它进行微分操作,将其粘贴到优化器中,在 GPU 上运行 —— 无需新的编程模型(如编写计算图一样),或重新实现所有库的框架。

Q6:当 Julia 能够处理矩阵操作(matrix operations)时,你是否认为大家仍然需要购买 Matlab 许可证?

>>>loladiro
这取决于目前你在进行怎样的开发工作。据我观察,更多的开发者是从定制遗留下来的系统或 C++ 进行迁移,而不是 Matlab。尤其是如果 MatLab 非常适合你的话,根本没有理由要转换。如果你现在要开始一个新项目,Julia 可能会是一个不错的选择,当然其他语言也可能是,比如说 Python。但现在已经没有什么理由要选择 MatLab 来开始一个新项目了。

Q7:首先,我要感谢你们创建 Julia 这样了不起的项目。
对我而言,观看这门伟大的语言如何演变是一个了不起的经历。
如果你们方便回答的话,我有三个问题:

  1. 你能描述一下你们的工作日吗? 语言开发者的日常如何?
    例如,Keno 成为 Julia 编译器的主要开发者意味着什么?

  2. 现在,在桌面端方面,有关 Julia 的下一个重大决定是什么? 你对此有何看法?

  3. 除了 Julia 之外,你最喜欢的编程语言是什么?

>>>loladiro
1.我觉得我们的工作日和其他任何开发者的并无二异,主要区别可能在于在公开场合完成了多少沟通方面的工作。我一天的开始通常花在处理 GitHub issue、电子邮件、交流等这些内容上。之后,我通常会有一个长期持续进行的项目(过去六个月的大部分时间都在重新设计优化器来处理新的迭代协议,和对新的缺失数据的支持),以及需要我处理的一些高优先级错误。然后是各种电话和会议。例如,每周四,我们都会进行一个称为"triage"的电话会议,我们会在这里讨论需要处理的最紧急项目、什么事情影响了发布新版本,并且通常会尝试对陷入困境的事情做出决策。这些电话沟通可能非常激烈(曾经试过持续了六个多小时)。

2.每天都有很多设计方面的决策要确定,但我认为即将到来的最大领域是多线程。我们正在添加对多线程调度协同例程的支持(https://github.com/JuliaLang/julia/pull/22631),并充分利用这一点,因此我们必须弄清楚并行的各个方面内存和执行模型。

3.我并没有真正最喜爱的编程语言,我认为我们可以通过几种语言来取长补短。例如,我真的想对受限制的内存所有权模型(在各种情况下允许更积极的优化)做一些事情,而 Rust 开发者显然已经在那里做了很多思考。当然我们不能完全复制他们的设计,因为我们的用户有不同的期望,但我仍然希望我们可以做些什么。

Q8:Julia 名称的由来,为什么将语言命名为 Julia?

ViralBShah 表示 Julia 来自 Jeff Bezanson 所说的一个较旧的项目,并且背后没有任何意义

但 Jeff Bezanson 的回答是:“1.0 发布时我们发的推特就能说明一切。Julia 来自美国一位著名厨师兼主持人 Julia Child 的名字,我们通过 Julia 把优秀的编程技术带给广大用户,就像她把优秀的做菜技巧带给观众一样。”

Q9:说说 Julia v2.0 的开发计划。

Keno Fischer:v2.0 将优化多线程模型,在分析和调试方面也会带来一些惊人的改变。除此之外,v2.0 的主要重点将是支持核心语言所需的软件包。Julia v2.0 准确发布日期尚未确定,大致时间将安排在 2020-2022 之间。

更多精彩问答请前往 Reddit 查看。

展开阅读全文
点击加入讨论🔥(16) 发布并加入讨论🔥
本篇精彩评论
名字比较长且不好输入(键盘上几乎全右手键位,别扭),没前途。
2018-08-19 17:36
3
举报
没有商业化运转,任何语言都不会有成功的。
2018-08-20 18:29
2
举报
这名字真的不是来自女演员的吗?
2018-08-19 12:43
2
举报
跟rust一样 :: 是个梗
2018-08-20 15:32
1
举报
没找到一个像样的tcp server的示例
2018-08-20 15:19
1
举报
16 评论
13 收藏
分享
返回顶部
顶部