作者 | Serdar Yegulalp
策划 | 云昭
Mojo很狂!它的目标非常有野心:“与Python/ target=_blank class=infotextkey>Python一样易于使用,但与Rust一样强大和快速。”
新推出的Mojo语言,被宣传为多个领域中最好的:Python的易用性和清晰的语法,以及Rust的速度和内存安全。这些多少有些夸大其词。由于Mojo仍处于开发的早期阶段,用户还需要一段时间才能亲眼看到这种语言是如何达到他们的要求的。
Mojo的创建者,一家名为Modular的公司,提供了一个早期的在线运行环境:一个Jupyter Notebook环境,用户可以在这里运行Mojo代码并了解该语言的功能和行为。
因为Mojo还没有作为最终用户下载,所以我们首先关注的是Mojo作为一种语言是什么样子的。我们将研究它与Python的相似之处,它的不同之处,以及它能为熟悉Python或其他语言的程序员提供什么。
Mojo可以被描述为Python的“超集”。用Python编写的程序是有效的Mojo程序,尽管有些Python行为尚未实现。目前在Python中找不到的Python行为的一些示例包括,函数的关键字参数、global关键字以及list和dict理解。也可以使用实际的Python运行时来处理现有的Python模块,尽管这会带来性能成本。
当Mojo引入新语法时,它用于系统级编程功能,主要是手动内存处理。换句话说,可以为随意的用例编写Python代码(或几乎完全类似的代码),然后将Mojo用于更高级、性能密集型的编程场景。在这两种情况下,都可以利用现有的Python库,但性能成本更高。
Mojo与Python的另一大区别是,Mojo不像Python那样通过运行时进行解释。Mojo是提前编译的,使用LLVM工具链来加工本地代码。为此,最好的性能来自于使用Mojo特有的功能。Python功能很可能是以模仿Python的动态行为为代价的,这些动态行为本质上很慢,或者仅仅通过使用Python运行时来实现。
Mojo的许多母语特征有两个作用。它们要么是Python中根本没有的全新功能,要么是Python功能的扩展,使其更具性能,尽管Python的动态性较低。
Mojo的许多母语特征有两个作用。它们要么是Python中根本没有的全新功能,要么是Python功能的扩展,使其更具性能(尽管Python的动态性较低)。
例如,在Python中,没有办法在运行时正式声明变量引用不可变,尽管类型提示和其他机制可以在编辑时模仿这一点。在Mojo中,则可以使用关键字let和var来声明Mojo特定的变量,这与在Rust中使用的方法非常相似。let关键字表示变量是不可变的;var表示它是可变的。这些限制是在编译时强制执行的,所以试图变异不可变引用的程序甚至不会编译。
Mojo的语法与Python非常相似,但提供了新的关键字来启用Mojo特定的功能,如可变行为。
Mojo还有自己的struct关键字,与Python的class形成对比。类只是Python类,具有所期望的所有动态行为。不过,struct类型更像它们的C/C++和Rust对应类型,在编译时确定了固定的布局,但针对机器本机速度进行了优化。另一个旨在区分Mojo的行为和Python的行为的Mojo关键字是fn。如果你使用def来定义一个函数,那么就会得到了一个Python函数,以及与这些函数相关联的所有动态。fn关键字也定义了一个函数,但定义为Mojo函数。这意味着参数在默认情况下是不可变的,并且必须显式类型化,并且必须声明所有局部变量(除其他外)。
如果想知道用Mojo有多爽,现在还需要取号排队。Modular通过Modular Playground提供了对Mojo的早期访问,这是一个基于网络的Jupyter Notebook环境,运行在Modular的服务器上。目前,Mojo还没有可在自己的系统上下载的运行时。从好的方面来说,这意味着你可以通过任何带有网络浏览器的计算机运行Mojo。
Mojo在线环境附带了一些notebook示例,以及关于在某些任务中使用Mojo的详细内联注释。其中一个例子是一个常见的程序员演示,绘制了Mandelbrot集算法。乍一看,代码与Python非常相似。即使是新的特定于Mojo的关键字也能很好地与现有的Python语法集成,因此可以仔细查看代码并大致了解发生了什么。
Mojo游乐场在行动,运行Mandelbrot情节演示。用于生成此演示的代码是本地Mojo代码和Python库的混合,通过Mojo的Python运行时接口调用。
notebook 演示还举例说明了如何通过并行、向量化和“平铺”(增加操作的缓存位置)来加速Mojo代码。其中一个演示是128x128矩阵乘法演示,通过简单地按原样运行而无需特别修改,它的速度据称是Python的17倍(使用Mojo游乐场中的Python运行时)。
Mojo通过添加类型注释增加了1866x的加速,通过添加矢量化操作增加了8500x的加速和通过添加并行化增加了15000x的加速。
同样,验证这些声明的最佳方法是让Mojo在本地可用,但值得在同一代码中同时试验Python运行时和Mojo编译器,看看会发生什么。
Mojo的第一次公开演讲就证明了它是数据科学和机器学习的一种语言。这两个主题构成了Python现代用例的很大一部分,这并不是因为Python本身很快,而是因为它为难以使用的快速事物提供了一个方便的编程接口。
Mojo显然是为了提供该用例的默认快速版本,在该版本中,不必通过外部库来快速实现。Mojo的目标不是Python更广泛的用例集:web后端、流程自动化等等,至少在早期不是这样。这可能会在Mojo更完整、拥有更好的第三方库时出现,但这显然不是首要任务。
即使默认情况下Mojo更快,也很难取代Python在机器学习和数据科学中的地位。Python的用户社区、现有的软件文化和便利性都使其成为这些领域的支柱。Mojo必须做的不仅仅是快速地取代Python来完成这项工作。尽管如此,看看Mojo如何继续沿着其Python兼容和快速用例的路径,进行开发还是很有趣的。