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