Julia 1.0 正式发布 (简体中文)

2018年8月8日 | Julia 开发团队

翻译:简体中文, 繁体中文, 西班牙语

万众期待的 Julia 语言 1.0 版是近十年的心血结晶。 在 JuliaCon 2018 年会上,Julia 社区欢庆并共同正式地将该版本 升级为 1.0.0

Julia 语言 首次公开发布 并有不少强烈的期待:

我们想要一个开源的语言,拥有自由的版权。我们想要 C 的速度和 Ruby 的动态。我们想要一个语法与内在表示有一致性(homoiconic)的语言, 并且像 Lisp 一样拥有真正的宏,但是拥有像 Matlab 一样熟悉好懂的数学符号。我们也想要像 Python 一样好用的通用型编程语言, 处理统计要和 R 一样,处理字符串要和 Perl 一样地自然,要有和 Matlab 一样强大的线性代数功能,串接程序要如同 shell 一样好用。 要学习的东西极致简单,同时能让大多数苛刻的黑客写起来开心。我们希望它是交互式的而且也是可编译的。

一个充满活力和繁荣的社区围绕着这样的语言成长起来,来自世界各地的人们都在为了这个目标而努力不懈地改进和塑造 Julia。 超过 700 人对 Julia 做出了贡献,更多人创造了上千的开源的 Julia 包。总而言之,我们创造了这样一种语言:

现在可以 下载 Julia 1.0 版本 来试试 Julia。 如果你现在从 Julia 0.6 或者更早的版本开始升级代码,我们建议你先使用过渡的 0.7 版本, 其中包括了弃用警告(deprecation warning)来指导你升级的过程。一旦你的代码无警告通过, 那么你可以无痛将代码更改为 1.0 版本。 已注册过的包可以利用这个来作为垫脚石并发布与 1.0 兼容的版本更新。

当然,在 Julia 1.0 版本中一个最重要的新特性是对语言 API 稳定性的保证:你为 Julia 1.0 编写的代码将可以继续在 Julia 1.1、1.2 中执行。这种语言是 足够成熟的。基于这样一个稳固的基础, 核心语言的开发者和社区都可以集中于第三方包,工具,和新特性的开发上。

但是 Julia 1.0 并不只意味着稳定,它也引入一些新的、强大的以及新颖的语言特性。其中一些新的特性是 0.6 版就有的:

它也为每个项目支持虚拟环境并记录目前工作环境的状态然后将它分享给其他开发者或者是自己。最后重新设计的包管理器也带来了 私有包和 repository 的无缝衔接。你同样可以使用开源包的方式来管理及安装自己的私有包。这个 JuliaCon 的演讲 展示了包管理器的新设计。

在典型的 Julia 写法(Julian fashion)里,新的解决方案是具有广义性、组合性,也是高性能的。任何一般的集合类型(collection type)都可以简单地使用 预先定义好的 missing 变量来有效支持缺失值。而这种集合类型的性能在过去的 Julia 版本里可能会很慢,但是现在编译器已经 可以使得 Julia 在缺失值的表示上达到类似 C 或者 C++ 的速度,然而远比 C 或者 C++ 更广义和灵活。

所有的字符串数据会被保留,同时指出哪些字符是有效的,哪些是无效的,这样允许你的应用程序安全而方便地执行在不可避免缺陷的真实世界的数据中。

赋予自定义类型 broadcasting 特性 和在 GPU 和向量化硬件上实现最佳的运算都更加容易, 这是为未来更多的性能提升铺路。

row = (name="Julia", version=v"1.0.0", releases=8) 并且通过 row.version 访问 version 数据,而这和 row[2]有着同样的性能,却更加方便。

这有助于将以类为基础的语言例如 Python 和 Java 更加流畅地翻译到 Julia。属性访问器的重载让访问一行数据与 named tuples 的访问语法一致:你可以写 table.version 来获取表格中的 version 这一行,就如同 row.version 会取得 version 这一列的这个字段一样。

调用之间传递常数,这将使得编译器可以有比过去更好地执行死码删除(dead-code elimination)和静态求值。编译器现在也能够避免对短期封装(short-lived wrappers)的 长期对象(long-lived objects)做内存分配,这让程序设计师可以用方便的高阶抽象而不会有性能损失。

和两个参数的 iterate 函数即可。这允许我们可以简单地定义一个带有默认值的函数来给出初始值。更重要的是,这也实现了一个只有在尝试返回失败之后就结束的迭代器。这种迭代器可以非常普遍使用在 I/O、网络和生产者-消费者模型中;而 Julia 现在 可以更直接和正确地编写这样的迭代器。

这将消除之前的 “软/硬作用域” 的区别,也意味着现在 Julia 可以静态地确定变量是局部的还是全局的。

如果你需要他们,那么只需引入这些函数库即可(不需要再安装)但是不会强制使用。在未来这些标准函数库将会独立被标记版本和更新 以达到更快的改进和升级。

我们仔细地审查了 Julia 的 API,并且提高了它的一致性和可用性。很多费解的命名和低效的实现都被重新命名和重构, 能够更优雅地发挥 Julia 的能力。这样的改变促使集合的使用方式更加一致和连贯。确保在整个语言中遵循一致的参数的顺序, 并将关键字参数(现在更快了)整合到了 API 中。

还有无数个大大小小的改进。你可以查看 0.7 NEWS 文件 当中的完整的更新。 在我们 2012 年的 "为什么我们创造 Julia" 文章 里,我们写到:

它还没有完工,但是是时候发布一个 1.0 版本了(其实历时 6 年才发布)—— 我们创造了一个语言叫做 Julia。

虽然对于 1.0 的发布我们放了大家好多次鸽子,但是这一次我们终于正式发布了。 我们真心为上千位以各种形式贡献给这个真正的数值计算和通用编程设计的现代语言的人感到自豪和无比欣喜。