首页
Preview

Mojo:推进Python的潜力和克服挑战🔥

Mojo🔥是什么?Mojo编程语言简介

Mojo编程语言的目标非常雄心壮志。它旨在实现与Python生态系统的完全兼容,确保Python用户可以无缝过渡。同时,它还优先考虑可预测的低级性能,使开发人员可以获得精细的控制。此外,Mojo还旨在实现将特定代码子集部署到加速器的功能。

Mojo的开发者决心避免创建分散的软件生态系统,并希望避免Python用户在从Python 2迁移到Python 3时遇到的挑战。他们理解这些目标非常重要,但他们致力于实现它们。

虽然Mojo是一个新的代码库,但开发人员很幸运地可以建立在现有的概念基础之上。通过采用Python,他们简化了设计过程,因为大多数语法已经被规定了。这使他们可以专注于开发Mojo的编译模型和系统编程功能。他们还从其他语言(如Rust、Swift、Julia、Zig、Nim)中学到了宝贵的经验,并从中汲取了在将开发人员迁移到新编译器和语言方面的经验。此外,他们利用现有的MLIR编译器生态系统进一步增强Mojo。

Mojo的长期愿景是提供Python的超集,使其与现有的Python程序兼容。开发者的目标是采用CPython实现来支持长尾生态系统。他们希望Mojo对Python程序员来说感觉非常熟悉,同时为开发安全和高性能的系统级代码提供新的工具,这通常需要使用C和C++来处理Python。

开发者想要强调的是,他们不主张静态或动态方法的优越性。相反,他们认为这两种方法各有优点,取决于应用程序。通过Mojo,他们赋予程序员根据其特定需求决定何时利用静态或动态特性的权力。

基于Python

Python在机器学习和其他各种领域中占据着主导地位。它以易于学习、广泛被程序员采用、充满活力的社区、丰富的有价值的软件包集合以及各种可靠工具而闻名。Python对动态编程特性的支持使得开发优雅和富有表现力的API成为可能。这个特点已经让机器学习框架(如TensorFlow和PyTorch)将Python作为他们的高性能运行时的前端语言。

对于Modular来说,Python是他们API表面栈中不可或缺的组件,这是由客户需求驱动的。考虑到他们的其余堆栈是可以协商的,采用“Python优先”的方法是合理的。

从主观角度来看,Modular认为Python是一种美丽的语言。它的设计考虑了简单性和可组合性,避免了在实践中变得多余的不必要的标点符号,这要归功于缩进。Python还融合了强大的动态元编程特性。这些特点为Modular提供了根据他们的需求扩展语言的机会。他们希望Python生态系统中的人们将Mojo视为推进Python到下一个级别、完善它的手段,而不是竞争它。

Python兼容性

开发团队有一个全面的计划,以实现与Python生态系统的完全兼容,但需要注意的是,有两种类型的兼容性。以下是团队在两个方面的当前进展概述:

导入现有的Python模块:Mojo确保在Mojo程序中导入和使用现有的Python模块时100%兼容。这是通过利用CPython实现实现无缝互操作性来实现的。

将Python代码迁移到Mojo:然而,将Python代码完全迁移到Mojo的兼容性尚未实现。虽然Mojo已经支持了Python的几个核心功能,例如async/await、错误处理和可变参数,但它仍处于早期开发阶段,缺少许多其他Python功能。值得注意的是,即使是类的支持在Mojo中也还没有实现。

开发团队承认还有大量的工作要做,但他们有信心在适当的时候实现他们的目标。他们从构建其他经历了自己的兼容性旅程的重要技术中获得灵感,例如:

通往Clang编译器的旅程,它作为现有编译器(如GCC和MSVC)的“兼容替代品”,用于C、C++、Objective-C、CUDA和OpenCL等语言。虽然很难进行直接比较,但是Clang问题的复杂性似乎比实现Python的兼容替代品要大得多。

通往Swift编程语言的旅程,它采用了Objective-C运行时和语言生态系统,并成功地迁移了许多程序员和广泛的代码库。通过Swift,团队获得了有关实现“运行时兼容性”和与传统运行时合作的宝贵见解。

在Mojo和Python的情况下,团队预计Mojo将直接与CPython运行时合作,并提供类似的支持,以便与CPython类和对象进行无需代码编译的无缝集成。这使得无缝集成到现有代码的广泛生态系统成为可能,并促进了渐进式迁移方法,其中对Mojo的增量迁移带来了增量好处。

总的来说,团队坚信,通过专注于语言设计,并逐步实现与Python的完全兼容性,他们将在适当的时候实现他们的目标。

与Python的不同之处

尽管保持与Python的兼容性和迁移性对于Mojo的成功至关重要,但开发团队还将Mojo视为一流的独立语言,不依赖于其他语言。他们的目标是确保Mojo不受限于仅为了保持兼容性而引入新的关键字或语法规则。他们对兼容性的处理涵盖了两个主要方面:

利用CPython兼容性:Mojo利用CPython执行现有的Python 3代码,无需任何修改,以不改变其运行时的形式。这种方法确保了与整个Python生态系统的完全兼容。虽然以这种方式运行代码可能不会为Mojo带来与特定相关的立即好处,但是庞大的Python生态系统的可用性显著加速了Mojo的采用和发展。此外,Python在高级编程方面的强大性质与Mojo的目标相辅相成。

提供迁移工具:团队计划提供一种机械迁移工具,以确保那些希望将其代码从Python迁移到Mojo的人具有强大的兼容性。例如,为了防止Python代码使用与Mojo关键字匹配的标识符引起的迁移错误,Mojo引入了反引号功能,允许任何关键字作为标识符使用。通过结合这些方法,Mojo 在主要使用 CPython 的环境中可以有效地集成。与此同时,Mojo 程序员可以逐步将他们的代码模块逐个或文件逐个地转移到 Mojo 上,这种渐进式迁移策略从苹果公司成功的 Objective-C 到 Swift 的迁移中获得了灵感。

虽然建立 Mojo 的其余功能和实现迁移支持需要时间和精力,但团队有信心这种策略可以让他们集中精力并避免分心。此外,他们认为 Mojo 和 CPython 之间的关系可以双向发展。他们设想未来 CPython 团队可能会在 Mojo 中重新实现解释器,展示这种前景的潜力和兴奋。

解决 Python 的问题

通过将 Mojo 视为 Python 的超集,团队认为他们可以有效地解决 Python 存在的几个挑战。

Python 并非没有众所周知的问题。其中最突出的是低级性能差和特定于 CPython 的实现细节,例如全局解释器锁(GIL),这限制了 Python 的单线程执行。虽然许多正在进行的项目旨在改善这些限制,但 Python 所面临的挑战更深层次,具有重要的影响,特别是在人工智能领域。虽然我们不会在这里深入讨论技术细节,但我们将在 2023 年的背景下讨论它们的影响。

值得注意的是,在本节中,当我们提到 Python 时,我们特指 CPython 实现。我们将在讨论中稍后讨论其他实现。

两个世界的问题

由于各种因素,Python 不适合系统编程。然而,Python 作为粘合层表现出色,允许与低级绑定到诸如 C 和 C++ 等语言的无缝集成。这个特性使得 Python 生态系统内出现了诸如 NumPy、TensorFlow、PyTorch 等强大的库,提供了改进的性能特性。

不幸的是,虽然这种方法在构建高性能 Python 库方面非常有效,但它也带来了一些缺点。构建这些混合库的过程非常复杂。它需要深入了解 CPython 的内部工作原理,熟练掌握诸如 C/C++ 等语言(这会破坏使用 Python 的最初意图),阻碍了大型框架的发展,并在机器学习的情况下倾向于促进“基于图形”的编程模型,这种模型与“急切模式”系统相比可用性较低。TensorFlow 和 PyTorch 在这些问题上遇到了重大挑战。

除了由两个编程世界的共存带来的固有复杂性之外,这种情况还给整个生态系统带来了复杂性问题。例如,调试器通常难以无缝地跨 Python 和 C 代码进行步进,而那些可以做到的很少被广泛采用。Python 包生态系统必须应对 Python 和 C/C++ 代码。像 PyTorch 这样大量投资于 C++ 的项目正在有意识地努力增加其代码库中用 Python 编写的部分,认识到它提供的可用性收益。

总体而言,Python 和低级语言之间的交互所带来的挑战引入了系统复杂性,并对整个生态系统产生了影响。然而,正在努力解决这些问题,改善高性能 Python 库的可用性和效率。

三个世界和 N 个世界的问题

“两个世界的问题”是 Python 生态系统中普遍存在的挑战,但对于开发人员在机器学习框架上工作来说,这个问题变得更加明显。在人工智能领域,加速很普遍,专门的编程语言如 CUDA 用于各种加速器。虽然 CUDA 与 C++ 有些相似之处,但它具有自己独特的问题和限制。此外,它缺乏一致的工具,如调试器或分析器,并且实际上绑定了单个硬件制造商。

人工智能领域在硬件方面见证了非常高的创新水平,导致了复杂性的显著增加。因此,已经进行了大量尝试,开发专门的编程系统来加速器,包括 OpenCL、Sycl、OneAPI 等。然而,这种复杂性的爆炸只加剧了工具和整个生态系统中的基本分裂问题,给整个行业带来了重大挑战。

这个领域的持续分裂和缺乏统一的解决方案阻碍了进展,并为寻求利用加速技术的全部潜力的开发人员带来了困难。

移动和服务器部署

Python 生态系统面临的另一个持续挑战是部署领域。它涵盖了诸如依赖项管理、“a.out”文件的封闭编译的部署以及增强多线程能力和性能等多个方面。这些领域为 Python 生态系统内的实质性进展提供了机会。

CPython 的改进和 JIT 编译 Python

近来,Python 社区致力于增强 CPython 的性能和解决实现问题,取得了令人瞩目的成果。这项工作值得赞赏,因为它逐步改进了现有的 CPython 实现。例如,Python 3.11 通过内部增强实现,与 Python 3.10 相比实现了 10-60% 的性能提升,而 Python 3.12 则旨在通过跟踪优化器进一步推进。许多其他项目也致力于解决全局解释器锁(GIL),而 PyPy 等倡议利用即时编译(JIT)和跟踪技术加速 Python 执行。

虽然这些努力值得赞扬,并在社区内产生了兴奋,但它们并不能完全满足 Modular 的要求,因为它们并不促进开发面向加速器的统一语言。许多现代加速器对动态特性的支持有限,即使它们支持,性能也可能不佳。此外,系统程序员不仅注重性能,而且要求计算执行的可预测性和控制权。

在 Modular,目标是消除在 Python 库中使用 C 或 C++ 的需要,力求最大的性能,在某些情况下完全避免动态特性。因此,前面提到的方法与这些目标不符。Modular 团队寻求替代方案,以满足他们特定的需求,并使他们能够在系统编程方面实现最佳性能和控制。

其他类 Python 语言和 Python 子集

已经进行了几项努力,以创建 Python 的“可部署”版本,例如 PyTorch 项目的 TorchScript。这些举措很有价值,因为它们通常提供具有最小依赖关系的部署解决方案,并且有时表现出高性能。由于它们的 Python 类似语法,与全新语言相比,它们往往更容易接近学习者。

然而,由于它们是 Python 的子集,它们通常缺乏与更广泛的 Python 生态系统的互操作性。这种限制限制了它们与现有 Python 代码库的集成,并妨碍了它们利用广泛的 Python 工具,包括强大的调试器。此外,这些语言经常单方面修改某些 Python 行为,引入兼容性问题,并进一步分裂生态系统。例如,有些语言改变基本整数的行为,使其包装而不是遵循 Python 的数学约定。这些方法的挑战在于它们专注于解决Python的特定弱点,而忽视了它的优点。最多,它们可以作为C和C++的替代品,但在解决Python的动态用例方面存在缺陷,使“两个世界的问题”不断存在。这种方法导致了生态系统的分裂,而由此产生的不兼容性使得迁移变得困难,甚至不可能。我们可以回想一下从Python 2迁移到Python 3时遇到的困难,作为分裂和不兼容性引入的复杂性的证明。

因此,虽然这些可部署的Python变体试图解决某些限制,但它们并没有完全解决Python编程的更广泛需求和动态。

———

为什么Python程序员在部署代码时带上梯子?

因为他们想在部署中达到新的高度,避免任何依赖陷阱!🙂🙂🙂

译自:https://medium.com/@HeCanThink/mojo-advancing-pythons-potential-and-overcoming-the-challenges-3e4f7b24f036

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
alivne
复杂的问题简单化

评论(0)

添加评论