麻省理工学院孵化的 Julia 语言的的三个作者获得 2019年的 James H.
Wilkinson
数字软件奖。

数百种编程语言,各有优劣,各自也都有自己最为适用的场景。那么就科学计算领域而言,主流的
MATLAB、Julia、Python
会有哪些最为独特的优势呢?又存在哪些让开发者无力的缺陷?在本文中,我们将对三者进行全面对比与解析,探索科学计算各个场景中最佳的编程语言。

图片 1

Julia 是由 Jeff Bezanson
博士、前麻省理工学院 Julia Lab
研究院Stefan Karpinski和Viral B.
Shah和艾伦埃德尔曼教授于2009年建立,是计算机科学和人工智能实验室(CSAIL)和数学系的成员之一。

图片 2

3月9日,美国麻省理工学院终身教授方绚莱博士应邀来校参加;百年机械,名家论坛系列学术交流活动,并作了题为;ArchitecturedMetamaterials:From
Tunable Thermal Expansion to Vascular Tissue
Scaffolding的学术报告。200余名师生参加学术交流,校长段献忠出席相关活动。

Julia 于 2012 年公布去,下载量超过 300 万,并在超过 1500
所大学的时候用于科学计算。「我为 Julia
实验室的贡献感到自豪,该实验室将最新的计算机科学应用于科学和工程问题,同时参与学校内外的跨学科合作,Julia
越来越多地成为麻省理工学院科学计算教学的语言。」Edelman 说。

作者 |Toby Driscoll

方绚莱教授围绕3D打印微纳制造技术,结合其团队近几年的研究成果,从微纳米尺度超材料的结构设计、成型制造和性能测试等三个方面揭示了轻量化多功能微纳米尺度超材料的巨大应用前景。方绚莱教授在报告中特别指出微纳米尺度超材料在微机电系统、生物医疗、组织工程、微型传感器等众多领域中的广泛应用前景,并展示了其团队利用3D打印技术制造的典型结构样品。

该奖项自从 1999 年以来首次回归你麻省理工学院,当时 Matteo Frigo
博士和Steven
Johnson教授获得了傅里叶变换奖。Wilkinson
奖每 4 年授予以为杰出的数字软件作者,旨在表彰科学计算领域的软件创新。

出品 | CSDN

随后,方绚莱教授参观了我校汽车车身先进设计制造国家重点实验室、微纳加工实验室。

根据Wilkinson奖委员会的一份声明,「Julia
允许研究人员用直观的语法编写高级代码,并以很快的速度生成代码」julia
已经被科学计算届广泛采用,包括天文学、经济学、深度学习、能源优化和医学等领域。联邦航空管理局选择
Julia
作为下一代机载防撞系统的语言。

以下为译文:

阅读延伸:

该奖项将于2019年2月25日至3月1日在华盛顿斯波坎市的工业与应用数学学会(SIAM)计算机与工程会议(CSE19)上颁发。

我使用MATLAB已经超过25年了。(在此之前,我甚至使用了MATRIXx,一个末期的,不值得尝试的分支,或者可能是一个噱头)这不是我学习编程的第一种语言,但是凭借它我进入数学方法时代,了解MATLAB对我的职业生涯非常有益。

方绚莱,美国麻省理工学院机械工程系终身教授,麻省理工学院纳米光电及3D纳米生产技术实验室创始人、主任;主要研究领域为微纳先进制造和微纳光子学,包括显微立体光刻,显示材料的纳米压印等。1996年获南京大学物理学学士学位,1998年获南京大学物理学硕士学位,并于2004年在加州大学洛杉矶分校获得博士学位;2004年至2010年在伊利诺伊大学厄巴纳-香槟分校任助理教授,并于2011年赴麻省理工学院机械工程系从事微纳技术相关的教学研究。方绚莱教授在国际知名刊物上发表超过100篇论文,获得11项专利,被引用次数超过11000次,包括Science
3篇,Nature Materials 3篇, Nature Communications 2篇和 Physical Review
Letter
6篇;担任包括《科学》、《自然-材料学》、《自然-纳米技术》等在内的五十余个国际科学刊物审稿人。获得包括美国机械工程师协会Pi
Tau-Sigma金奖、麻省理工学院年度全球35名35岁以下顶级发明人奖、国际光学委员会Ernest
Abbe 奖章以及国际纳米制造协会Fellow等在内的诸多的荣誉和奖项。

编译自:

但是,Python的兴起在科学计算中已经不可忽视。MathWorks一定有相同的感觉:它们不仅增加了在MATLAB中直接调用Python的能力,而且还采用了一些语言特性,例如对二元运算符的操作进行更积极广播。

(文/开源中国)    

这已经达到了我一直质疑我在研究和教学中继续使用MATLAB的程度。虽然大部分对我来说很容易,而且为此我投入了很多精力,但是很难鼓起勇气去真正学习新的东西。

我编写过基于MATLAB的教科书(可作入门计算数学参考书)。这本书有超过40个函数和160个计算实例,它涵盖了我认为使用MATLAB进行数值科学计算的全面基础。部分是为了自我提升,部分是为了为了增加这本书的实用性。我今年开始将代码翻译成Julia和Python。这一经历使我对关于科学计算方面的三种语言有特殊的看法,这就是下面我试图讨论的。

我将主要讨论成本和开放性问题。与Python和Julia不同的是,MATLAB既无啤酒自由也无言论自由。这对于某些人来说,的确是个巨大的区别,决定性的区别——但是我想考虑技术优势。多年来,MATLAB以许多非常有用的方式远远超过了其他任何免费产品,如果你想提高工作效率,那么成本就会受到损害。这是对语言的理想诉求和语言生态的单独考虑。

当你把成本放一边时,这些语言之间有着许多差异的有用框架在于它们的起源。MATLAB是最早尝试优先考虑数学,尤其是数字导向数学。Python在20世界80年代末开始认真,它以计算机科学为中心重点。Julia从2009年开始在这些方面寻求更多的平衡。

MATLAB

最初,MATLAB中的每个值都是双精度浮点数数组。这个选择的两个方面,数组和浮点数,都受到设计决策的启发。

用于浮点数的IEEE
754标准直到1985年才被采用,且内存是用K而不是G来度量的。浮点双精度并不是表示字符或整数最有效的方式,但是它们是科学家、工程师以及越来越多的数学家大多数时候想要使用的。此外,不必声明变量,也不必显式分配内存。让计算机来处理这些任务,并将数据类型抛到一边,解放你得大脑去思考对数据进行操作的算法。

数组之所以重要,是因为线性代数中的数值算法正以LINPACK和EISPACK的形式出现在自己的数组中。但是科学计算中的标准承载器FORTRAN
77在涉及到变量声明、调用隐式命名的程序、编译代码,然后检查数据和输出文件方面是多步骤的过程。将矩阵乘法写为A*B并立即打印出答案是改变游戏规则的人。

MATLAB还使图形变得简单且易于访问。没有复杂的特定于机器的低级调用库,仅仅只需要plot,你几乎就能看到其他任何使用MATLAB的人都会看到的。MATLAB还有很多创新,例如复杂数字,稀疏矩阵,构建跨平台图形用户界面的工具,以及一套领先的ODE解算器套件,这些使得MATLAB成为以思维速度进行科学计算的地方。

然而,对于交互式计算而言,理想的设计,即使是冗长的计算,并不总是有助于编写良好的高性能的软件。在许多函数之间移动数据需要处理大量的变量,并需要频繁查阅有关输入和输出参数的文档。平面命名空间中的每个磁盘文件的一个功能对于一个小项目来说非常简单,但是对于大型项目来说却是一个令人头痛的问题。如果你想避免速度瓶颈,则必须应用某些编程模式(矢量化,内存预分配)。科学计算现在被应用于更多的领域,拥有大量不同的本地数据类型。等等。

MathWorks通过继续在MATLAB中进行创新来做出回应:内联函数,嵌套函数,变量闭包,多数据类型,面向对象的特性,单元测试框架等等。每项创新都可能是解决一个重要问题的方法。但是40年改变的积累却产生了破坏简单性和统一性概念的副作用。在2009年,我写了一本书,在不到100页的篇幅里,很好地涵盖了我认为MATLAB的基本内容。据我所知,所有这些依然可用,但是现在你需要了解更多才能称自己是精通的。

Python

从某种意义上讲,Python的历史来几乎是MATLAB的镜像,两者都具有交互式命令行(现在被广泛称为REPL,即“real-eval-print
loop”),并且不受变量声明和编译的限制。但是MATLAB是作为数值分析师的游乐场而创建的,而Python则是考虑黑客的情况下创建的。然后通过修订和扩展,每个都向其他受众发展。

在我看来,Python仍然缺少数学吸引力。你有一些尴尬和小烦恼,例如对于矩阵乘法用**替换^和@,一个shape而不是矩阵大小,面向行存储等。如果你认为

V.conj().T@D**3@V是一个优雅的写作方式来书写V∗D3V,那么你可能需要看医生。还有零索引(即与从1开始的索引相反)。我读过这些论点,我认为它们不具有决定性。这显然是一个偏好的问题——网络圣战的内容——因为你可以举出笨拙的例子来说明任何一种约定。我发现决定性的是,我们有数十年的数学实践索引向量和矩阵,大量伪代码做出了这个假设。

除了这些小烦恼外,我发现Python+NumPy+SciPy生态系统既笨拙且不一致。尽管语言主要用于面向对象,但存在一个矩阵类,但它的使用并不鼓励且被弃用。也许MATLAB使我堕落,但是我发现矩阵是一个非常重要的对象类型,可以帮助和提升。OOP的主要卖点不就是你可以用*来对数组和矩阵能做不同的事吗?在这方面还有许多不足之处。(为什么我需要一个名为spsovle的命令?我不能在稀疏矩阵上调用solve解决吗?然后继续)。

对我来说,有些地方的数字生态系统看起来有点薄弱。例如,正交和ODE解法在2019年看起来像一个最小集合。AFAICT没有方法来解决DAEs,DDEs,没有辛解法,也不允许内部Krylon迭代的隐式计算方法。看看这些方法的参考资料,它们大多30岁或者更老——仍然很好,但是距离完成还很远。Matplotlib包是一个了不起的工作,有一段时间它看起来比MATLAB好,但是发现它仍然缺少3D。

一些专家认为,对于Python代码在执行速度上很难跟上编译性语言,有着深层次原因。我对搜索“python太慢了”的结果感到很开心,Python的拥护者做了很多以前MATLAB做过相同的争论和道歉,这并不意味着他们错了,但也不仅仅是感知问题。

我想我明白为什么Python对科学计算领域的许多人来说都是如此令人兴奋。它有一些MATLAB风格式的语法和功能,可以从REPL获得。它周围有很好的工具,可以很好地与其他语言以及计算领域配合使用。它免费且具有更好的长期可复用性。很明显,它适用于很多可能没有什么理由去改变的人。

但是对于我知道如何在科学计算中做的事情来说,Python比我习惯的更像一项学习和使用的苦差事。我们暂时还不知道它是否会继续席卷整个社区,或者已经接近顶峰。我没有特殊的预测能力,但我对它未来看跌。

Julia

Julia有后来者其优点和缺点。我赞赏Julia的创作者认为他们可以做得更好:

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

在很大程度上,我相信他们已经取得成功了。在1.0版本的后期,他们似乎稍微淡化了REPL,并且有一些无理由的慢慢远离MATLAB。(LinRange究竟比linspace更好吗?)然而,这些都是狡辩。

这是我使用的第一种超越ASCII的语言。通过使用像ϕ的变量,和≈的操作符,我仍然得不到合理的满足感。它不仅仅是表面的;能够看起来像我们写的数学表达式是其真正的优势,尽管他确实会使教学和文档变得有点复杂。

使用Julia工作让我觉得我养成了一些编程习惯,是因为MATLAB的选择,而非内在的优越性。矢量化对于许多事情并不自然。在Julia中发现,只要在函数名加一个点,你就可以对任何函数矢量化,这一点令人大开眼界。通过训练构造矩阵,相比之下,使得嵌套循环(或meshgrid技巧)看起来像是马车鞭子,并且通过生成器完全避免矩阵来进行简单的求和,感觉像没有付出代价就到手了。(我知道Python有类似的语言特性)。

多重派发这一大特性使得某些事情比面向对象做更容易和清晰,例如,假设你有传统面向对象语言中的Wall和Ball类,那个类会检测Ball和Wall之间的冲突?或者你需要一个Room类来充当裁判?这类问题让我心烦意乱。使用多重派发,数据被打包到对象类型中,但是对数据进行操作的方法不会绑定到类。因此:

functiondetect_collision(B::Ball,W::Wall)

了解类型,但是他们是独立定义,
对我来说,需要花费大量的编程来理解多重派发的概念对于扩展语言是多么有趣和潜在的重要性。

数字生态系统一直在迅速发展。我的第一个例子是DifferentialEquations.jl,由令人惊叹的Chris
Rackauckas编写。如果这个软件不能马上赢得Wilkinson奖,那么系统就会崩溃。只需要去网站准备转换。

我还没有看到Julia承诺的高于MATLAB的速度提升。部分原因是我相对缺乏经验和我所做的任务,但部分原因在于MathWorks在自动化代码方面做了令人难以置信的工作。不管怎样,这不是我在大部分时间关注的编码方面。

使用Julia编程花了一段时间之后才让我感到舒服(也许只是我变老了或者固化了)。它让我对数据类型的思考超出我的想象,而且总是潜在怀疑我错过了做某件事的正确方式。但是日常使用中,我现在几乎可以转向Julia,作为MATLAB使用。

总而言之

MATLAB是企业解决方案,尤其适用于工程。对于基本数字任务它可能仍然是最容易学习的。细致的文档和数十年贡献的学习工具绝对重要。

MATLAB是科学计算界的宝马轿车。它是昂贵的,那是在你开始谈配件之前。你要为一个坚如磐石,平稳的性能和服务买单。它也会吸引了不成比例的仇恨。

Python是福特的皮卡。它无处不在,深受许多人的喜爱。它可以做任何你想做的事,而且它是为做一些其他车辆不能做的事情而设计的。可能你会时不时想借一辆,但它并没有提供非常纯粹的驾驶体验。

Julia是特斯拉,它是以改变未来这一胆大目标而建立,它可能会。它也可能只是一个脚注,但与此同时,你将成功地得到你想要的,并有余力。

你怎么看?