首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

史上最强科学计算编程语言?

本月初,随着的 1.0 版本发布的消息确认,一门名为“Julia”的高性能动态编程语言一夜之间刷爆了朋友圈和 GitHub。

首先科普一下什么是“Julia”的高性能动态编程语言” ,Julia是一个新的高性能动态高级编程语言。语法和其他编程语言类似,易于其他语言用户学习。Julia拥有丰富的函数库,提供了数字精度、精致的增幅 器(sophisticated amplifier)和分布式并行运行方式。核心函数库等大多数库是由Julia编写,但也用成熟的C和FORTRAN库来处理线性代数、随机数产生和字 符串处理等问题。Julia语言可定义函数并且根据用户自定义的参数类型组合再进行重载。

这个编程语言的新版本之所以受到整个人工智能界的关注,最主要的原因正是其将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 项目由麻省理工学院教授 Alan Edelman 领导,另外几位关键创造者则包括Jeff Bezanson(“Julia”名字来自于 Bezanson 的一个旧项目)、Stefan Karpinski 和 Viral Shah。其大部分关键发展成果都来自麻省理工学院的 Julia 实验室,也有超过 700 名志愿者参与了 1.0 版本的制作。

“我们想开发一种开源的编程语言,我们希望这门语言有 C 语言一样的速度、R 语言一样的灵活性,有同像性(homoiconicity), 有像 Lisp 语言那样拥有真正的宏特性,但是也像 Matlab 一样有易于理解、被人所熟悉的数学标记。我们希望它像 Python 一样易用,像 R 语言一样适用于统计,像 Perl 一样适用于字符串处理,处理线性代数像 Matlab 一样强大,像 DOS 命令一样擅长粘合程序。这似乎看起来简单易学,但是想要让黑客乐意去迎合它却不是简单之事。我们希望它具有互动性且能够被编译”,在《Why we created Julia》这篇文章中,Julia 团队如此解释他们开发这个语言的初衷。

图丨Viral Shah

Viral Shah 也曾经表示:“如果你是一名数学家、科学家或者工程师,你可以选择一种速度快的语言,比如 C++或 Java,又或是任意一种容易学习的语言,比如 Matlab,R,或 Python,所以我们创造了 Julia 这种又快又便捷的语言。”如今,他已经成为 Julia Computing 公司的 CEO,该公司致力于帮助其他公司使用 Julia 语言。

当然,Julia 的问世,除了让人感慨 IT 行业发展之快、推陈出新之迅猛,另一方面也向所有人提出了一个新的问题:我究竟要不要学习这门新语言。这个问题将非常重要,就像 Y-Combinator 的联合创始人 Paul Graham 所说的,“当你可以选择你要用的编程语言时,不使用最强的那一种将是一个错误”。

在过去一年中,研究者利用 Julia 在一台超级计算机上分析天文图像,速度提升了 1000 倍,在 15 分钟内将接近 2 亿个天体进行分类。从技术上来看,这种语言还会长期发展下去。然而,现在是一个里程碑的时刻:在本周于伦敦举办的 Julia 语言年会上,Julia 1.0 正式发布!一起发布的还有JuliaCon

Julia 的开发者之一、就职于 MIT 计算机科学与人工智能实验室(CSAIL)的教授 Alan Edelman 表示:Julia 1.0 的发布证明,该语言已经做好准备,将 Python 和 R 的高效性和易用性与 C++的闪电速度结合在一起,改变技术世界。

图丨Alan Edelman(来源:麻省理工学院官网)

从实际应用来说,Julia 已经用于自动驾驶汽车、机器人和 3D 打印机,此外还广泛应用于精准医疗、增强现实、基因组学及风险管理。从 Julia 的生态系统来说,目前它主要的特征或应用领域为数据可视化、一般性的 UI 与网站、数据科学、机器学习、科学计算与平行计算等。

Julia 目前下载量已经达到了200 万次,且 Julia 社区开发了超过1900 多个扩展包。这些扩展包包含各种各样的数学库、数学运算工具和用于通用计算的库。除此之外,Julia 语言还可以轻松使用 Python、R、C/C++ 和 Java 中的库,这极大地扩展了 Julia 语言的使用范围。

Julia 团队

Julia 开发者对该语言提出了很多需求:

我们想要一种十分自由的开源语言,同时兼具 C 语言的速度和 Ruby 语言的灵活度。我们想要一种同像性语言,具有像 Lisp 一样真正的宏,也有像 Maltlab 一样浅显易懂的数学符号。它是像 Python 一样有用的通用编程语言,像 R 语言一样便于统计的语言,像 Perl 一样自然的字符串处理语言,像 Matlab 一样强大的线性代数语言,也是像 shell 一样的「胶水语言」。它简单易学,却能让严苛的黑客们为之倾心。我们希望它兼具交互性和可编译性。

围绕这一语言,一个欣欣向荣的社区已经蓬勃发展起来,为了同一目标,世界各地的人们不断地重塑并改进着 Julia。超过 700 人对 Julia 做出了实质性贡献,更有不计其数的人制造了数千个惊人的 Julia 开源包。总之,我们构建了一种这样的语言:

快速:Julia 为高性能而生。Julia 程序通过 LLVM 为多个平台编译高效的本地代码。

通用:它使用多分派作为范例,使得表达许多面向对象和函数式的编程模式变得容易。标准库提供异步 I/O、进程控制、日志记录、性能分析、包管理器等。

动态:Julia 是动态型语言,与脚本语言类似,并且支持交互式使用。

专业:它擅长数值计算,其语法适用于数学,支持多种数值数据类型,并具有良好

并行性:Julia 的多分派天生适合定义数字和类数组的数据类型。

多样:Julia 拥有丰富的描述性数据类型,类型声明使程序条理清晰且稳定。

可组合:Julia 的包可以很好地组合在一起。单位数量的矩阵,或者货币和颜色的数据列表,都可以组合——而且性能很好。

当然,Julia 1.0 中最重要的一个新特征是对语言 API稳定性的承诺:为 Julia 1.0 编写的代码可以继续在 Julia 1.1、1.2 等版本上使用。该语言是「完全成熟的」,核心语言开发者和社区都可以基于这个坚实的基础构建新的包、工具和特征。

Julia 1.0 不仅涉及稳定性,还引入了多种新的强大、创新性语言功能。自 0.6 版本以来的新功能如下,更多详细与准确的内容请查看更新文档原文:

一种全新的内置程序包管理器给 Julia 1.0 带来巨大的性能提升,并令其相比以往更容易进行程序包和依赖库安装。它还支持每项目(per-project)的包环境,并记录工作应用的明确状态来和其他人(以及你的未来项目)共享。最后,该新设计还完全支持私人包和软件包存储库。你可以使用相同的工具安装和管理你用于开源包生态系统的私人包。JuliaCon 的展示视频对新设计和行为提供了很好的概述。

Julia 拥有对缺失值的新的标准表示。允许表示和处理缺失数据对于统计和数据科学来说是很基础的。在典型的 Julia 编程形式中,新的解决方案是通用的、可组合的和高性能的。任何泛用群集类型可以高效地支持缺失值,仅需要允许元素包含预定义值 missing。这种「统一类型化」的群集的性能在过去版本中可能会非常慢,但如今的编译器改进已经允许 Julia 在其它系统中匹配自定义 C 或 C++的缺失值表示的速度,同时在通用性和灵活性上也远远超越过去的版本。

内置的 String 类型现在可以安全地支持任意数据。你的程序不会在一项工作中因为无效 Unicode 的单个丢失字节就浪费数小时或数天的时间。所有的字符串数据在指示哪些字符是有效或无效的同时就已经被保存,允许你的应用安全、方便地处理包含所有不可避免瑕疵的真实世界数据。

广播(broadcasting)由于方便的语法特性已经成为了一种核心的语言功能,并且已经比过去更加强大。在 Julia 1.0 中,可以很简单地将广播扩展到自定义类型,并在 GPU 和其它向量化硬件上实现高效的优化计算,为未来更高的性能效益奠定了基础。

命名元数组是一种新的语言功能,可以通过命名使数据表示和访问更加高效和方便。例如,你可以将一行数据表示为 row = (name="Julia", version=v"1.0.0", releases=8),并使用 row.version 来访问 version 列,它与不那么便利的 row [2] 有相同的性能。

点运算符现在可以重载,并允许类型使用 obj.property 句法获取除 getting 和 setting 结构域外的含义。这对于使用 Python 和 Java 等面向对象语言之间更加平滑的交互操作非常有用。属性访问器重载还允许获取一列数据的语法匹配命名元组的语法:你可以编写 table.version 以访问表中的 version 列,这就和使用 row.version 访问行的 version 字段一样。

Julia 优化器在很多方面比我们列出来的特征还要优秀,但这里只会提一些亮点。优化器现在可以通过函数调用传播常数,因此比以前能更好地消除无用代码和实现静态评估。编译器在避免为长期目标分配短期包装器方面也做得更好,这使得开发者能使用便捷的高级抽象并且不会产生性能损失。

现在可以用声明参数类型的构造函数的方式调用它们自己,这消除了语言句法中令人困惑且模糊的地方。

完全重新设计迭代协议,使之更易实现多种可迭代量。Julia 1.0 没有设计三种不同泛型函数(start、next、done)的方法,而是设计iterate 函数的一参数和二参数方法。这通常允许在开始状态使用包含默认值的单一定义来便捷地定义迭代。更重要的是,这使得实现只在尝试并无法生成值后才知道它们已经被实施过的迭代器成为可能。这些迭代器在输入/输出(I/O)、网络和生产者/消费者模式中是非常普遍的,Julia 可以用一种直接、准确的方式表达这些迭代器。

作用域规则(scope rule)被简化。局部作用域的结构现在可以一致地进行使用,不用管某命名的全局约束是否已经存在。

Julia 语言本身是非常好的学习器,很多组件被分割封装进 Julia 的标准库包,而不是作为基础语言的一部分。如果你需要它们,可以导入它们(无需安装)。未来,标准库还将出现多种版本,并独立于 Julia 更新,这使得它们可以更快地迭代。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180824A1DPJ000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券