Mojo 常被說成「Python 的寫法、C 等級的速度」,但這句話少講了很多條件。它最常見的兩個賣點——比 Python 快幾萬倍、完全相容 Python——前者是真的但前提很窄,後者其實是早期說法、Modular 後來自己已經修正。

先把 Mojo 是什麼講清楚,再一條一條看這些數字和說法的前提。

Mojo 是什麼

Mojo 由 Chris Lattner 主導開發。他做的東西你大概天天間接在用——LLVM 是一票現代編譯器和語言共用的底層基礎設施,而 Lattner 正是 LLVM 的作者,也是 Swift 語言的設計者。他的公司 Modular 想解決的問題是:AI 和高效能運算長年卡在「Python 好寫但慢、C++ 快但難寫」的二選一,Mojo 想兩邊都要。

做法是語法走 Python 風格,讓熟悉 Python 的人快速上手;底層接 MLIR,能編譯成接近原生的機器碼,還內建型別系統和向量化支援。

「快幾萬倍」的前提

先說那個最聳動的數字。Modular 官方拿來宣傳的招牌是 Mandelbrot 計算,Mojo 比 Python 快約 35000 倍。

這數字是真的,但怎麼來的要看清楚。35000 倍不是「把 Python 程式丟進 Mojo 就有」,而是一層層疊加最佳化的結果:先把 Python 移植成 Mojo(這步大概 46 倍),再手動加上型別、向量化(SIMD)、平行化,才一路堆到幾萬倍。而且 Mandelbrot 是純數值密集運算,本來就是這類最佳化最吃香的場景。

換成一般業務邏輯,多半到不了這個量級。所以看到「快 N 倍」的標題,先問一句:哪個 benchmark、做了多少手動最佳化。

「完全相容 Python」也要打折

Mojo 早期確實用「Python 超集合(superset)」行銷,意思是任何 Python 程式都該能直接當 Mojo 跑。但 Modular 後來自己修正了這個說法——截至 2024 年,Mojo 還缺 class、繼承這些 Python 動態特性,遠不是把 .py 改個副檔名就能跑。

真正要用既有 Python 套件時,Mojo 的做法是透過 interop 去呼叫 Python runtime,而不是原生執行。這跟「完全相容」是兩回事。

語法的真實樣子

最直接的證據就在語法。Python 定義函式用 def、型別標註可有可無:

1
2
3
# Python
def add(x, y):
return x + y

Mojo 的高效能函式用 fn,而且強制型別標註:

1
2
3
# Mojo:fn 強制型別,這本身就說明它不是「語法完全相同」
fn add(x: Int, y: Int) -> Int:
return x + y

變數宣告也不一樣。Mojo 早期有 let(不可變)和 var(可變)兩種,但 let 在 2024 年初就被移除了——照著舊教學寫 let,在當前版本根本編譯不過,只剩 var。光這幾點,就知道「無痛把 Python 程式搬過來」是不存在的。

平行運算的坑

效能來自你願意進到這些底層控制——而一旦開始用平行化壓榨多核心,就會遇到傳統系統程式設計的老問題。

Mojo 提供平行化機制把迴圈切塊丟到多核心跑,但如果你在平行迴圈裡直接對同一個變數累加,會踩到 race condition——多個執行緒同時寫同一塊記憶體,結果不可預期。

正確做法是每個執行緒先算自己那塊的部分和、寫進各自的位置,全部跑完再序列地加總起來。共享寫入這件事,平行運算裡永遠要小心。

適合誰,不適合誰

簡單給個判斷:

  • 適合:數值密集運算、AI kernel、想自己碰 SIMD 和平行化壓效能的人。
  • 不適合:期待把現成的完整 Python 專案直接搬過來跑、或重度依賴動態特性和大量第三方套件的人。

收尾

Mojo 是個有意思的語言,Lattner 的履歷也讓它值得認真看待。但截至 2024 年它還很早期——標準函式庫在長、語法還在變(let 被拿掉就是例子)、生態也還薄。

把前提補回來看,Mojo 比較像一個面向高效能 Python 使用者的新語言,而不是 Python 的加速開關。可以追蹤、可以玩,但別被「快幾萬倍」「完全相容 Python」這種行銷句沖昏頭——它們都有前提,補回去你才知道它現在真正能做什麼。