Mojo 作者 Chris Lattner 谈编程言语的进化

图片

作者 | David Cassel
译者 | 明知山
策划 | Tina

Mojo,一种新的基于 Python 的模块化编程语言,于 2023 年问世,专为 GPU 和其他加速器而设计。它的官方 FAQ 中提到,“我们的目标不仅仅是打造一个‘更快的 Python’,而是实现一个全新的系统编程层面,提供对加速硬件的直接访问能力”。

或者,正如 Chris Lattner 在接受采访时所说的,他们的目标是专注于“如何表达”硬件的全部能力。同时,他们也希望“在用户熟悉的环境中”保持 Python 的风格和体验,因为许多人,尤其是在 AI 领域,都在广泛使用 Python。

一种编程语言的演化其实是一个难得的机会,我们不仅可以深入探索语言设计决策背后的逻辑,还可以探究将这些决策聚合在一起的底层哲学。在 2024 年,程序员真正关心的是什么?在播客“Software Unscripted”的第 100 集,Lattner 分享了他对设计编程语言、编译器以及相关基础设施的见解。

播客主持人 Richard Feldman,Roc 编程语言作者,开场便提出了一个关键的问题:现如今有这么多编程语言,为什么还要开发一种全新的语言?对此,Lattner 不假思索地回答:“这本质上是一种解决问题的方式。”

Lattner 给出的答案不仅回答了“为什么”,还回答了“做什么”和“怎么做”——为我们提供了对当前整个编程语言生态系统的全面视角。

对 Python 的部分演进

Lattner 认同 Feldman 的说法,即 Mojo 正在利用 Python 生态系统,同时通过“部分演进”来改进性能。这项工作正在进行中。Lattner 表示,“我们今年秋天的目标之一是能够轻松地使用 Mojo 创建 Python 包”,将 Mojo 的卓越性能带给 Python 开发者。

Mojo 将“去除与 C 语言互操作的复杂性,”Lattner 说道,同时提供“与 C 语言或 C++ 相同或更好的性能。”

Lattner 随后说这是一件“自然而然的事情”,因为一个成功的语言社区其规模自然会扩大。“程序员希望将自己的技能向前推进,就会自然而然地将这些技能带入他们想要应用的相关领域。”

当然,Lattner 最后也给出了一个更简单的答案:“我们开发 Mojo,因为我们关心 AI、GPU 以及加速器相关领域的东西。”

“Python 社区有很多声音是关于‘让原生 Python 变得更快,可以获得 20 倍的加速’等等,但 Mojo 的理念是‘怎样不从 Python 出发却可以让它变得更好’。我们说的是‘挖掘硬件的极限性能’。我们要释放硬件的全部潜能——这不仅仅是,比如,让 int 类型变得很快……还包括加速器、SIMD(单指令 / 多数据并行处理)以及所有这类东西……”

“这取决于具体的工作负载,但我们有一篇博文展示了 Mojo 的性能可能比 Python 快 65000 倍。”

“对此常见的反驳是‘在 Python 中,你不需要编写涉及大量数学运算的代码’,但这正是 Mojo 的精髓所在——它让你能够使用一种与 Python 保持一致且连贯的语言编写同样的代码。因此,你无需切换语言!

SIMD 支持和第二语法

为了提供一流的并行处理支持,Mojo 的 SIMD 语法包含了所有不同数字类型的元素。

图片

Lattner 在这里对现代编程语言做了一番评论:“顺便说一句,自 20 世纪 90 年代末以来,所有处理器都支持 SIMD,但为什么没有编程语言去拥抱现代计算机呢?这对我来说一直是个谜。”(随后他再次对“如此多的代码仍然是单线程的”表达了惊讶。)

Mojo 还找到了一种提升性能的方法,使其可以超越 Python。“Python 中的整数是大整数,”Lattner 解释说,“你可以创建任意大小的整数,它们是堆分配的,具有引用语义。”Mojo 在语法中保留了 int 这个名称,同时也在标准库中引入了自己的替代类型——Int(大写的 I)。这个 Int 是一个结构体,极大地简化了 Mojo 编译器的工作。

尽管 Mojo 仍然兼容 Python 的原始语法,但如果你选择使用 Mojo 的 Int 类型,“你将获得更好的性能和可预测性。它还能在 GPU 上运行,等等。这不是说一个比另一个更好,而是一种权衡。”

变复杂,解锁超能力

Lattner 说,“一些芯片厂商”决定全力支持包含“虚数”(虚数在技术应用中被广泛使用,比如工程和物理公式等)的数学。“因此,一旦有人将这些技术集成到硬件中,并惊叹‘这比单独进行乘法和加法快了 10 倍’,我们也不得不说‘10 倍的性能提升’——因为他们将这些技术嵌入到了硅片中……那么我们该如何让这一优势为人们所用,而不必让他们深入了解背后的复杂性呢?”

Mojo 支持使用复数来定义结构体,这些结构体具备基本的行为和“一系列方法——包括乘法”。如果编译器检测到存在复数加速硬件,并且该硬件支持特殊的快速乘法指令,那么美妙的事情就会发生。“所有使用复数的程序都将获得加速,而开发者无需操心额外的细节。”

Mojo 保留了 Python 的运算符重载功能,即自定义操作符默认行为的能力,并保留与 Python 语法的兼容性。最终,许多额外的复杂性都转移给了库开发者。

Lattner 提到,他知道有很多编译器工程师,但他想将“人才生态系统”提升到库开发者所在的上游——那些深刻理解自己领域以及知道如何利用 GPU 性能增强手段的程序员。他说:“我的 Mojo 旅程实际上是关于释放这些人的潜力,并赋予他们超能力。”

后来他说,这与过去五到十年该领域的“趋势形成了鲜明对比……‘将复杂性嵌入编译器,将其锁定并扔掉钥匙,然后相信我们——我们这些编译器开发者’……但我看到的是,这实际上并不是真的……编译器很少能带来 10 倍的性能提升。但在应用领域工作的人,因为他们了解自己的应用程序——完全有可能实现,因为他们可以使用合适的工具来实现。”

最终的结果是,在光数字就有十几种不同类型的领域,“我们能够让人们在库中定义这些类型,减轻语言需要与所有硬件打交道的负担!”

Mojo 社区

在节目结束时,Lattner 呼吁有兴趣的程序员可以看看 Mojo 的官网及其“丰富的文档资源。Mojo 社区非常活跃!我们有一个 Discord 频道——据我所知,大约有 20000 人,他们在讨论各种话题,共同构建项目。”

他还补充了一句鼓舞人心的话:“Mojo 不仅仅是一种 AI 语言,社区还用它来构建 Web 服务器、GUI 库以及各种其他项目。我们非常希望人们能参与进来。Mojo 目前还处于相对早期的阶段,我们仍在不断添加核心功能和构建库。”

“但我们拥有一个庞大的社区,他们都非常热情,我希望人们能够参与进来。”

声明:本文由 InfoQ 翻译,未经许可禁止转载。