作者 | Julia社区
编译 | 张洁
责编 | 屠敏
在2009年,一些编程经验丰富的高级用户对现有的科学计算编程工具感到不满,像科学和数值计算之类的计算量大的任务量都需要高性能产品,于是一些研究人员就开始了Julia的研究。Julia有着C语言的速度,比Python更简练的代码,还加入了其他一些编程语言的特点。
Julia被设想为一种免费的计算机编程语言,既快速又可以在较高水平上使用。2012年,Julia语言首次向公众亮相,此后逐渐成为世界上最受欢迎的编程语言之一,之后也陆续发布了Julia的一系列版本:
2022年,Julia迎来了自己的十周年,其官方在发布博文庆祝Julia十周年的同时,也带来一篇名为 《我们为什么创造Julia》的文章,为我们分享了这十年的心路历程。十年之间,从个性化医疗到气候建模、新型材料甚至太空任务规划,Julia改变了很多人、很多事。 下面,是一些Julia社区成员的故事,共同回顾过去的10年。
在试图用R语言做数据转换时偶然发现了Julia,因为这个转换要花很长时间,一下子就被Julia迷住了! 它的语法是如此简单,而且它也有一种 "数学 "的感觉。你可以使用所有的ϵ和δ,以及统计学家最喜欢的α和β。从那时起,我已经成为了Julia的生态系统贡献者。
这个社区很好,非常受欢迎。在这里结识了很多了不起的朋友,与Rik Huijzer和Lazaro Alonso共同编写了一本免费的Julia数据科学书。这本书被志愿者们翻译成了葡萄牙语和中文,对此我很感激也很惭愧。自从10年前首次出现以来,Julia正在大步前进。我对它的未来感到非常兴奋,很荣幸能成为其中的一员。
在2018年偶然发现了Julia。吸引我加入这门新语言的,其实只是好奇心。在之前的一门Python的数据分析课程上,也用过一堆语言,所以我只是想知道它的与众不同之处。以前从未为开源做出过贡献,但Julia社区似乎有些特别,它能迅速吸引人们从回答Discourse和Slack上的问题到真正为不同的项目和基地做出贡献。所以没过多久,我就自己开发了一个小包,用于上课所需的东西,最后我还向基地做了第一个PR。
在学习Julia的过程中,我很快就发现自己学到了一堆关于编译器的东西。因为我想要新的Julia语法,所以我也不得不顺便学了一点Lisp,最终我发现自己在麻省理工学院从事计算科学工作,与其他许多同样对Julia充满热情的人一起研究令人兴奋的新应用。
在硕士论文中,用Python做了一些机器学习,但一直被代码库所困扰。它们似乎比想象的还要复杂,特别是在测试方面,总觉得类是造成这种情况的。所以,在写Python代码时不使用类,但这让读者感到很不舒服。幸运的是,在一些博文看到Julia语言时,所有的问题都解决了。Julia没有类!从2019年的某一天开始,就不再碰其他语言了。
第一次听说Julia是在2017年左右。那时主要用到Python,然而它并不是一个令人满意的语言。然后,Julia出现了,它首次展示了作为Rcpp替代品的潜力。这为Julia的承诺打开了大门,它是一种具有编译性能的高生产力语言。
在一家投资公司成立之初,Julia就成为了我们建模工具箱的核心,我们用一个轻量级的代码库来增强它的功能,并通过ChainRules来实现新的基于梯度的方法。利用其不断扩展的软件包生态系统(如Genie),Julia成为基础设施的关键,从新的算法开发到会计系统、数据监控和面向客户的可视化。
第一次了解到Julia是在2017年我在柏林读神经科学硕士期间。在实验室值班,一直试图说服大家放弃MATLAB,改用Python。在其中一个场合,一位同事调侃道:"反正那些很酷的孩子不都是用Julia而不是Python吗?"。我很惊讶,也很尴尬,因为我从来没有听说过这种语言,我在网上找到了 "我们为什么要创建Julia "的帖子。读完后,我立即跟创建Julia的人的联系,因为他们与我有许多相同的价值观。从那一刻起,我就被深深地吸引住了,并在空闲时间里对Julia进行了大量的探索。
可能和很多人一样,我是在寻找Python的替代品时发现Julia的,因为Python的代码没有达到我需要的性能。在那个时候,我没有太多的编码经验,也没有真正的为任何开源项目做出过贡献。在我开始为Julia做了一些小的贡献之后,它就升级了,现在,五年过去了,我已经在软件包管理器、调试器、稀疏线性代数、SIMD、管理发布和各种不同的项目中工作,为Julia做贡献成为我日常工作的一部分。
所以对我来说,发现 Julia 对我的生活产生了巨大的影响,而令人兴奋的是,我觉得事情才刚刚开始,因为每一个 Julia 版本都有很多新的令人敬畏的东西,我只能想象 Julia 在未来 10 年的样子。
第一次看到Julia是在一篇关于S4TF和差异化编程的博文中。这篇文章提到了一种叫做Julia的语言,并说它看起来像Python,运行起来像C,被这些相似点吸引了。像这里的很多人一样,我用Python写了原型代码,要么努力使它具有性能,要么就用C++重写。
把它搁置了一段时间,但当Grant提到它的时候,我决定是时候在一个项目中真正地尝试一下了,在做这个项目的时候,我爱上了这门语言,随着这门语言而来的还有这个社区。现在每天都在使用它,希望也能帮助很多人使用它。
与其他许多人类似,当在2016年第一次听说Julia时,一开始并没有认真对待它。在收到一些不同人的热情评论后,我很好奇地在2018年试了试它,就开始了Julia之旅。在科学职位上,我很幸运地能够全职使用Julia,并开发了DFTK(密度函数工具包)。我们在DFTK上的目标是制作一个代码库,以促进模拟科学家、数学家和计算机科学家在电子结构模拟方面的合作。
为此,Julia被证明是正确的选择,因为它提供了开发新模型或算法所需的灵活性和可读性,以及调整性能所需的低级访问。这样一来,Julia成为了这一研究领域的重要组成部分。我很感谢每一个加入这个社区的人,感谢每一个为Julia做出贡献的人。
在博士期间,学习了几种编程语言。第一次了解Julia是在2014年或2015年,但并没有使用它。在2016年,总是被MATLAB中的2种语言障碍以及面向对象的编码风格所烦扰。所以决定试试用Julia是否会有更好的效果。
从一开始,就被这个富有建设性和帮助性的社区所折服,并最终建立了Manopt.jl。然后真正让我吃惊的是,在宣布这个包的时候,第一个反馈导致了第二个包的诞生,这个包有两个共同的开发者,如今它的代码库要比我的第一个包大得多。代码风格和速度以及社区都是我认为使用Julia是我在数字和代码开发方面做出的最佳选择。
早在2016年左右,研究实验室的一位同事就向我介绍了Julia,并花了相当多的时间来了解这个语言,但并没有将Julia用于任何项目或日常使用。快进到2018年,实验室开始了一个新的研究项目,探索元建模问题,如模型组成和模型探索。
随着Julia正式发布V1.0版本,以及它对元编程的支持和多重调度,真的没有另一种语言可以轻松支持正在进行的工作。经过许多不同的元建模方法和几次重写,我们能够开始AlgebraicJulia,并将科学建模与类别理论的组成思想结合起来。每当为软件添加一个新的功能,利用Julia的元编程功能时,都会重申在这个项目中使用Julia的决定。
第一次使用Julia(v0.5/v0.6)是在2017年,那时候还是个大二学生。我和Iblis Lin是同一个社团的,他把这门语言介绍给我。就被这门语言的设计、多重调度的使用以及解决2种语言问题的雄心所吸引。于是我开始阅读文档,并逐步将一些代码移植到Julia中,现在几乎所有的东西都用它来写。看到一门语言的发展,并且越来越好,真的很神奇。
在2018年,对模拟研究的性能而感到困扰。一位Python专家试图帮助我,但在该编程语言中,缓慢的性能是相似的。当正在想学习C语言的痛苦时,同事向我提出Julia是相当有前途的,于是我开始阅读关于它的资料,并关注Julia页面。最后,决定跳进Julia,不是为了尝试它,而是无论如何都要把我所有的工作都转移到Julia上。从 2019 年开始,所有的编码都是在Julia中完成的。真的非常喜欢这种语言。
早在2017年,需要为博士项目写代码。就尝试了Numba、Cython和潜心研究Numpy理论,但没有一个方案是令人满意的。之后意识到,对于性能敏感的计算,不可能有Python程序员这样的东西。可以用Python的外衣包裹代码,但我必须用C语言写所有的硬东西。一个为理论物理学学习Julia的朋友告诉我,这些挫折在科学计算中很常见,并且有一个名字:"两种语言问题"。更妙的是,它有一个解决方案:Julia。
像大多数人一样,最初对Julia持怀疑态度,并抵制用Julia来写代码。当我对Julia有不满时,我就会好奇并且想办法改进它。几个月后,我的 Julia 代码性能是不可否认的了。正如许多人所经历的那样,学习Julia在某种程度上是一个滑坡,在我意识到这一点之前,我学会了CI,良好的测试实践,以及低级计算。2020年,我把我的工作代码换成了Julia,此后再也没有回头。
2012年,在大众/奥迪实习中用C++语言进行了一些图像和传感器处理,一切都很困难,于是开始寻找另一种语言来解决。Python看起来不错,但并不是一个真正的选择,因为我喜欢那些需要高性能的项目,如光线追踪、3D渲染、ML和图像处理。之后开始设计一种小的玩具语言,它有很好的元编程支持,C和GPU互操作,没有开销,不使用OOP,使数学代码更容易扩展,更容易编写。
半年后,一个朋友转发了 "我们为什么要创建Julia "的博文。我超级兴奋,因为它满足了玩具语言应该提供的任何功能。我开始用Julia写我的本科论文和所有其他项目,这是我做过的最好的编程决定 。
通过实验LLVM和一堆建立在它之上的语言开始我的博士生涯。就在那个时候,Hacker News的一篇文章宣布了一种新的有趣的语言:Julia,它既是高级语言,又是针对LLVM的!所以很明显,需要把这种语言纳入到我的研究中。
因此,开始为Julia开发一个GPU后端,此后一直没有停止。过去,要让Julia支持我们的GPU诡计是相当困难的,但现在这门语言的可扩展性越来越强,所以应该针对未来10年的计算机硬件进行开发。
十年前,我喜欢关注任何科技领域的最新版本,同时努力学习SQL和足够的R语言,以便在工作中做数据分析。记得我在做一个R脚本,需要在3300万行数据中进行循环,需要18个小时来运行。就在这18个小时的运行中,我看到了Julia的博文,并立即对它所承诺的那种简单性能感到怀疑。
在一个周末阅读了最初的手册,在接下来的周一早上重写了我的脚本,结果它在5分钟内就运行了。以为我肯定是犯了什么提前终止的错误,但是没有,它真的就是那么快。从那时起,就知道我需要将数据直接读入Julia,因此开始了两个Julia软件包的工作。我从来没有上过计算机科学课,也不是什么开发人员,所以我想我是第一批通过Julia学习编程的人。
比Julia本身更令人兴奋的是它的开源社区。发现即使是最微不足道的贡献也是有意义的,特别是与所面临的其他挑战相比。我很快就把精力集中在数组上(例如,只用三行代码就实现了快速的自定义数组),后来随着我们向1.0推进,又开始了广播。很荣幸能成为这个社区的一部分,我为我们一起建立的东西感到非常自豪。
第一次使用Julia是在V1.4发布时。早期的流行给了我一些额外的时间来实际探索这种新的语言,我一直听到关于它的美好的事情。我当时刚开始研究我的论文,喜欢使用一种语言而不是在Python和C++/Rust之间切换的想法(当时我还没有决定要用哪一种)。
起初,这门语言最有趣的地方是它的速度。然而,我很快就迷上了语言设计,从那时起,它就成了我的主要语言。通过后续不断地在 Julia Discourse 论坛,以及使用Slack和 Zulip等协作工具交流,我了解了很多关于语言内部运作的信息,同时也对这个语言充满了激情。
我是被一个学生吸引到Julia的,在2020年。当时正在为几组学生讲课,因为Covid-19大流行病导致正常课程被关闭。因为使用Python,代码相当慢,所以试图优化代码,一个学生带来了Julia版本的代码,速度快得惊人。然后我了解了微分方程生态系统、Flux、JuMP和SciML,决定要进入这个系统。
此后不久,在Humans of Julia Discord服务器中的好心人的帮助下,我用Julia做了《代码降临2020》。从中学到了一些关于多重调度、元编程和性能提示的知识。我被迷住了。事实上,大部分的代码都是用Julia本身写的,这让你在代码的许多方面学到了很多东西。
原文链接:Why We Use Julia, 10 Years Later