前段時間,B 站推出的青年節演講視頻《后浪》在朋友圈刷屏,看著“后浪”們豐富多彩的生活,同事們紛紛自嘲自己就是被拍在沙灘上的那一個,被生活瘋狂蹂躪。然而在編程語言界,“后浪”們掀起的波瀾則十分有限。與近年來陸續涌現的新興編程語言相比,那些出道即巔峰、一巔幾十年的“前浪”們,似乎還沒有要退位讓賢的意思。
在 TIOBE 公布的最新編程語言排行榜中,排名前十的語言中有 8 個誕生于上個世紀 90 年代,最“年輕”的是誕生于 2001 年的 C#,而位于榜首的 C 語言距今已有 48 年的歷史。如果我們再來縱觀自 2002 年以來的編程語言排行榜,基本上也還是這些老牌編程語言的身影,尤其是 C 與 Java 這兩位“前浪”老大哥的江湖地位一直難以撼動。
數十年來,陸續出現的新興編程語言不在少數,其中不乏一些以取代某種老語言為目的而設計的,那么這些編程語言界的“后浪”們,是否能夠追上“前浪”們的腳步呢?下面不妨讓我們來看看這些年編程界的知名“后浪”們。
前浪 C++(1979)VS后浪Go(2009)
誕生于 2009 年的 Go 語言堪稱編程語言中的“星二代”。Go 的早期作者有三人,分別是 Rob Pike,Ken Thompson 和 Robert Griesemer,每一位的來頭可都不小。Rob Pike 曾是貝爾實驗室的 Unix 團隊以及 Plan 9 操作系統計劃的成員,與 Thompson 共事多年,并共創出廣泛使用的 UTF-8 字元編碼;Ken Thompson 則是 B 語言、C 語言的作者,Unix 之父,1983 年圖靈獎和 1998 年美國國家技術獎得主;而 Robert Griesemer 在開發 Go 之前是 Google V8、Chubby 和 HotSpot JVM 的主要貢獻者。
2007 年,Rob Pike 認為 C++ 在 Google 分布式編譯平臺上的編譯過程太過漫長,于是他和 Robert Griesemer 開始探討 “簡化編程語言相比于在臃腫的語言上不斷增加新特性,會是更大的進步”。兩人一拍即合,隨即說服了身邊的 Ken Thompson,三人決定要搗鼓一門新語言。幾天后,他們在 Google 內部發起了一個叫 Golang 的項目 。很快,一個在 C 語言基礎上進行了優化的新語言誕生了,這就是 Go 。
作為一個設計目的就是為了取代 C/C++ 的新語言,Go 的語法在很多地方借鑒了 C/C++ 。比如用花括號作為定界符,以分號作為語句結束等等,這使得 Go 很容易就能被精通 C/C++ 的開發人員接受。而在沿襲 C/C++ 基本語法的基礎上,Go 新加入了很多針對當下流行的分布式系統的實用功能,比如超輕量級的線程 goroutine,在高并發的系統中,可以按照多線程的方式寫程序,從而保證邏輯的清晰和簡單,又可以獲得非常高的性能。而同樣的事情在 C++ 中則需要調用第三方框架,如果用多線程,會導致系統線程過多帶來大量的上下文切換 overhead;如果采用基于消息的架構,雖然可以獲得較高的效率,但程序邏輯會被打散,可讀性和可維護性較差。
此外,Go 語言作為 Google 大力支持的“親兒子”,擁有編譯、測試、調試、性能分析等一整套成熟的工具,編譯效率極高,再加上其還內置了 http、json、xml、正則表達式等很多后端系統開發中常用的庫,可以說是一門已經非常成熟的工程化開發語言。而在這方面,C++ 則需要用到大量的第三方開源工具或庫,在工程上需要花費更多的精力進行技術選型,同時也不利于后期維護。
基于上述的優點,Go 語言被公認為非常適合構建命令行實用程序和網絡服務等,尤其是云計算場景下的高并發應用,如今廣泛流行的容器引擎 Docker、容器編排系統 Kubernetes 都是用 Go 編寫的,Go 也因此被一些人稱為“容器語言”。
雖然 Go 在很多方面已經超越 C/C++,并且在云原生相關領域占有了一席之地,但是仍然難以撼動 C/C++ 語言在大量工業基礎設施終端的地位。C/C++ 的優勢仍然在于它的運行效率,如果是低級設備驅動程序、內核空間操作系統組件以及其他需要嚴格控制內存布局和管理的任務,C 依然是不二之選。
目前,Go 在各種權威編程語言排行榜上都名列前茅,且一直呈上升趨勢,在云原生建設如火如荼地當下,Go 至少在“云”這一領域已經完成了對前輩的超越。
前浪 C++(1979)VS后浪Rust(2010)
Rust 是繼 Go 之后另一個試圖取代 C/C++ 的新語言。2010 年前后,隨著大規模業務的拓展和分布式計算的流行,Graydon Hoare 也和 Rob Pike 一樣看到了 C++ 等傳統編程語言在高并發場景下的缺陷,試圖創造更優秀的語言來替代它們。Rust 原本是 Graydon 從 2006 年開始搗鼓的個人項目,隨后該項目得到了 Mozzila 基金會的資助,而 Graydon 本人也于 2009 年加入 Mozzila 公司,帶領團隊完善 Rust 語言的開發。2010 年,Mozzila 正式對外透露了 Rust 的存在。2013 年,Mozzila 基金會宣布將與三星合作,使用 Rust 語言開發一款瀏覽器引擎 Servo,成為首個使用 Rust 編寫的大型項目。2015 年,Rust 首個 1.0 正式版發布。
Rust 最初是 Mozilla 為了解決軟件在語言級別上無法真正利用多核計算帶來的性能提升而創建的,這一點與 Go 有些類似。相比前輩 C++,Rust 在代碼安全這一特性上下足了功夫。比如內存安全方面,Rust 在安全代碼里不容許空指針、懸垂指針和數據競爭,這些問題在編譯階段就無法通過。Rust 社區核心開發者 Nichols 表示:“之前,我們只能使用 C 或者 C++ 才能編寫具有較低內存占用空間的高質量代碼。但是,在生產代碼中使用這些語言需要你手動管理內存并了解可能導致未定義行為的所有方法。”Nichols 指出,不斷擴展的 CVE 代碼漏洞數據庫證明,即使是最優秀的程序員也疲于應對層出不窮的代碼漏洞。“為了確保你安全地使用內存,Rust 編譯器非常嚴格,這樣你就可以專注于你真正想要解決的問題。”
盡管 Rust 憑借其代碼安全的特性獲得了部分開發者的青睞,但由于其無論是在性能還是語法上,均不足以顛覆C/C++,再加上其學習曲線并不平滑,因此與“家大業大”的 Go 相比,Rust 在前期的發展不溫不火。直到去年 7 月,微軟突然宣布將擁抱 Rust,探索用 Rust 作為 C/C++ 和其他語言的安全替代方案,以此來改善應用程序的安全狀況。微軟認為 Rust 是目前業界系統編程的最佳選擇,原因不僅是它能夠以內存安全的方式編寫系統級程序,還在于其精密性。
微軟此舉讓 Rust 在開發者中的地位直線上升,越來越多的企業和個人開始關注并重視代碼安全的問題,從而重新審視這門新語言,這主要體現在 2020 年以來圍繞 Rust 語言發生的幾件事情:Linux 內核維護者表示愿意接受用 Rust 開發 Linux 驅動;AWS宣布贊助 Rust;微軟更進一步,在今年年初開發并開源了受 Rust 啟發的新編程語言 Verona;最近,蘋果也站出來擁抱它,計劃將部分 C 代碼移植到 Rust 。
目前,Rust 語言的發展總體來說仍然比較緩慢,根據最新的一份調查報告顯示,大多數不愿意接受 Rust 的開發者認為,Rust 目前的問題主要在于學習曲線陡峭、缺少所需的庫、缺乏 IDE 支持等??梢哉f,Rust 的發展仍然任重道遠。
前浪 Objective-C(1986)VS后浪Swift(2014)
Swift 是為數不多的成功把“前浪”拍在沙灘上的“后浪”。
2010 年,或許是受到競爭對手 Google 推出 Go 的啟示,Apple 高層也決定開發一套新的編程語言,用以替代使用了數十年的 Objective-C,而最早接到這個任務的人正是 Chris Lattner。Chris 在大學還沒畢業的時候就成為了業內知名的編譯器專家,其碩士期間發表的論文奠定了 LLVM 框架的發展基礎。在加入 Apple 公司以后,Chris 創造的 LLVM + Clang 成為了 Apple 軟件產品的編譯框架。而 Swift 語言就是 Chris 繼 LLVM 與 Clang 之后的又一力作。
Swift 是一門博采眾長的現代語言,在設計的過程中,Chris 參考了 Objective-C、Rust、Haskell、Ruby、Python、C# 等語言的優點,最終形成了 Swift 的語法特性。與前輩 OC 相比,Swift 的語法更加簡潔,例如行尾不再需要分號,if/else 語句也不需要括弧,調用方法時 [ ] 也不再嵌套,支持字符串插入,省略了 OC 中的 %s,%d,%@ 等等。同時,Swift 把 oc 頭文件 .h 和實現文件 .m 合并成了一個代碼文件 .swift,使得Swift 代碼更易于維護。最重要的是,擅長優化的蘋果工程師讓 Swift 的運行速度能夠逼近 C++,是 OC 運行速度的近 1.4 倍。在 Swift 誕生以后,蘋果軟件的開發者只需要維護原來一半量的代碼文件,大大提高了開發效率,降低了維護成本。
目前,Swift 幾乎已經完全取代 Objective-C ,成為蘋果旗下 MacOS 、iOS 的主流開發語言,很多剛剛入行的 iOS 新人開發者甚至沒有接觸過 Objective-C 。不出意外的話,Objective-C 很有可能在不久的將來被人們逐漸遺忘。然而 Swift 團隊的目標似乎遠不止于干掉老大哥這么簡單,在即將發布的 5.3 版本中,Swift 將增加對 Windows 和其他 Linux 發行版 PC 操作系統的支持(目前僅支持 MacOS 和 Ubuntu),至于其后續發展如何,我們還將持續關注。
前浪 JavaScript(1995)VS后浪Dart(2011)
Dart 是 Google 工程師們繼 Go 之后造的又一個輪子。與 Go 類似,Dart 最初也是一群 Google 工程師覺得 JavaScript 不太行,因此想要重新造一個更好的語言取代它,于是就有了 Dart 。
Google 工程師認為,JS 當初從設計到發布的時間極短(僅為 7 個月),在語言規范和謹慎性方面存在先天不足,比如語法過于松散、缺乏模塊化能力、核心庫不完備、編程語言范型不明確等,且難以用改良的方式來修復。事實上,Google 工程師多年來也為改善 JavaScript 的性能做出了諸多貢獻,特別是通過 V8 引擎強化了 JIT 對 JS 的編譯能力,從而讓 Chrome 瀏覽器的性能一騎絕塵。這足以說明當時的 JavaScript 在 Google 工程師眼里確實存在很多問題。
Dart 最初也是作為一種在瀏覽器中運行的腳本語言而生,Google 還專門在 Chrome 中內置了 一個 DartVM 引擎用來對 Dart 進行推廣 。得益于 Chrome 龐大的用戶體量,這一舉措讓 Dart 積累了規??捎^的早期用戶群體。
原以為在 Google 的保駕護航下,Dart 能夠穩步發展并最終趕超 JavaScript。然而令 Google 沒想到的是,半路竟殺出了一個 Node.js 。Node.js 是一個 JavaScript 運行環境,它讓 JavaScript 可以開發后端程序,實現幾乎其他后端語言實現的所有功能,這意味著 JavaScript 可以與 PHP、Java、Python、.NET、Ruby 等后端語言平起平坐。從那時起,“ 凡是能用 JavaScript 寫的應用終將用 JavaScript 來寫 ”開始在圈內廣為流傳。值得一提的是,Node.js 正是基于 Google 自己的開源 JavaScript 引擎 V8 開發而來。V8 本來是用于 Chrome 對 JavaScript 的解釋器,鬼才 Ryan Dahl 把 V8 搬到了服務器上,用來做服務器的軟件并取得了成功。在往后的幾年里,前端開發的模式因 JavaScript 而改變,React、React-Native、Vue 等基于 JavaScript 的明星項目迅速崛起,Dart 逐漸被人們遺忘在角落。
然而 Google 一直沒有放棄 Dart 。2018 年,Google 對 Dart 進行了底層重構,并于 8 月推出了 Dart 2.0 版本,將其重新定義為一種同時支持 Web 和移動客戶端開發、具有豐富工具箱和組件的語言。同年 12 月,Google 發布了用 Dart 編寫的跨平臺應用開發工具Flutter,讓 Dart 能夠在服務端編寫命令行程序,同時在前端可以編譯成 JavaScript 運行在瀏覽器中。隨后,Google 開始新一輪發力推廣全新的 Dart ,包括為另一個知名前端框架 Angular 推出對應的 Dart 版本,指定 Dart 作為未來的操作系統 Fuchsia 的官方開發語言等,Dart 社區又煥發了勃勃生機。
可以說在剛剛誕生的前幾年里,作為一門運行在瀏覽器中的腳本語言,Dart 是完敗于前輩 JavaScript 的。而如今乘著“大前端”的變革浪潮,要說超越 JavaScript 雖然也不太現實(畢竟“凡是能用 JavaScript 寫的東西終將用 JavaScript 來寫” ),但 Dart 在未來一段時間里還是一個非常有潛力的“后浪”代表。
前浪 Java(1995)VS后浪Kotlin(2011)
Kotlin 是 Google 公司繼 Go 之后又一力捧的新編程語言。Kotlin誕生于2010 年,出自 JetBrains,并于2012年正式開源。Kotlin 最初的設計目的是為了創建一種兼容 Java 的編程語言,并讓它比 Java 更好。
作為一門相對比較新的 JVM 語言,Kotlin 得到了 Google 公司的大力支持。2017年,Google 在 I/O 開發者大會上官宣Kotlin 正式成為 Android 官方開發語言。兩年后的 I/O 大會上,Google 再次加碼 Kotlin,宣布其成為Andoid 開發官方首選語言。
Kotlin 的語法融合了 Scala、Groovy、Python、Swift 等眾多語言的特性,如果使用過其中任意一門語言,上手 Kotlin 將非常容易。與 Java 相比,Kotlin 引入了函數式編程方式,同時有各種語法糖簡化了代碼量。但與其他試圖取代“前浪”的新語言不同,Kotlin 走的是一條 100% 兼容 Java 的道路(打不過就加入)。眾所周知,Java 這么多年屹立不倒的原因是因為其發展多年積累的龐大生態,包括豐富的函數庫、IDE、編譯器、成熟的應用生態等等。Kotlin 則可以調用 Java 的絕大多數庫,也就可以直接使用 Java 現有的生態,因此很多開發者選擇混用 Kotlin 與 Java。
由于采用的是與前輩和諧共生的模式,目前Kotlin 已經超越 Scala 和 Clojure,成為 JVM 上第二大受歡迎的語言,尤其是在安卓開發領域得到了很多國內外開發者的認可,也是一個非常有前景的優秀“后浪”。
結語
這些 21 世紀以后(2010 年前后)以取代老語言為目的而誕生的新語言中,能夠順利取代“前浪”的語言屈指可數。有的乘著新技術的東風在某一新興領域成為了行業標桿。有的在與“前浪”的和諧共生中猥瑣發育,靜待日后的逆襲。當然,更多的是消逝在了歷史的長河里,甚至沒有泛起一絲漣漪……究其原因,如今仍然流行的語言諸如 C/C++、Java、Python、JavaScript 等等,雖然它們大多數誕生于上個世紀,但它們一直以來也都在針對新時代的需求不斷地優化,經歷了數十個甚至上百個版本的更迭,很多語言已經與誕生之初完全不一樣了。再加上它們數十年來積累的函數庫、IDE 、編譯器、應用生態等自成一脈的豐富體系,讓“后浪”們難以望其項背。
從商業的角度來說,在行業格局沒有發生顛覆性變革的時候,現有的熱門語言依靠多年積累的龐大用戶基礎,就足以形成壟斷。就算有更好的新語言出現,它們也可以迅速吸收這些新語言的優良特性,就像大企業兼并小企業,或者直接照搬它們優秀的業務功能一樣,讓自己變得更好,也更容易被大部分開發者接受。所以要想在編程語言界把“前浪”們拍在沙灘上,“后浪”們要走的路還有很長很長。
最后,千言萬語匯成一道填空題:
______ 是世界上最好的語言![手動狗頭]