作者 | Serdar Yegulalp
策劃 | 云昭
Mojo很狂!它的目標非常有野心:“與Python/ target=_blank class=infotextkey>Python一樣易于使用,但與Rust一樣強大和快速。”
新推出的Mojo語言,被宣傳為多個領域中最好的:Python的易用性和清晰的語法,以及Rust的速度和內存安全。這些多少有些夸大其詞。由于Mojo仍處于開發的早期階段,用戶還需要一段時間才能親眼看到這種語言是如何達到他們的要求的。
Mojo的創建者,一家名為Modular的公司,提供了一個早期的在線運行環境:一個Jupyter Notebook環境,用戶可以在這里運行Mojo代碼并了解該語言的功能和行為。
因為Mojo還沒有作為最終用戶下載,所以我們首先關注的是Mojo作為一種語言是什么樣子的。我們將研究它與Python的相似之處,它的不同之處,以及它能為熟悉Python或其他語言的程序員提供什么。
1、Mojo:Python的超集
Mojo可以被描述為Python的“超集”。用Python編寫的程序是有效的Mojo程序,盡管有些Python行為尚未實現。目前在Python中找不到的Python行為的一些示例包括,函數的關鍵字參數、global關鍵字以及list和dict理解。也可以使用實際的Python運行時來處理現有的Python模塊,盡管這會帶來性能成本。
當Mojo引入新語法時,它用于系統級編程功能,主要是手動內存處理。換句話說,可以為隨意的用例編寫Python代碼(或幾乎完全類似的代碼),然后將Mojo用于更高級、性能密集型的編程場景。在這兩種情況下,都可以利用現有的Python庫,但性能成本更高。
Mojo與Python的另一大區別是,Mojo不像Python那樣通過運行時進行解釋。Mojo是提前編譯的,使用LLVM工具鏈來加工本地代碼。為此,最好的性能來自于使用Mojo特有的功能。Python功能很可能是以模仿Python的動態行為為代價的,這些動態行為本質上很慢,或者僅僅通過使用Python運行時來實現。
2、Mojo vs. Python 語法
Mojo的許多母語特征有兩個作用。它們要么是Python中根本沒有的全新功能,要么是Python功能的擴展,使其更具性能,盡管Python的動態性較低。
Mojo的許多母語特征有兩個作用。它們要么是Python中根本沒有的全新功能,要么是Python功能的擴展,使其更具性能(盡管Python的動態性較低)。
例如,在Python中,沒有辦法在運行時正式聲明變量引用不可變,盡管類型提示和其他機制可以在編輯時模仿這一點。在Mojo中,則可以使用關鍵字let和var來聲明Mojo特定的變量,這與在Rust中使用的方法非常相似。let關鍵字表示變量是不可變的;var表示它是可變的。這些限制是在編譯時強制執行的,所以試圖變異不可變引用的程序甚至不會編譯。
Mojo的語法與Python非常相似,但提供了新的關鍵字來啟用Mojo特定的功能,如可變行為。
Mojo還有自己的struct關鍵字,與Python的class形成對比。類只是Python類,具有所期望的所有動態行為。不過,struct類型更像它們的C/C++和Rust對應類型,在編譯時確定了固定的布局,但針對機器本機速度進行了優化。另一個旨在區分Mojo的行為和Python的行為的Mojo關鍵字是fn。如果你使用def來定義一個函數,那么就會得到了一個Python函數,以及與這些函數相關聯的所有動態。fn關鍵字也定義了一個函數,但定義為Mojo函數。這意味著參數在默認情況下是不可變的,并且必須顯式類型化,并且必須聲明所有局部變量(除其他外)。
3、Modular Playground
如果想知道用Mojo有多爽,現在還需要取號排隊。Modular通過Modular Playground提供了對Mojo的早期訪問,這是一個基于網絡的Jupyter Notebook環境,運行在Modular的服務器上。目前,Mojo還沒有可在自己的系統上下載的運行時。從好的方面來說,這意味著你可以通過任何帶有網絡瀏覽器的計算機運行Mojo。
Mojo在線環境附帶了一些notebook示例,以及關于在某些任務中使用Mojo的詳細內聯注釋。其中一個例子是一個常見的程序員演示,繪制了Mandelbrot集算法。乍一看,代碼與Python非常相似。即使是新的特定于Mojo的關鍵字也能很好地與現有的Python語法集成,因此可以仔細查看代碼并大致了解發生了什么。
Mojo游樂場在行動,運行Mandelbrot情節演示。用于生成此演示的代碼是本地Mojo代碼和Python庫的混合,通過Mojo的Python運行時接口調用。
notebook 演示還舉例說明了如何通過并行、向量化和“平鋪”(增加操作的緩存位置)來加速Mojo代碼。其中一個演示是128x128矩陣乘法演示,通過簡單地按原樣運行而無需特別修改,它的速度據稱是Python的17倍(使用Mojo游樂場中的Python運行時)。
Mojo通過添加類型注釋增加了1866x的加速,通過添加矢量化操作增加了8500x的加速和通過添加并行化增加了15000x的加速。
同樣,驗證這些聲明的最佳方法是讓Mojo在本地可用,但值得在同一代碼中同時試驗Python運行時和Mojo編譯器,看看會發生什么。
4、Mojo能取代Python嗎?
Mojo的第一次公開演講就證明了它是數據科學和機器學習的一種語言。這兩個主題構成了Python現代用例的很大一部分,這并不是因為Python本身很快,而是因為它為難以使用的快速事物提供了一個方便的編程接口。
Mojo顯然是為了提供該用例的默認快速版本,在該版本中,不必通過外部庫來快速實現。Mojo的目標不是Python更廣泛的用例集:web后端、流程自動化等等,至少在早期不是這樣。這可能會在Mojo更完整、擁有更好的第三方庫時出現,但這顯然不是首要任務。
即使默認情況下Mojo更快,也很難取代Python在機器學習和數據科學中的地位。Python的用戶社區、現有的軟件文化和便利性都使其成為這些領域的支柱。Mojo必須做的不僅僅是快速地取代Python來完成這項工作。盡管如此,看看Mojo如何繼續沿著其Python兼容和快速用例的路徑,進行開發還是很有趣的。