解讀編程語言的2021:Go,Rust成熟Kotlin、wasm、Julia無限生長
本文是“2021 InfoQ 年度技術(shù)盤點與展望”系列文章之一,由 InfoQ 編輯部制作呈現(xiàn),重點聚焦編程語言領(lǐng)域在 2021 年的重要進展、動態(tài),希望能幫助你準(zhǔn)確把握 2021 年編程語言領(lǐng)域的核心發(fā)展脈絡(luò),在行業(yè)內(nèi)始終保持足夠的技術(shù)敏銳度。
“InfoQ 年度技術(shù)盤點與展望”是 InfoQ 全年最重要的內(nèi)容選題之一,將涵蓋架構(gòu)、AI、大數(shù)據(jù)、大前端、云計算、數(shù)據(jù)庫、中間件、操作系統(tǒng)、開源、編程語言十大領(lǐng)域,后續(xù)將聚合延展成專題、迷你書、直播周、合集頁面,在 InfoQ 媒體矩陣陸續(xù)放出,歡迎大家持續(xù)關(guān)注。
特此感謝
· 阿里云程序語言與編譯器團隊負(fù)責(zé)人 李三紅
· Go 語言編程專家 郝林
· Julia 社區(qū)核心成員 田俊、陳久寧
· 獨立咨詢顧問 /《Rust 編程之道》作者 張漢東
· JetBrains 技術(shù)專家 / 布道師 范圣佑
· 英特爾高級技術(shù)經(jīng)理 王鑫
對本文的貢獻(xiàn)。
他們都以直接或間接的形式,參與建設(shè)該篇文章,部分內(nèi)容還以特別策劃的形式獨立成文,出現(xiàn)在盤點合集中??梢哉f,他們的真知灼見,是該盤點能與大家見面的關(guān)鍵。
需要聲明的是,編程語言不能算作一個真正意義上的“技術(shù)領(lǐng)域”,因此它在本系列盤點中,顯得尤為特殊。通常,當(dāng)我們談及一個獨立的技術(shù)領(lǐng)域時,往往意味著該技術(shù)存在相對獨立的商業(yè)價值、產(chǎn)業(yè)鏈、開發(fā)者群體。但編程語言只是個實現(xiàn)工具,同時又是整個 IT 世界的基礎(chǔ)設(shè)施,這種矛盾讓對編程語言的盤點顯得有點沉悶,卻又非常必要。在電影《天國王朝》里,主角貝里安問薩拉丁,耶路撒冷有什么意義?薩拉丁回答道:“Nothing”,隨后又說道:“Everything”。同樣的臺詞,套用在“編程語言”身上,或許剛好合適。
另外需要指出的是,IEEE 將編程語言以四個標(biāo)簽劃分,分別是:用于開發(fā)網(wǎng)站和應(yīng)用的語言(Web)、用于企業(yè)、桌面和科學(xué)應(yīng)用的語言(Enterprise)、用于移動設(shè)備端的語言(Mobile)以及用于嵌入式環(huán)境的語言(Embedded)。
但在本文中,凡在超過 2-3 個標(biāo)簽領(lǐng)域都有廣泛應(yīng)用的編程語言,我們將其稱之為“通用型語言”,以將 C/C 、Java 等語言和 JavaScript、R 等語言做好區(qū)分。我們將先對 2021 編程語言宏觀層面的發(fā)展情況做個回顧,再對 Kotlin、Rust、Go、Julia、WebAssembly 五種較有代表性語言的具體發(fā)展作垂直解析。
2021 編程語言核心趨勢
通用型語言:關(guān)注硬件性能及異構(gòu)編程
近兩年業(yè)界出現(xiàn)一種聲音:摩爾定律已經(jīng)失效了。這主要源于主流硬件廠商在 14nm 工藝上的長時間停滯,以及英偉達(dá) CEO 黃仁勛在 2019 年 CES 展會上的發(fā)言:“摩爾定律過去是每 5 年增長 10 倍,每 10 年增長 100 倍。而如今,摩爾定律每年只能增長幾個百分點,每 10 年可能只有 2 倍。因此,摩爾定律結(jié)束了。”
誠然,這個判斷所引起的爭議是非常大的,無論是蘋果 M1 芯片,還是亞馬遜云科技的 Graviton3 都在晶體管密度上延續(xù)了“摩爾定律”的判斷。但在所有擔(dān)憂背后,是 IoT 、AI,乃至元宇宙引發(fā)的越來越旺盛的算力需求與硬件工藝極限之間的矛盾。
放在今日,則深刻地影響了通用型編程語言的發(fā)展——從早期如何追求單核環(huán)境下的極致性能,到今日如何充分利用多核算力。
對協(xié)程的支持,就很好地反映了主流編程語言關(guān)注點的轉(zhuǎn)移。2021 最重要的一個動態(tài),當(dāng)數(shù) 2021 年 11 月第三周,Java 即將支持虛擬線程(協(xié)程)的消息。消息來自 Oracle 提交的一份 JDK 增強建議(JEP)草案,草案要求將虛擬線程作為 Java 標(biāo)準(zhǔn)版的一部分進行預(yù)覽。
草案中提到虛擬線程將補充 Java 的平臺線程(代表操作系統(tǒng)線程),采用輕量級的用戶模式線程實現(xiàn),將更有效地利用可用的硬件,并大大降低成本。虛擬線程目的是更好地支持編寫和維護高吞吐量并發(fā)應(yīng)用程序。
這則消息,意味著最主流的編程語言已經(jīng)全部支持或正在支持協(xié)程,包括 C 、Python、C#、Go(原生) 。這也代表著對硬件性能利用率的關(guān)注,已成為各家編程語言的大勢所趨。Python 是其中尤為典型的例子,與 Google TPU 、TensorFlow 生態(tài)的高度契合,助其第五次問鼎 TIOBE 年度編程語言。
另外需要重點提及的,是異構(gòu)編程。異構(gòu)編程是對“編程語言 & 硬件性能”這個議題在寬度上的延展。2021 年,華為發(fā)布了北冥多樣性計算融合架構(gòu),其中包含了畢晟 C 及其他組件,而這里的畢晟 C ,主要是服務(wù)于跨 CPU、GPU 算力編程的需求。這是國產(chǎn)基礎(chǔ)軟件,在編程語言層面向前邁進的一大步。
如果從這個時間點向前查找,我們會發(fā)現(xiàn)在 2020 年 10 月,英特爾發(fā)布了 oneAPI 1.0,目標(biāo)在于簡化跨不同計算體系結(jié)構(gòu)的應(yīng)用程序開發(fā);2008 年,蘋果帶頭創(chuàng)建了跨平臺計算框架 OpenCL;而在更早的十余年前,英偉達(dá)就發(fā)布了 CUDA,用于支持 GPU 編程。
問題在于,異構(gòu)編程,無論在語言還是框架層面,學(xué)習(xí)成本都非常的高。從本質(zhì)上講,異構(gòu)編程要求開發(fā)者對硬件之間的差異性有深刻的洞察,并能結(jié)合硬件差異做異常精細(xì)的性能調(diào)優(yōu)。這導(dǎo)致團隊引入后,研發(fā)效率相對降低(學(xué)習(xí)成本、遷移成本)。所以常規(guī)的通用型語言,也會提供異構(gòu)編程接口作為折中,比如 Java TornadoVM 就是用于支持異構(gòu)硬件的特性。
況且,異構(gòu)編程底層支持工具的推出和更新,重度依賴于自研硬件的各個廠商。但當(dāng)今的硬件市場,不但沒有收斂,反而有更加碎片化的趨勢。各家的異構(gòu)編程框架,往往只注重適配自己的體系,對其他的行業(yè)主流硬件既不愿過問,也沒有足夠的資源過問,這也為底層開發(fā)者的工作開展增加了難度。
放眼未來,開源,或許是打破現(xiàn)存問題的一種更好的組織模式。
我們既要性能也要安全,研發(fā)效能則需特別討論
這隨之引發(fā)了另一矛盾:性能和研發(fā)效率,通常是相悖的。在此前 InfoQ 對“Java 之父” James Gosling 的采訪中,他用 Java 和 JavaScript 的區(qū)別來說明這個問題。至于內(nèi)存安全,在相當(dāng)漫長的時間里,在以 C/C 為底層技術(shù)棧的開發(fā)群體內(nèi),則通常不在考慮范圍內(nèi)。
Rust 在 2021 年的大火,為全行業(yè)提供了新的啟發(fā)。在 InfoQ 2021 編程語言榜單 中,Rust 無論是關(guān)注度還是期望值,都緊隨 Go 語言之后。若單論關(guān)注度的增速,Rust 無疑是 2021 年最吸睛的編程語言。尤其是在 2021 年 12 月,Linux 內(nèi)核和 Rust on Linux 的主要開發(fā)者 Miguel Ojeda 向 Linux Kernel 郵件列表提交了一個新補丁 (v2),進一步推進了 Rust for Linux 的工作進展,將公眾對 Rust 的關(guān)注推向了新的高潮。
Rust 最重要的優(yōu)勢在于以媲美 C/C 的性能表現(xiàn),解決了編程過程中的內(nèi)存安全問題,從而成為各團隊在系統(tǒng)級編程領(lǐng)域的重點調(diào)研對象。
C 問世四十年,相關(guān)方法技巧已經(jīng)成熟,催生了編程大神無數(shù),但在 2021 年的今天,我們?nèi)匀辉趯ふ移涮娲?。其根本原因在于,人們逐漸明了,性能并非系統(tǒng)級編程語言的全部,隨著軟件逐漸接管 IoT 設(shè)備(尤其是自動駕駛車輛),內(nèi)存溢出 / 指針懸垂類的內(nèi)存安全問題,已經(jīng)不只會造成經(jīng)濟損失,更會威脅人身安全。與其面向結(jié)果,出了問題再改 Bug,不如面向過程從一開始就把控好內(nèi)存安全。
但 Rust 的上手難度,又在一定程度上,制約了語言本身的普及(知乎有一吐槽:為什么用 Rust 實現(xiàn)鏈表都這么難)。了解函數(shù)式編程或?qū)W(xué)習(xí) Rust 有所幫助,但編程世界未來的主流仍將是 OOP(面向?qū)ο蟪绦蛟O(shè)計)。更大的問題在于中小型公司的替換成本 —— 不存在成熟的人才梯隊,不存在堅實的技術(shù)積累,直接采用 Rust 面臨的問題是:無人可招。當(dāng)下,幾乎所有準(zhǔn)備采用 Rust 的公司都是大型公司或創(chuàng)業(yè)團隊,前者可以通過內(nèi)部轉(zhuǎn)崗積累人才,后者則從一開始就是圍繞 Rust 構(gòu)建的創(chuàng)業(yè) idea。
相比性能與安全,研發(fā)效能在今天反倒成為了一個模糊問題。狹隘地說,選擇一門學(xué)習(xí)門檻低,開發(fā)效率高的語言,就是提升了研發(fā)效能;站在更大范圍、更長的時間尺度來看,選擇一門性能滿足研發(fā)需求、生態(tài)成熟、內(nèi)存安全有保障的語言,也是提升了研發(fā)效能;選擇社區(qū)夠完善,招聘難度低的語言,方便快速組建研發(fā)團隊,也是變相提升了研發(fā)效能。
那么,在 2021 ,一個研發(fā)團隊?wèi)?yīng)該如何選擇適合自己的編程語言?在保證了性能需求和安全需求后,則需要結(jié)合業(yè)務(wù)場景、公司發(fā)展階段具體分析了。
八仙過海,承諾兌現(xiàn)
除通用型語言外,如果要用四個字形容 2021 年各家垂直領(lǐng)域語言的發(fā)展,那么恐怕是“八仙過?!绷?。垂直領(lǐng)域用特定語言解決特定問題的趨勢越發(fā)明顯,語言的“工具”屬性愈發(fā)突出。
在移動端開發(fā),Kotlin 獨樹一幟;在數(shù)據(jù)科學(xué)領(lǐng)域,Python 和 R 語言應(yīng)用甚廣;在 Web 端,有越來越多的人開始嘗試使用 TypeScript。但需要注意的是,當(dāng)下所謂的 xx 領(lǐng)域?qū)S谜Z言,或許到了 2022 年,就會產(chǎn)生天翻地覆的變化。如果細(xì)細(xì)琢磨,你可能會發(fā)現(xiàn),這種變化正在發(fā)生,比如 Kotlin、Julia。
WebAssembly 是其中比較另類的存在,它致力于讓其他語言都能以接近原生語言的速度在 Web 端運行,目前最主流的應(yīng)用是將 C/C 編譯為 WebAssembly。其在 2021 的具體進展,我們在接下來的“2021 主要編程語言的具體發(fā)展”中單獨討論。
同時,編程語言也在兌現(xiàn)給開發(fā)者的無數(shù)承諾,那些在社區(qū)內(nèi)早有風(fēng)聲的前瞻性修改,在 2021 最終完成了“填坑”。
2021 代表性編程語言的發(fā)展概況
(關(guān)于 Go、Rust、Julia 的更多內(nèi)容,可額外參考本次盤點特別策劃部分,文章鏈接詳見附錄)
Go
說到“填坑”,2021 當(dāng)數(shù) Go 語言最得人心。作為編程語言界最近幾年最受歡迎的一員,Go 卻長期存在三個主要問題為開發(fā)者所詬病,即:模塊管理工具、泛型語法支持,以及程序錯誤的處理方式。
關(guān)于模塊管理工具,Go 語言開發(fā)團隊基本已經(jīng)解決或給出路徑;對泛型的支持,相當(dāng)于有了定論;錯誤處理方式還未找到妥善的解決辦法。而 Go 語言的 2021 主要動態(tài),也是圍繞著模塊管理工具和泛型展開。
GO111MODULE 是個系統(tǒng)環(huán)境變量,目的是方便開發(fā)者們在原始的 GOPATH 機制和新的 go module 機制之間做切換。Go 團隊在 1.16 版本中把 GO111MODULE 的默認(rèn)值設(shè)置為了 on ,這標(biāo)志著 go module 機制的成熟。同時,這也說明 Go 團隊已開始正式普及 go module 機制。
從 Go 官方提供的標(biāo)準(zhǔn)工具來看,原有的那些 go 命令都已經(jīng)完全適配了 go module 機制。比如,go get 命令現(xiàn)在可用于調(diào)整 Go 模塊的依賴關(guān)系,go install 命令現(xiàn)在可用于下載、編譯和安裝 Go 模塊, go test 命令現(xiàn)在也可用于編譯并測試 Go 模塊,等等。
圍繞模塊管理中的配置文件,另外有三點值得注意:
- 模塊圖修剪:在 go.mod 文件中,針對主模塊的直接依賴模塊記錄和間接依賴模塊記錄已變得完整;
- 新的指令:在 1.16 版本中,Go 團隊為 go.mod 文件增加了一個新指令。這個指令的名字叫做 retract。我們在這里可以把它理解為“撤回”,用于撤回當(dāng)前模塊的某個已發(fā)布版本;
- 新的注釋:在 1.17 版本中,Go 團隊為 go.mod 文件增設(shè)了 deprecation 注釋,用來廢棄整個模塊。
對泛型的支持,最早要追溯到 2018 年,但直到 2021 年 8 月,Go 團隊才放出了一個終極的設(shè)計方案:Type Parameters Proposal(https://github.com/golang/proposal/blob/master/design/43651-type-parameters.md) 。至此,一個緊密貼合了 Go 語言的泛型模型才算正式出爐。Go 語言的 1.17 版本中已經(jīng)包含了一些與自定義泛型有關(guān)的代碼,不過要想自由地使用泛型,則要等到 1.19 甚至更遠(yuǎn)的版本了。
除此之外,2021 年,Go 在標(biāo)準(zhǔn)命令、標(biāo)準(zhǔn)庫、語法、性能方面都有更新,我們這里簡單列舉,作為參考:
標(biāo)準(zhǔn)命令:
- 在 1.16 版本,Go 官方對 go install 命令進行了改進,使它可以接受一種版本后綴(如:@v1.0.0),并以此來下載、編譯并安裝(以下統(tǒng)稱為安裝)某個代碼包的特定版本;
- 從 1.16 版本開始,Go 官方推薦開發(fā)者在 go module 機制下只使用 go install 命令來安裝代碼包,并強烈建議,在使用 go get 命令的時候應(yīng)該攜帶 -d 標(biāo)記;
標(biāo)準(zhǔn)庫:
- 新增三個代碼包:runtime/metrics 包(獲取運行時指標(biāo),涉及垃圾回收、內(nèi)存使用、并發(fā)調(diào)度等)、io/fs(代表了一種全新的文件系統(tǒng)模型)、embed(在可執(zhí)行文件中嵌入額外的資源);
- 廢棄 io/ioutil 包;
語法:
支持從切片到數(shù)組指針的轉(zhuǎn)換。更具體地說,類型為 []T 的切片現(xiàn)在可以被正確地轉(zhuǎn)換為以 *[N]T 為類型的數(shù)組指針了;
性能:
- 在 64 位的 Linux 操作系統(tǒng)上,其鏈接速度比 1.15 版本快了 20%-25%,同時鏈接操作所占用的內(nèi)存空間也減少了 5%-15%。此外,由于更激進的符號修剪,Go 程序經(jīng)處理后產(chǎn)生的二進制文件通常也更小了。
- 在 1.17 版本中,Go 團隊實現(xiàn)了一種使用寄存器而不是堆棧來傳遞函數(shù)參數(shù)值和結(jié)果值的新方法。這一新方法讓 Go 程序的運行性能提升了大約 5%。并且,Go 程序產(chǎn)出的二進制文件通常也會小 2% 左右。目前,在 Linux、macOS 和 Windows 操作系統(tǒng)的 64 位計算結(jié)構(gòu)上,Go 語言都自動啟用了此功能。
Rust
2021 ,Rust 的熱度絲毫不遜于 Go 語言,但本次盤點特約專家張漢東有一句話說得很好:“Rust 的出現(xiàn)不是為了重寫這個世界已經(jīng)存在的一切,而是為了讓未來更加美好?!?/span>
對于當(dāng)下本就關(guān)注度極高的 Rust 來說,分外適用。
2021 年,Rust crates 的下載總量達(dá)到 11,012,362,794 次,即 110 億次。
伴隨著下載量的增長,Rust 語言內(nèi)存安全初步成果也已經(jīng)顯現(xiàn)。據(jù) 2021 年 12 月 31 日發(fā)布于 arXiv 的論文 《SOK: On the Analysis of Web Browser Security》中所言:
比較了四種瀏覽器架構(gòu),以及近十年來瀏覽器中內(nèi)存安全問題依然是主流,比如 Firefox 就通過 Oxidation 項目(Rust)替換了 12% 的組件。自 2015 年以來,F(xiàn)irefox 的內(nèi)存安全漏洞數(shù)量出現(xiàn)了小幅但穩(wěn)定的下降,其中,渲染器的內(nèi)存安全漏洞明顯下降。
Oxidation 是專門用于將 Rust 代碼集成到 Firefox 中的一個項目。Firefox 54 以來,所有平臺都需要 Rust 支持,并且第一個主要的 Rust 組件是在 Firefox 56 (encoding_rs) 和 57 (Stylo) 中發(fā)布的。展望未來,Oxidation 的目標(biāo)是讓在 Firefox 中使用 Rust 變得更容易和更高效,并相應(yīng)地增加 Firefox 中的 Rust 代碼量。
可以說經(jīng)過六年的應(yīng)用,Rust 語言的內(nèi)存安全保障終于看到了初步的效果。該論文建議瀏覽器供應(yīng)商遵循這一最佳實踐,并逐步將他們的瀏覽器轉(zhuǎn)向內(nèi)存安全的語言。
Rust 語言及相關(guān)生態(tài)在 2021 年一些看點簡單羅列如下:
- Rust 編譯器引入了一個新的實驗性 GCC 后端,以及另一個基于 gcc 的實現(xiàn)(目前兩者都在進行中)。
- Rust 正在進入 Linux 內(nèi)核,這也為語言和庫帶來了一些改進以促進這一壯舉。
- Rust 首次進入 Redmonk 指數(shù)前 20 名 ,并連續(xù) 第六年獲得 Stack Overflow 調(diào)查的“最受歡迎的編程語言”桂冠。
- IEEE 2021 編程語言排行榜,Rust 排 17。按趨勢來排,Rust 在第十位。
- 2021 年初 Rust 基金會剛成立,到年末,已經(jīng)有二十五家來自不同領(lǐng)域并且有一定建樹的成員。并且基金會也開始落實一些具體安排,比如組織專業(yè)的 crates.io 運營。
- 瑞士 Concordium 基金會宣布 DevX 計劃,將贊助 Rust 生態(tài)的維護者們。
- Espressif (樂鑫)正式雇傭 mabez 針對 eso 芯片開發(fā) Rust 支持:esp-rs。
- 嵌入式 Rust 生態(tài)得到長足發(fā)展:嵌入式并發(fā)框架已經(jīng) 1.0 、嵌入式異步框架正在大力開發(fā)且支持 STM32,nRF 和 RP2040 平臺,并且還深深影響著 Rust 異步的改進、嵌入式開發(fā)和調(diào)試工具又發(fā)布了新的探針工具、嵌入式 smoltcpTCP/IP 棧發(fā)布了新版本、嵌入式圖形庫 Matrix 發(fā)布了新版本、新的嵌入式實時 OS Hubirs 開源。
- WebAssembly 領(lǐng)域。前文提到的字節(jié)碼聯(lián)盟的 wasmtime 的 Cranelift 編譯后端完成了新的后端架構(gòu)更改,還得到了 IBM 大型機的支持而引入了新的 s390x 后端。有兩個和 Rust 相關(guān)的 Wasm 項目進入了 CNCF :WasmEdge 和 WasmCloud 。
- 圖形計算領(lǐng)域:rust-cuda 和 rust-gpu 這兩個項目,為推動 Rust 成為 GPU 計算第一語言開始發(fā)力。前者是將 Rust 作為 GPU 第一語言,后者則推動 Rust 成為圖形渲染第一現(xiàn)代化著色語言。
- 國內(nèi) Rust 職位招聘有所增長:字節(jié)跳動、海致星圖(圖數(shù)據(jù)庫)、非凸科技(量化)、達(dá)坦科技(分布式存儲)、Datebend(數(shù)據(jù)倉儲)都大量需要 Rust 人才。
- GUI 領(lǐng)域的 SixtyFPS 和 tQCS 這樣的咨詢公司建立了合作關(guān)系,找到了第一個客戶,招募了新成員。tQCS 提供世界 No.1 的 Qt 咨詢和 UI/UX 設(shè)計服務(wù),選擇和 SixtyFPS 合作,這也算是 Rust 在 GUI 領(lǐng)域的一個里程碑。
- Embark Studios 發(fā)布了它們公司第一個 3A 游戲,在其游戲后端也用到了 Rust 。Embark Studios 是 Rust 游戲工作組的成員之一,致力于將 Rust 推廣到游戲開發(fā)中。rust-gpu 庫就是他們開源的項目之一,并且該公司也贊助了很多游戲和圖形學(xué)相關(guān)的 Rust 生態(tài)庫。
- Rust 在 音視頻領(lǐng)域也得到了應(yīng)用,Signal 公司使用 Rust 開發(fā)了支持 40 人高質(zhì)量語音群組通話的服務(wù)。
- Rust 也成為前端基礎(chǔ)設(shè)施的一員:Next.js 公司用 swc 和 Rust 完全取代 Babel(transpilation)和 Terser(壓縮)。
就版本更新而言,Rust Edition 現(xiàn)在已經(jīng)確定了 —— 每三年發(fā)布一個版次。這就意味著 Rust 每三年都會圍繞一個引領(lǐng) Rust 發(fā)展的主題。
2021 Edition 的主題是「成熟(Mature)」。2021 edition 并沒有引入太多新特性,而是清理了一些技術(shù)債務(wù),比如持續(xù)對 Rust 編譯器進行重構(gòu)和改進,包括內(nèi)部使用的新的 trait 系統(tǒng) chalk 和 query 系統(tǒng)(開源版本:https://github.com/nikomatsakis/salsa)。另外還處理了一些向后兼容的問題,以及持續(xù)投入一些影響未來發(fā)展的關(guān)鍵特性,比如 常量泛型、泛型關(guān)聯(lián)類型等。
前文我們也提到, Rust 今年的一個重要動態(tài)就是對 Linux 內(nèi)核的支持。到 2022 年,我們很可能會看到 Linux 內(nèi)核中的實驗性 Rust 編程語言支持成為主流。而在 2021 年 12 月 6 日早,Rust 團隊發(fā)出的更新的補丁中,則介紹了在內(nèi)核中處理 Rust 的初始支持和基礎(chǔ)設(shè)施。
這次更新的內(nèi)容包括:
- 升級到了最新 Stable 編譯器和 Rust 2021 edition 。因此可以擺脫了 const_fn_transmute,const_panic、const_unreachable_unchecked、core_panic 和 try_reserve 這幾個之前未穩(wěn)定的特性。
- 自定義 core 和 alloc。為 alloc 添加了更加模塊化的選項,以便禁用一些他們不需要的功能:no_rc 和 no_sync,主要是為上游 Rust 項目添加。
- 更嚴(yán)格的代碼、文檔和新的 lint。
- 抽象和驅(qū)動程序更新。添加了序列鎖、電源管理回調(diào)的抽象,io 內(nèi)存(readX/writeX)、irq 芯片和高級流處理程序,gpio 芯片(包括 irq 芯片)、設(shè)備、amba 設(shè)備和驅(qū)動程序以及證書。此外,也改進并簡化了 Ref(refcount_t 支持)對象并用它替換了 Rust 的 Arc 的所有實例。完全地從 alloc crate 中刪除了 Arc 和 Rc。
從現(xiàn)在開始,Rust for linux 團隊將開始定期提交補丁,每兩周左右。
關(guān)于 Rust,還有一點不得不提,那就是發(fā)生在年末的審核團隊(mod team)集體離職事件。但當(dāng)塵埃落定,事件本身的性質(zhì)已經(jīng)不好評價,涉及美國獨有的政治、文化及種族問題。張漢東在采訪中說道:
“2020 年 Rust 1.44 版本發(fā)布時,官方博客說過這么一句話:「tech is and always will be political」。對于美國文化不太了解的我,之前還對審核團隊存在的重要性嗤之以鼻,現(xiàn)在感覺審核團隊的存在對于 Rust 這樣深處文化政治復(fù)雜的美國是多么重要。我終于理解 Rust 官方團隊所說這件事的背景相當(dāng)復(fù)雜的原因了。真心希望 Rust 團隊能處理好這件事。對此,我們能做些什么呢?也許只能祈禱世界和平?!?/span>
Kotlin
2021 年剛好是 Kotlin 10 周年,在這一年里,Kotlin 共發(fā)布了 1.5 及 1.6 兩個版本,目前最新版本為 Kotlin 1.6.10。如果要將其中的關(guān)鍵動態(tài)總結(jié)一下,那么會分為如下四點:
- K2 編譯器:目標(biāo)是全新打造的編譯器架構(gòu),提供更好的性能并為多平臺發(fā)展建立良好的基礎(chǔ)。
- Kotlin Multiplatform Mobile(KMM)持續(xù)更新,預(yù)計在 2022 年春天發(fā)表 Beta 版本;
- Kotlin/JS:新的 IR 編譯器發(fā)表 Beta,更多 JS 庫遷移到新 IR 編譯器;
- Compose Multiplatform 1.0:可用于 Desktop 和 Web 的聲明式 UI 框架,對安卓開發(fā)者來說,更容易從 Jetpack Compose 切入;
K2 編譯器是 Kotlin 在 2021 年最重要的更新。編譯器分為前端和后端,功能包含生成語義信息的 IR (中間表示),并轉(zhuǎn)為相應(yīng)目標(biāo)平臺(JVM、JS、Native)的可執(zhí)行文件。Kotlin 1.5 版本就已經(jīng)開始支持 K2 編譯器,目前 Kotlin/JVM 已是穩(wěn)定版本,Kotlin/JS 是 Beta 版本。
Kotlin 的開發(fā)生態(tài)圈非?;钴S,目前 Kotlin 團隊共有約 100 位開發(fā)人員,超過 360 位開源貢獻(xiàn)者參與開發(fā)工具,2021 年約有 25 萬個與 Kotlin 有關(guān)的代碼倉庫在 GitHub 上被創(chuàng)建出來。
有兩份報告可供我們參考:
開發(fā)人員及開源貢獻(xiàn)者數(shù)據(jù):
https://kotlinlang.org/lp/10yearsofkotlin/present/
Kotlin 開發(fā)生態(tài)系調(diào)查:
https://www.jetbrains.com/zh-cn/lp/devecosystem-2021/kotlin/
而 2021 年, Kotlin 整個生態(tài)的活躍,也從側(cè)面印證了這些官方團隊和開源貢獻(xiàn)者的工作成果。生態(tài)進展如下:
JetBrains 方面:
- UI 框架:Compose Multiplatform 1.0
- Server-side:Ktor 2.0 beta,Kotless 0.2.0
- Data Science 及 ML:Kotlin API for Spark,Kotlin DataFrame library,KotlinDL
- 工具:Dokka 1.6(文檔引擎),Kover(代碼覆蓋率),Qodana(靜態(tài)分析器)
社區(qū)方面:
- Spring Native
- Arrow (Kotlin library for functional programming) release 1.0
- Koin (dependency injection framework) release 3.0
- KorGE (Game engine) release 2.0
- Okio (I/O library for Kotlin Multiplatform) release 3.0
- Apollo (GraphQL client) release 3.0
此外,Kotlin 也很重視中國開發(fā)者的生態(tài)建設(shè),2021 年,他們與 Kotlin User Group 合作,舉辦了中文開發(fā)者大會,吸引了 1500 觀眾參加。
Kotlin 2022 年的發(fā)展重點可以總結(jié)為如下四點:
- 持續(xù)發(fā)展 K2 編譯器:優(yōu)化性能、編譯速度及支持插件的能力
- 改善開發(fā)者體驗:優(yōu)化 Kotlin IDE 插件,提升穩(wěn)定度及性能,讓修改、測試除錯循環(huán)可以更高效
- 深化支持 Kotlin 在 Server-side 的應(yīng)用:更多是 Spring 及 Ktor 方面的應(yīng)用
- 推出新版 Kotlin Multiplatform Mobile(KMM):預(yù)計在 2022 年春天推出 Kotlin Multiplatform Mobile Beta,并持續(xù)改善共享代碼的開發(fā)體驗
(具體路線圖可參考:https://kotlinlang.org/docs/roadmap.html)
而在這背后,是 Kotlin 積極地向多平臺語言演進的努力,用本文的話語體系來講,就是“通用型語言”。我們可以看到 JetBrains 提供了多個支持多平臺的庫如 kotlinx.coroutines,kotlinx.serialization,kotlinx-datetime,而 Kotlin 社區(qū)也緊跟著這樣的趨勢發(fā)展,出現(xiàn)了愈來愈多的庫、框架來支持多平臺,如 Arrow、Okio、Apollo 等在新版本中都支持了多平臺開發(fā)。
令 Kotlin 社區(qū)工作者苦惱的是,自 2017 Google 發(fā)表聲明后,Kotlin 總被當(dāng)成是安卓專用開發(fā)語言。實際上,Kotlin 極有可能在接下來的兩個領(lǐng)域成為主流編程語言:
- Desktop:設(shè)計 Kotlin 的初衷就是要拿來開發(fā) IntelliJ IDEA,隨著 Compose Multiplatform 的發(fā)布,使用 Kotlin 開發(fā) Desktop 軟件將更加輕松;
- Server-side:Kotlin 100% 與 Java 互操作的特性讓許多 Java Server-side 開發(fā)者轉(zhuǎn)而使用 Kotlin,現(xiàn)也有 Spring 官方的支持及 JetBrains 推出的 Ktor 框架,使用 Kotlin 開發(fā) Server-side 應(yīng)用將有機會成為主流。2021 年 使用 Kotlin 做 Server-side 開發(fā)的用戶提升了 40%,可見其潛力;
同時,Kotlin 對 WebAssembly 的支持工作也提上了議程,未來也將成為 Web 端編程語言的可選項之一。
就這一點而言,我們倒不妨大膽暢想 Kotlin 2022 年的發(fā)展態(tài)勢,看其在未來幾年內(nèi),能否重現(xiàn)當(dāng)初 Objective-C 兩奪年度最佳編程語言的盛況。
Julia
在剛剛過去的 2021 年,Julia 編程語言社區(qū)依然保持了高速發(fā)展。據(jù)統(tǒng)計,目前 Julia 的全球總用戶量已超過一百萬,有一萬多家公司和一千五百多所高校下載和使用了 Julia。此外,一些世界名校,如北京大學(xué),MIT、Stanford 和 Berkeley 等,已經(jīng)在教學(xué)中使用 Julia 語言。Julia 默認(rèn)的注冊表中新增了 1128 個包,累計達(dá)到了 5397 個。詳細(xì)的信息可以前往 JuliaHub.com 查看,獲取各個庫下載信息的方法也已在官方論壇中公布。
2021 年,Julia 發(fā)布了兩個重要版本,分別是 Julia@v1.6 和 Julia@v1.7。此外,在 Julia@v1.7.0 于 11 月 30 日發(fā)布的同時,社區(qū)正式宣布 Julia@v1.6 為新的長期支持版(LTS)。Julia 官方博客中詳細(xì)介紹了 Julia@v1.7 的一些新特性,這里我們列出尤其值得關(guān)注的幾點:
- 全新的多線程特性:解決了許多運行時的競態(tài)條件,優(yōu)化了多線程之間任務(wù)的調(diào)度,同時讓默認(rèn)的隨機數(shù)生成器對多線程更加友好,此外還新增了一類原子操作作為基本的語言特性;
- 包管理的更新:新版的包管理工具會自動識別出該包是否已經(jīng)注冊,如果是的話,則會提示你是否要自動安裝;
- 對 Apple Silicon 的支持:Julia@v1.7 是首個能運行在 Apple Silicon 上的版本,但對該平臺的支持還僅處于 tier 3 (即僅處于實驗性質(zhì),編譯 / 測試有可能失敗);
- BLAS/LAPACK:運行時的后端切換;
- 編譯延遲和運行時體積優(yōu)化;
- 更好的類型推斷、代碼分析和檢查;
而在社區(qū)和生態(tài)方面,Julia 的進展和動態(tài)極多。關(guān)于社區(qū),我們尚可簡述重點:FluxML 社區(qū)于 12 月 1 日正式宣布掛靠在 NumFocus;JuliaComputing 完成 A 輪融資。
以及國內(nèi)鏡像站進一步增加,包括:
- 北京外國語大學(xué) (https://mirrors.bfsu.edu.cn/julia)
- 清華大學(xué) (https://mirrors.tuna.tsinghua.edu.cn/julia)
- 上海交通大學(xué)(https://mirrors.sjtug.sjtu.edu.cn/julia)
- 中國科學(xué)技術(shù)大學(xué) (https://mirrors.ustc.edu.cn/julia)
- 南方科技大學(xué) (https://mirrors.sustech.edu.cn/julia)
- 南京大學(xué) (https://mirrors.nju.edu.cn/julia)
但關(guān)于生態(tài),以及 Julia 在行業(yè)內(nèi)的實踐,則受限于篇幅,需要你移步附錄中的特別策劃了??偟膩碚f,Julia 的發(fā)展和 Kotlin 有共通之處,都在由特定領(lǐng)域的專用語言,轉(zhuǎn)而向多領(lǐng)域通用語言發(fā)展。
WebAssembly
于 WebAssembly 而言,2021 年發(fā)生了一件大事。
就在 2021 年的 10 月, Photoshop 發(fā)布了 Web 版本,大量使用了 WebAssembly。Photoshop 是傳統(tǒng)的巨型桌面軟件,代碼庫完全基于 C 編寫。這次成功發(fā)布 Web 版本,驗證了大型、高復(fù)雜度、基于傳統(tǒng)高級語言編寫的軟件,是完全可以通過 WebAssembly 運行在 Web 端的。
而在區(qū)塊鏈智能合約領(lǐng)域,WebAssembly 因為對 Web 的兼容,且允許使用 C 、Rust 編寫高性能程序,已成為事實上的王牌語言。在 IoT、可信計算、輕量級容器等領(lǐng)域內(nèi),WebAssembly 都有十分契合的特性。這讓開發(fā)者群體對 WebAssembly 的關(guān)注度迅速增長。
2021 年,WebAssembly 語言技術(shù)值得關(guān)注的發(fā)展包括:
- WebAssembly 開源項目開始支持 GC(垃圾回收器),為實現(xiàn) WebAssembly 支持像 Java、Kotlin 這樣的前端語言做準(zhǔn)備;
- WebAssembly SMID 可變長度取得關(guān)鍵進展,幫助 WebAssembly 應(yīng)用充分獲得 CPU 向量化計算加速能力;
- WebAssembly 模塊化取得關(guān)鍵進展,為進一步構(gòu)建 WebAssembly 的生態(tài)提供了核心的支撐;
- 源碼調(diào)試能力的增強,WebAssembly Micro Runtime 和 WASMTIME 等開源項目都提供了源碼的調(diào)試能力,極大促進應(yīng)用開發(fā)的效率
另一個重要動態(tài)是“字節(jié)碼聯(lián)盟(Bytecode Alliance)”正式成為了非營利性實體組織,致力于開發(fā)基于 WebAssembly 和 WASI 的安全開源軟件棧,建立一個默認(rèn)安全的 WebAssembly 生態(tài)系統(tǒng),讓應(yīng)用程序開發(fā)人員和服務(wù)提供商能夠自信地在任何基礎(chǔ)設(shè)施、任何操作系統(tǒng)或設(shè)備上運行不受信任的代碼。字節(jié)碼聯(lián)盟發(fā)展十分迅速,其成員包括 Fastly、英特爾、微軟、Google、Amzaon、Arm、 西門子等企業(yè)。業(yè)界普遍期望字節(jié)碼聯(lián)盟可能會更有效率地推進 WebAssembly 的更新和迭代工作。
更多的編程語言,如 Python、Swift……我們難以在同一篇文章中全部盤點,只能寄希望于 2022 年,我們繼續(xù)關(guān)注編程語言領(lǐng)域的核心動態(tài)。相信在 2022 ,各大編程語言也會為開發(fā)者帶來新的驚喜。
附錄:2021 編程語言盤點特別策劃及 Java 2021 部分動態(tài)盤點
解讀 Julia 的 2021:逐步邁向主流編程語言:https://url.cy/Sr7oU1
解讀 Go 語言的 2021:穩(wěn)定為王:https://mp.weixin.qq.com/s/9LKyPfhwldgZY7H4iS7sjg
解讀 Rust 的 2021 (上):https://mp.weixin.qq.com/s/aTCogUxyUwE6Sa4Nfs9CYA
Java 2021 部分動態(tài)盤點:https://www.infoq.cn/theme/125