自 5 月 2 日首次亮相以来,Modular 公司的 Mojo 编程语言引起了开发人员的极大兴趣,已经有超 12 万开发人员注册使用 Mojo Playground,19 万开发者热情参与 Discord 与 GitHub 讨论。Fast.ai 联合创始人、数据科学家 Jeremy Howard 更是表示,“Mojo 可能是近几十年来最大的编程语言进步。”
Mojo 能够切实满足开发者需求,引导大家逐步采用新功能,从而在必要时获得高性能体验。具体来说,Mojo 可以为开发者带来的主要收益:
- 一种语言编写所有内容:Mojo 能够随时随地服务于 AI 开发者,将 Python 的可用性与以往强制开发者使用 C、C++ 或 CUDA 的系统编程功能结合起来。 开发者可以在公共代码库上工作,从而简化从研究到生产的整个工作流程。
- 突破 Python 性能极限:时至今日,Python 已经无处不在。但对于需要更高性能或特殊硬件的任务,Python 的表现往往不那么理想。Mojo 能够发挥 CPU 的性能潜力,并可良好支持 GPU 和 ASIC 等外部加速器,提供与 C++ 和 CUDA 相当的卓越性能。
- 对接完整 Python 生态系统:Mojo 提供与 Python 生态系统间的全面互操作性,使其能够无缝利用 Python 库资源,同时发挥 Mojo 自身的功能与性能优势。例如,开发者可以将 NumPy 和 Matpotlib 同自己的 Mojo 代码无缝混合起来。
- 升级 AI 工作负载:Mojo 紧密集成有模块化 AI 引擎,允许开发者通过自定义操作轻松扩展自己的 AI 工作负载,包括预处理、后处理操作和高性能数学算法。开发者还可以引入内核融合、图重写、sharp 函数等。
通过对现有 Python 代码做一点简单变更,开发者就可以使用 Mojo 对高计算强度工作负载进行显著加速(最高可提速 6.8 万倍)。目前,Mojo 的实际应用案例包括:
- 知名博主 Maxim Zaks 已经用 Mojo 实现了多个树数据结构,并发布了相关博文(https://pub.aimind.so/a-high-level-introduction-to-fibytree-bd7f8775d815)和一些初步基准测试结果(https://pub.aimind.so/fibytree-vs-set-and-sortedset-7b4e6b56cac8)。
- GitHub 用户 MadAlex1997 在 Mojo 中构建了 N 维数组的实现(https://github.com/MadAlex1997/Mojo-Arrays)。
Mojo 号称将动态和静态语言的优点结合在一起,性能可达到目前 Python 的 68,000 倍,还提供与 Python 生态系统的完全互操作性,从而可以无缝使用 Python 库。
以下为使用 Mojo 计算欧几里得距离的代码:
$ mojo Welcome to Mojo! 🔥 Expressions are delimited by a blank line. Type `:mojo help` for further assistance. 1> %%python 2. import numpy as np 3. n = 10000000 4. anp = np.random.rand(n) 5. bnp = np.random.rand(n) 6> from tensor import Tensor 7. let n: Int = 10000000 8. var a = Tensor[DType.float64](n) 9. var b = Tensor[DType.float64](n) 10. for i in range(n): 11. a[i] = anp[i].to_float64() 12. b[i] = bnp[i].to_float64() 13> from math import sqrt 14. def mojo_naive_dist(a: Tensor[DType.float64], b: Tensor[DType.float64]) -> Float64: 15. var s: Float64 = 0.0 16. n = a.num_elements() 17. for i in range(n): 18. dist = a[i] - b[i] 19. s += dist*dist 20. return sqrt(s) 23> fn mojo_fn_dist(a: Tensor[DType.float64], b: Tensor[DType.float64]) -> Float64: 24. var s: Float64 = 0.0 25. let n = a.num_elements() 26. for i in range(n): 27. let dist = a[i] - b[i] 28. s += dist*dist 29. return sqrt(s) 30. 31> let naive_dist = mojo_naive_dist(a, b) 32. let fn_dist = mojo_fn_dist(a, b) 33. print(fn_dist) 34. 1290.821425092235 35. print(naive_dist) 36. 1290.8521425092235
此外,Mojo 允许开发者构建静态编译的可执行文件,可以在没有任何依赖项的情况下进行部署,例如:
$ mojo build hello.🔥 $ ./hello Hello Mojo 🔥! 9 6 3 $ ls -lGtranh hello* -rw-r--r-- 1 0 817 Sep 3 23:59 hello.🔥 -rwxr-xr-x 1 0 22K Sep 3 23:59 hello
Mojo 还拥有 Visual Studio Marketplace 的官方扩展,支持语法高亮、语句诊断、格式化、补全建议等。
在即将发布的新版本中,团队将在 VS Code 中添加通过 LLDB 命令行界面实现的交互式调试体验。不仅如此,Mojo 的调试程序能够在同一调试会话中无缝对 Mojo/C/C++ 混合代码进行操作,进一步增强开发者在处理高度专业化代码时的能力。