自 5 月 2 日首次亮相以來,Modular 公司的 Mojo 編程語言引起了開發(fā)人員的極大興趣,已經(jīng)有超 12 萬開發(fā)人員注冊使用 Mojo Playground,19 萬開發(fā)者熱情參與 Discord 與 GitHub 討論。Fast.ai 聯(lián)合創(chuàng)始人、數(shù)據(jù)科學家 Jeremy Howard 更是表示,“Mojo 可能是近幾十年來最大的編程語言進步?!?br>
Mojo 能夠切實滿足開發(fā)者需求,引導大家逐步采用新功能,從而在必要時獲得高性能體驗。具體來說,Mojo 可以為開發(fā)者帶來的主要收益:
- 一種語言編寫所有內(nèi)容:Mojo 能夠隨時隨地服務(wù)于 AI 開發(fā)者,將 Python 的可用性與以往強制開發(fā)者使用 C、C++ 或 CUDA 的系統(tǒng)編程功能結(jié)合起來。 開發(fā)者可以在公共代碼庫上工作,從而簡化從研究到生產(chǎn)的整個工作流程。
- 突破 Python 性能極限:時至今日,Python 已經(jīng)無處不在。但對于需要更高性能或特殊硬件的任務(wù),Python 的表現(xiàn)往往不那么理想。Mojo 能夠發(fā)揮 CPU 的性能潛力,并可良好支持 GPU 和 ASIC 等外部加速器,提供與 C++ 和 CUDA 相當?shù)淖吭叫阅堋?/li>
- 對接完整 Python 生態(tài)系統(tǒng):Mojo 提供與 Python 生態(tài)系統(tǒng)間的全面互操作性,使其能夠無縫利用 Python 庫資源,同時發(fā)揮 Mojo 自身的功能與性能優(yōu)勢。例如,開發(fā)者可以將 NumPy 和 Matpotlib 同自己的 Mojo 代碼無縫混合起來。
- 升級 AI 工作負載:Mojo 緊密集成有模塊化 AI 引擎,允許開發(fā)者通過自定義操作輕松擴展自己的 AI 工作負載,包括預處理、后處理操作和高性能數(shù)學算法。開發(fā)者還可以引入內(nèi)核融合、圖重寫、sharp 函數(shù)等。
通過對現(xiàn)有 Python 代碼做一點簡單變更,開發(fā)者就可以使用 Mojo 對高計算強度工作負載進行顯著加速(最高可提速 6.8 萬倍)。目前,Mojo 的實際應(yīng)用案例包括:
- 知名博主 Maxim Zaks 已經(jīng)用 Mojo 實現(xiàn)了多個樹數(shù)據(jù)結(jié)構(gòu),并發(fā)布了相關(guān)博文(https://pub.aimind.so/a-high-level-introduction-to-fibytree-bd7f8775d815)和一些初步基準測試結(jié)果(https://pub.aimind.so/fibytree-vs-set-and-sortedset-7b4e6b56cac8)。
- GitHub 用戶 MadAlex1997 在 Mojo 中構(gòu)建了 N 維數(shù)組的實現(xiàn)(https://github.com/MadAlex1997/Mojo-Arrays)。
Mojo 號稱將動態(tài)和靜態(tài)語言的優(yōu)點結(jié)合在一起,性能可達到目前 Python 的 68,000 倍,還提供與 Python 生態(tài)系統(tǒng)的完全互操作性,從而可以無縫使用 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 允許開發(fā)者構(gòu)建靜態(tài)編譯的可執(zhí)行文件,可以在沒有任何依賴項的情況下進行部署,例如:
$ 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 的官方擴展,支持語法高亮、語句診斷、格式化、補全建議等。
在即將發(fā)布的新版本中,團隊將在 VS Code 中添加通過 LLDB 命令行界面實現(xiàn)的交互式調(diào)試體驗。不僅如此,Mojo 的調(diào)試程序能夠在同一調(diào)試會話中無縫對 Mojo/C/C++ 混合代碼進行操作,進一步增強開發(fā)者在處理高度專業(yè)化代碼時的能力。