zoukankan      html  css  js  c++  java
  • julia,集Python、C++、R为一体!Julia 1.0重磅发布, MIT发布史上最强科学计算编程语言?创始人独家解答11个问题

    这个编程语言的新版本之所以受到整个人工智能界的关注,最主要的原因正是其将 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 名志愿者参与了 1.0 版本的制作。

      “我们想开发一种开源的编程语言,我们希望这门语言有 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

      同样,Cxx.jl 使得调用 C++库、模板等变得非常容易。我们可以通过 PyCall.jl 和 RCall.jl 这样的集成接口调用 Python 和 R。反过来,Python 和 R 通过调用 PyJulia 和 RJulia 包来调用 Julia 语言。JavaCall.jl 可以让 Julia 调用 Java。我们也有一个干净清晰的嵌入编程接口,让任何其他语言都很容易地调用 Julia。

      五、从实际应用来说,Julia 已经用于自动驾驶汽车、机器人和 3D 打印机,此外还广泛应用于精准医疗、增强现实、基因组学及风险管理。那么 Julia 语言本身适合什么应用? 团队有没有自己特别看好的一个实际应用方向?为什么?

      我们一直致力于构建一种通用语言,这种语言对于所有形式的数学计算都有很好的抽象。因此,看到各种各样领域应用的蓬勃发展比看到任何一个特定应用的蓬勃发展更让我们兴奋。

      

      (来源:Julia 官网)

      六、目前 Julia 语言主打科学计算,下载者包括谷歌、Facebook 和美国能源部等各个部门的开发者。未来,Julia 是否会扩展其目标人群,用于更多面向对象程序设计?公布了 1.0 以后,有没有来自一些用户的收获或反馈?

      Julia 的目标受众在过去几年里每 9 个月就会翻一番。我们认为,多分派、通用函数和专门化的语言特性是为该语言的用户精心设计的。

      Julia 在 GitHub 上已经收到了超过 700 名开发者的贡献。许多人贡献超过 2000 个包。我们估计大约有 30 名核心开发人员对 Julia 语言本身贡献了大量工作。

      在用户方面,Julia 的下载量超过 200 万次。作为一种开放源码语言,很难将这个数字转换为真实用户数量。此外,在 Julia Computing 方面,我们看到来自 700 所大学和 1000 多家公司的用户下载或使用了 Julia。Julia1.0 非常受欢迎,语言社区会追求长期稳定,每个人都为此感到兴奋。我们也受到非常多的反馈,有中文的也有英文的。对于 1.0,

      七、团队目前对 Julia 在商业项目应用上有何计划?

      所有 Julia 的创建者都聚集在一起,形成了遵循开源商业模式的 Julia Computing 公司。Julia Computing 公司的产品已经被成千上万的用户下载,JuliaBox 被广泛用于 Julia 的教学。

      此外,Julia Computing 为许多企业提供开发人员和生产支持,并为全球用户提供培训和咨询。

      八、用 Julia 写的项目中,哪一个让你们觉得印象最深刻?

    最印象深刻的包是以下几个:

    用于数学优化研究的 JuMP:

    https://github.com/JuliaOpt/JuMP.jl

    用于微分方程相关的 DiffEq:

    http://juliadiffeq.org/

    用于机器学习的 Flux:

    http://fluxml.ai/

    另一个用于机器学习(深度学习)的 Knet:

    https://github.com/denizyuret/Knet.jl

    除此之外,这些包也都非常有用:

    Revise 包,真的太棒了,Tim Holy 是个天才!:

    https://github.com/timholy/Revise.jl

    BenchmarkTools,一个测试性能相关的包:https://github.com/JuliaCI/BenchmarkTools.jl

    StaticArrays 包,这个包很可能作为标准库:https://github.com/JuliaArrays/StaticArrays.jl

    UnicodePlots 包,唯一一个到处都能可靠安装使用的画图的包:https://github.com/Evizero/UnicodePlots.jl

      

      图丨Julia 团队(来源:vccircle)

      九、Julia 在中国的开发者中引起了很大的讨论,但有人认为 Julia 本身又没有很强的推广力度,可能很难有公司会将 Julia 使用在商业项目上,对于这种说法团队怎么看?

      Julia 是一种“草根”语言,是由真正喜欢开发和使用它的人开发出来的。也许将来一些更大的公司会采用它——但我们认为这不是成功的必要条件。Python、PHP、Perl、Ruby、Lua 等语言都不是由任何组织推动的。至少从目前来说,它是由社区开发的,这也是它能吸引用户的原因。

      十、Julia 的野心很大,想要集成多种语言的优点,规避掉这些语言不足的地方。不过一个语言是否值得我们学习,还要看它的学习氛围、市场环境以及具体适用的场景,目前团队认为 Julia 在这些方面还存在哪些不足?现阶段最大的挑战是什么?下一个版本计划将优先解决哪些问题?

      近期我们一直在努力的方向是提升编译器的效率。

      [show] java.lang.IllegalStateException: sendError() forbidden after buffer has been committed.

    集Python、C++、R为一体!Julia 1.0重磅发布

    [日期:2018-08-17] 来源:infoq.com  作者: 陈利鑫 [字体:  ]


    近年来,Julia 语言已然成为编程界的新宠,今年 TOIBE8 月份编程语言排行榜上,Julia 已迅速攀升至第 50 名。短短几年,这门由 MIT CSAIL 实验室开发的编程语言就变得炙手可热,很大部分是因为这门语言结合了 C 语言的速度、Ruby 的灵活、Python 的通用性,以及其他各种语言的优势于一身,并且具有开源、简单易掌握的特点。

    8 日,Julia 正式发布 1.0 版本。Julia 团队表示:“Julia 1.0 版本是我们为如饥似渴的程序员构建一种全新语言数十年来工作成果的巅峰。”那么问题来了,Julia 真有这么神?你做好学习一门新编程语言的准备了吗?

    为什么你应该学习 Julia?

    从 2012 年到现在,Julia 1.0 在编程界已经打出了自己的一片“小天地”。截至发稿前,Julia 在 Github 上已经获得了 12293 颗星星,TOIBE8 月份编程语言排行榜上已迅速攀升至第 50 名。

    集Python、C++、R为一体!Julia 1.0重磅发布

    Julia 之所以这么受欢迎,这与它解决了工程师们一个“坑爹”问题有关:工程师们为了在数据分析中获得速度和易用性,不得不首先用一种语言编码,然后用另一种语言重写,即很多人口中的“双语言问题”。

    与其他语言相比,Julia 易于使用,大幅减少了需要写的代码行数;并且能够很容易地部署于云容器,有更多的工具包和库,并且结合了多种语言的优势。据 Julia Computing 的宣传,在七项基础算法的测试中,Julia 比 Python 快 20 倍,比 R 快 100 倍,比 Matlab 快 93 倍。

    目前 Julia 的应用范围已经非常广泛了,可以用于天文图像分析、自动驾驶汽车、机器人和 3D 打印机、精准医疗、增强现实、基因组学和风险管理等领域。

    两年前,诺贝尔经济学奖得主 Thomas Sargent 和澳大利亚国立大学的经济学教授 John Stachurski,共同建议纽约联邦储备银行把其用于市场走势预测和政策分析的“动态随机一般均衡模型(DSGE)”转到 Julia 语言平台。在项目第一阶段后,他们发现,Julia 把模型运行时间缩短至原先 Matlab 代码的十分之一到四分之三。

    除了语言本身的优点,Julia 还拥有非常强大的生态系统,主要应用于数据可视化、通用计算、数据科学、机器学习、科学领域、并行计算六大领域。

    集Python、C++、R为一体!Julia 1.0重磅发布

    Julia 在规模化机器学习领域为深度学习、机器学习和 AI 提供了强大的工具(Flux 和 Knet)。Julia 的数学语法使其成为表达算法的理想方式,支持构建具有自动差异的可训练模型,支持 GPU 加速和处理数 TB 的数据。Julia 丰富的机器学习生态系统还提供监督学习算法(如回归、决策树)、无监督学习算法(如聚类)、贝叶斯网络和马尔可夫链蒙特卡罗包等。

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

    所以说,Julia 火起来不是没有原因的,而最新发布的 1.0 版本又添加了很多新功能。

    按例,先贴上新版本相关链接:

    Julia 1.0 试用版链接:

    https://julialang.org/downloads/

    GitHub 地址:https://github.com/JuliaLang/julia

    目前支持 Julia 的平台:

    集Python、C++、R为一体!Julia 1.0重磅发布

    Julia 到底是怎样一门语言?

    Julia 首次公开面世时便体现出该社区对语言的一些强烈要求:

    我们想要一种拥有自由许可的开源语言。我们想要它拥有 C 的速度与 Ruby 的灵活。它要容易理解,像 Lisp 一样真正地支持宏,但也要有像 Matlab 一样的明显、熟悉的数学符号。它还要像 Python 一样可用于通用编程,像 R 一样易于统计,像 Perl 一样可自然地用于字符串处理,像 Matlab 一样擅长线性代数,像 shell 一样擅长将程序粘合在一起。总之,它既要简单易学,但也要让最严肃的黑客开心。我们既希望它是交互式,也希望它是可编译的。

    现在,一个充满活力和蓬勃发展的社区围绕着这种语言成长起来,来自世界各地的人们在追求这一目标的过程中不断地精炼并重塑着 Julia。超过 700 人为 Julia 做出了贡献,还有很多人制作了数以千计的令人惊叹的开源 Julia 软件包。总而言之,我们建立的语言:  

    • 快速:Julia 就是为高性能而设计的。Julia 程序通过 LLVM 编译为多个平台的高效本机代码。

    • 通用:它使用多个调度作为范例,使得它很容易表达众多面向对象和函数编程的模式。它的标准库提供异步 I / O、进程控制、日志记录、概要分析、软件包管理器等。

    • 动态:Julia 是动态类型的,就像一种脚本语言,并且很好地支持交互式使用。

    • 技术:它擅长于数值计算,其语法非常适合数学,支持的数字数据类型众多,并具有开箱即用并行性。Julia 的多次调度非常适合定义数字和数组类型的数据类型。

    • (可选)键入:Julia 具有丰富的描述性数据类型语言,类型声明可用于阐明和巩固程序。

    • 可组合:Julia 的软件包可以很好地协同工作。单位数量矩阵,货币和颜色数据表都可以进行,并且性能良好。

    如果你要从 Julia 0.6 或更早版本升级代码,我们建议首先使用过渡版 0.7,其中包括弃用警告帮助指导完成升级。如果你的代码没有警告,则可以更改为 1.0 而无需任何功能更改。已注册的软件包正在使用该过渡版本发布 1.0 兼容的更新。

    1.0 更新了哪些功能?

    当然,Julia 1.0 中最重要的一个新功能是对语言 API 稳定性的承诺:你为 Julia 1.0 编写的代码可以继续在 Julia 1.1、1.2 等版本中运行。该语言是“已完善”的,核心语言开发人员和社区都可以放心使用基于此版本的软件包、工具和新功能。

    但 Julia 1.0 更新的不仅是稳定性,它还引入了一些强大、创新的语言功能。自 0.6 版以来,新发布的一些功能包括:  

    • 全新的内置软件包管理器性能得以大幅改进,使安装包及其 dependencies 项变得前所未有的简单。它还支持每个项目的包环境,并记录工作应用程序的确切状态,以便与他人和你自己进行共享。最后,新的设计还引入了对私有包和包存储库的无缝支持。你可以使用与开源软件包生态系统相同的工具来安装和管理私有软件包。JuliaCon 上展示了新功能设计的详细情况:https://www.youtube.com/watch?v=GBi__3nF-rM
    • Julia 有了一个新的规范表示缺失值(https://julialang.org/blog/2018/06/missing)。能够表示和处理缺失的数据是统计和数据科学的基础。与 Julian 的一贯风格相符,这个新的解决方案具有通用性、可组合性和高性能。任何泛型集合类型都可以通过让元素包含 missing 的预定义值来有效地支持缺失值。在以前的 Julia 版本中,这种“联合类型”集合的性能会太慢,但编译器的改进现在使得 Julia 可以跟上其他系统中自定义 C 或 C ++ 缺失数据表示的速度,同时也更加通用和灵活。  
    • 内置的 String 类型现在可以安全地保存任意数据。你的程序数小时甚至数天的工作不再会因为一些无效 Unicode 杂乱字节而失败。保留所有字符串数据,同时标记哪些字符有效或无效,可以使你的应用程序安全方便地处理不可避免具有缺陷的真实数据。  
    • 语法简单的广播(Broadcasting)已经成为核心语言功能,现在它比以往任何时候功能都更强大。在 Julia 1.0 中,将广播扩展到自定义类型并在 GPU 和其他矢量化硬件上实现高效优化计算变得更简单,为将来提高性能提升铺平了道路。  
    • 命名元组是一种新的语言特性,它使得通过名称表示和访问数据变得高效快捷。例如,你可以将一行数据表示为 row =(name =“Julia”,version = v“1.0.0”,releases = 8),并将版本列作为 row.version 访问,其性能与不甚快捷的 row [2] 相同。  
    • 点运算符现在可以重载,让类型使用 obj.property 语法来获取和设置结构字段之外的含义。这对于使用 Python 和 Java 等基于类的语言更顺畅地进行互操作是个福音。属性访问器重载还允许获取一列数据以匹配命名元组语法的语法:你可以编写 table.version 来访问表的 version 列,就像 row.version 访问单行的 version 字段一样。  
    • Julia 的优化器在很多方面变得比我们在这里提到的更聪明,但有一些亮点值得一提。优化器现在可以通过函数调用传播常量,可以更好地做到死码消除和静态评估。另外,编译器在避免在长生命周期对象周围分配短期包装器方面也要好得多,这使得程序员可以使用便利的高级抽象而无需降低性能成本。  
    • 现在使用声明相同的语法调用参数类型构造函数。这消除了语言语法的模糊和令人困惑的地方。  
    • 迭代协议已经完全重新设计,以便更容易实现多种迭代。现在是一对一定义一个或两个参数方法,而不是定义三个不同泛型函数的方法——start,next,和 done。这通常使得使用具有开始状态的默认值的单个定义可以更方便地定义迭代。更重要的是,一旦发现无法生成值就可以部署迭代器。这些迭代器在 I / O、网络和生产者 / 消费者模式中无处不在;Julia 现在可以用简单直接的方式表达这些迭代器。  
    • 范围规则简化。无论名称的全局绑定是否已存在,引入本地范围的构造现在都是一致的。这消除了先前存在的“软 / 硬范围”区别,并且意味着现在 Julia 可以始终静态地确定变量是本地的还是全局的。  
    • 语言本身非常精简,许多组件被拆分为“标准库”软件包,这些软件包随 Julia 一起提供但不属于“基础”语言。如果你需要它们,它可以给你方便(不需要安装),但不会被强加给你。在未来,这也将允许标准库独立于 Julia 本身进行版本控制和升级,从而允许它们以更快的速度发展和改进。  
    • 我们对 Julia 的所有 API 进行了彻底的审查,以提高一致性和可用性。许多模糊的遗留名称和低效的编程模式已被重命名或重构,以更优雅地匹配 Julia 的功能。这促使使用集合更加一致和连贯,以确保参数排序遵循整个语言的一致标准,并在适当的时候将(现在更快)关键字参数合并到 API 中。  
    • 围绕 Julia 1.0 新功能的新外部包正在构建中。例如:  
    • 正在改进数据处理和操纵生态系统,以利用新的缺失支持

    • Cassette.jl(https://github.com/jrevels/Cassette.jl)提供了一种强大的机制,可以将代码转换传递注入 Julia 的编译器,从而实现事后分析和现有代码的扩展。除了用于分析和调试等程序员的工具之外,甚至可以实现机器学习任务的自动区分。

    • 异构体系结构支持得到了极大的改进,并且与 Julia 编译器的内部结构进一步分离。英特尔 KNL 只能用 Julia 工作。Nvidia GPU 使用 CUDANative.jl(https://github.com/JuliaGPU/CUDAnative.jl)软件包进行编程,Google TPU 的端口正在开发中。

    另外,Julia 1.0 还有无数其他大大小小的改进。有关更改的完整列表,请参阅文件:https://docs.julialang.org/en/release-0.7/NEWS/

    在 2012 年的文章《为什么我们创造 Julia》这篇博客文章中(https://julialang.org/blog/2012/02/why-we-created-julia),我们写道:

    它不完整,但现在是 1.0 发布的时候——我们创建的语言叫做 Julia。

    现在,我们提前叩响了 1.0 版本发布的扳机,但它发布的时刻已然到来。真诚地为这些年来为这门现代化编程语言做出贡献的人们感到骄傲。

  • 相关阅读:
    linux之awk命令
    HDU 2097 Sky数 进制转换
    HDU 2077 汉诺塔IV
    HDU 2094 产生冠军 dfs加map容器
    HDU 2073 叠框
    HDU 2083 简易版之最短距离
    HDU 2063 过山车 二分匹配
    天梯 1014 装箱问题
    天梯 1214 线段覆盖
    天梯 1098 均分纸牌
  • 原文地址:https://www.cnblogs.com/timssd/p/9528403.html
Copyright © 2011-2022 走看看