編程語言70年:誰是世界上最好的編程語言?

導語 | 客戶端開發想要在多種生態中生存,必須熟練使用各種平臺的環境和語言。許多開發者的職業生涯,涉及多個平臺生態以及對應的原生編程語言。本文作者李楊不拘泥於某個語言或者特性,從語言的發展和歷史的角度聊聊編程語言的發展。各個編程語言之前有何關聯?編程語言界誰能笑到最後?歡迎閱讀本文並進行探討。

目錄

1 編程語言發展史縱覽

2 編程語言未來二十年發展趨勢

3 長期展望:二十年後的發展趨勢是什麼?

01、編程語言發展史縱覽

嚴謹起見,本文提到的編程語言指的是「第三代高級編程語言」。

首先,我們從時間維度入手聊聊編程語言。一圖勝千言,我們從目前主流的編程語言中,挑選出流行的、具有歷史影響力的語言。把它們按時間從上往下排序,依據類型和指導思想進行聚類,根據互相的影響使用線條指向。在補充了一些關鍵性的特徵和評價之後,我整理出下圖:

整理圖的過程中,我發現很多有趣的點。讓我們按時間順序從上往下講這張圖。

1950-1959這期間出現了第三代高級語言的鼻祖:Fortran 和 Lisp。並且在 1958 年已經提出了結構化編程、遞歸、異常、函數式、命令式、垃圾回收等目前常用的概念。現在用到的大部分語言特性的理論的出現比我們想象的早。

1960-1969:這一階段,IBM 的 ALGO 系列語言主要是對理論概念的探索和實踐,經過兩個版本後誕生出 ALGO60 里程碑式的作品。這奠定了現代高級編程語言的基礎。同時這期間也有 Basic 語言降了低編程門檻,並第一次引入了「類型後置」的語法以更符合人類閱讀習慣。

我們繼續往右看,發現一個獨特的系列:CPL 和 BCPL。這兩個語言首次闡釋了「特性不是越多越好」的黃金原則。因爲拉長時間看,CPL 是第一個想成爲大而全的語言。從 CPL 到 BCPL 到 C,都是在不斷的減少特性;從 C 到 C++再到 C++20,特性又在不斷增加。這時你就會明白爲什麼 C++語言會對添加新特性是那麼謹慎和小心,但是還是阻擋不了讓 C++ 變成下一個 CPL 的步伐。

1967 年誕生的 Simula64 提出了面向對象思想。面向對象思想開始發展。

1970-1979這一年誕生出兩個影響力極大的語言:Smalltalk 和 C。巧合的是這兩個語言都是在 1972 年發佈的。Smalltalk 一定程度上繼承了 Basic 遠離機器、靠近人類的探索方式,發揚了語言動態性的思想,探索了面向對象的思想,模糊了編譯型語言和解釋型語言的界限,對後續的動態語言、腳本語言、客戶端語言產生了深遠的影響。

C 語言的誕生是爲了滿足 Unix 。當時 Unix 使用 BCPL 或 B 語言都無法滿足操作系統對編程語言的要求,因此 C 語言應運而生。拋開語言特性,我們也能發現 C 語言的優勢有非常多:不但有需求(開發操作系統的動機),還有經驗的加成(嘗試了 BCPL 和 B 語言,積累了大量的應用經驗),並且遇到了好項目(Unix 操作系統),被最聰明的一羣人使用(Unix 操作系統開發工程師)。這些註定了 C 語言具有強大的生命力。這期間編程語言的思想已經成熟,在面向對象思想在 Smalltalk 的推動下,C 語言成爲下一階段新語言的首捧。

1980-1989:面向對象在 GUI 領域具有獨特的優勢。藉着這十年圖形界面交互高速發展的東風,面向對象思想發展進入快車道。近十年是「面向對象思想」橫行的十年。還記得上個十年的 Smalltalk 和 C 嗎?Smalltalk+面向對象誕生了 Self,C 語言+面向對象誕生了 C++,而 Smalltalk+C 語言+面向對象誕生了 Objective-C。蘋果公司選擇 Objective-C 作爲其生態原生語言,使得我們在 2022 年還在寫 Objective-C 的代碼;C++和 Objective-C 對 C 語言的 100%兼容,使得這兩個語言可以充分繼承 C 語言的生態和運用它的人才。但是 Objective-C 的語法實在太彆扭了,Objective-C 的關鍵字數量衆多,並且語法沒有一致性可言,在沒有 IDE 補全環境下可以被稱得上是最難寫的語言。

C++保留了 C 語言的語法習慣和設計原則。從 C 切換到 C++幾乎沒有學習成本,並複用了 C 的生態,這使得 C++迅速流行起來。面向對象的思想在當時來看是實用且先進的。但是現在我們發現:基於面向對象思想發展出來的各種設計模式,漸漸地把代碼玩出花來了。需要學習設計模式的就那幾個架構師,但是現在人手一本設計模式。「把大象放到冰箱裏」如此簡單事情都要先寫一堆的抽象。看代碼把人繞暈...... 當然,這是面向對象思潮的後話了。這也導致後來很多人投向簡單直接的 C 了(做了這麼多項目下來,發現面向對象很多時候是過度設計的源泉)。

1990-1999:這是編程語言發展最快速的時代。這得益於計算機平民化和圖形界面的發展,計算機進入千家萬戶、應用開發的需求激增。

編程語言的訴求開始發生變化:對性能要求變弱,而對安全(內存安全,線程安全)、人性化(可讀性,表達力,低門檻)、動態性等提出更高要求。首先登場的是 VisualBasic。它強化了 IDE 和編程語言的結合,降低了應用開發門檻。

接下來,到目前仍非常火的 Python 誕生了。Python 誕生在關鍵字和語法越來越複雜的年代。於是反其道而行之,追求簡潔的語法。最具有標誌性的是爲了省略“{}”直接用「空格縮進」來劃分代碼塊(這種語法首創是 1966 年的ISWIM語言)。

有趣的是,Python 追求的簡潔語法,不是其成功的關鍵(由於 IDE 的進步,這種語法的形式核心價值已經消失),Python 成功的關鍵在於其出色的擴展性和跨平臺。這讓 Python 長期穩坐解釋型語言頭把交椅,並且後來的同類語言都很難超越。另一方面,Python 提出的「一件事最好是隻有一種方法來做」的理念,貫穿語言設計,也成就了其優秀的學習曲線和低門檻的優點。所以一門語言能讓人快速上手也是其核心競爭力。


時間來到 1995 年,這一年誕生了四個我們耳熟能詳的編程語言:JavaScript;Java;PHP;Ruby。說編程語言發展最快速的時代是這個時代,不爲過。Java 對 C++ 做減法、增加了安全性,成爲歷史上最成功的語言之一。嵌入式、客戶端、後臺都有 Java 的身影。但是這種成功不會持續太久。因爲Java 涉及領域太多了,語言特性博而不精。這注定了 Java 在 20 年後的沒落。但是話又說回來,能在主流編程語言連續 10 多年榜上有名, Java 已經完成了的歷史使命。

JavaScript 逐漸發展爲瀏覽器上的原生語言。乘着 Web1.0、2.0 的東風,依仗和低門檻的學習成本,以及解釋型引擎的快速發展,JavaScript 已經突破瀏覽器領域的限制,幾乎無所不能。前端開發者們拿着 JavaScript 一次又一次的向客戶端和後臺陣地發起衝鋒。ReactNative、Node.js 等技術炙手可熱。

隨着硬件和腳本引擎的進步,就連曾經全用 C++編寫的 QQ 客戶端,現在也投入 Electron 的懷抱了。但是我們從現在的角度看,JavaScript 的不少地方已經落後於時代,我們急需一門新的語言或者革命來拋棄它

2000-2010:這是 PC 互聯網的高峯和移動互聯網的萌芽的時代,也是我們記憶深刻的時代。C# 在 2000 年首發,微軟基於 C++和 VB 的經驗,借鑑 Java 推出了濃墨重彩的 C#。我們站在歷史的高度可以說.Net 是失敗的框架,但是這都難以掩蓋 C#的光輝。C# 和 Java 同樣是對 C++做減法,但是在很多細節上 C# 相對 Java 更接近 C++。由於 C# 搭上了不爭氣的搭檔.Net,不像 Java 那樣一開始就那麼成功。塞翁失馬,反而讓 C# 的歷史包袱非常輕。

C# 在接下來的編程語言發展中多次成爲第一個喫螃蟹的人。C#給現代語言帶來了非常多理念和思想,從 C#1.0 到 C#11,幾乎一年一個版本。這發展速度其他編程語言只能望其項背。第一次接觸可空類型(空安全)、??運算符、dynamic 類型都是在 C#。筆者從事 windows 開發近十年,從學術角度來看對 C# 的喜愛溢於言表。但是從工程角度來看,.Net 和 C# 支持跨平臺。它倆動作總是慢半拍,錯過了 PC 互聯網和移動互聯網的機會,只在 Windows 平臺流行了。

個人認爲,C++作爲通用語言真的太成功了。但是它已經不是一門高安全性高人性化的一門語言,開發出更友好的安全的「C++」變得迫切起來。這時出現了很多新的語言蠢蠢欲試,其中包括 D 語言和 Rust:D 語言是 C++編譯器作者設計實踐的一門新語言,它吸收了很實際項目的 C++經驗教訓。但是仔細瞭解 D 語言你會發現,這就是拿 C++編譯器魔改的一個「私有 C++語言」編譯器。這也導致很多 C++的弊病不能徹底廢除,屬於改良派。

過了 3 年,Rust 橫空出世。Rust 在理念上有很大的進步,比如雖然沒有垃圾回收器。但是強制使用者明確對象的所有權,通過所有權編譯器可以在合適的時機釋放內存。這是流行語言第一次不使用垃圾回收方式解決內存管理問題,在性能上比垃圾回收有着極大的優勢。雖然性能無損,但是相比垃圾回收模式更需要開發者編碼時增加對象所有權的思考過程。即便如此,這也比在 C++花幾個星期解決內存訪問異常的問題好的多。Rust 屬於改革派。重新審視 C++的應用場景,對語言特性重新設計,這真的是一次精彩的嘗試。個人認爲,Rust 也比 D 語言更加成功。

到了 2007 年,對後臺影響深遠的 Go 語言誕生。當時大部分後臺開發者還是用 C++或者 Java。我們前面說了 Java 註定會被替代,Go 首先在後臺開發嘗試吹響號角。後面還會提到 Kotlin 在客戶端嘗試替代 Java。

Go 的誕生是一個非常好的時間節點。除了剔除很多 Java 的弊病,還直擊應用場景的痛點,在性能(多核,網絡,併發)上着重發力,前進了一大步!

另外,Go 在工程上的成功,展示其了語法特性上的新嘗試:Go 語言是近代第一個撿起類型後置的語言,提供了豐富的語法糖(如:=)使得代碼簡短並語義明確,這直接影響了後面的 Swift,Rust、Kotlin 等有着改革雄心的語言。Go 的成功除了 Go 的優秀因素外,我們也發現:瞄準細分應用場景的語言,在工程上是非常具有活力的。

2011-2020:這是移動互聯網的快速發展時代,最需要的是提高移動端高生產力語言。首先登場的是 Android 平臺的 Kotlin。Kotlin 是 JVM 語言,能直接複用 JVM 的生態。Kotlin 和 Java 有點像當年的 Objective-C 和 C,但是不像 Objective-C 和 C 能混編。Kotlin 重新設計了語法規則,大大提高了可讀性和安全性。3 年後蘋果公司也交出 Swift 的答卷。Swift 被簡單的形容爲 「沒有 C 的 Objective-C」。Objective-C 花了 30 年,終於摒棄了 C 語言的影響。

新的語言不能沒有成熟生態的支持。和 Kotlin 與 Java 同是 JVM 語言不同,Swift 使用橋接(Bridging)的方法,得以複用 Objective-C 的生態。這未嘗不是一次創新的嘗試,可以讓 Swift 沒有任何包袱而重新設計。Kotlin 和 Swift 都選擇了更適合於閱讀的類型後置——更簡潔的語法,更豐富的語法提高可讀性和語義準確性。對於現有的大型項目的開發人員來說,從 Java 到 Kotlin ,或者從 Objective-C 到 Swift 有點難以適應。開個玩笑,我們被 C 風格語言「荼毒」了這麼久,突然不荼毒了會很不習慣。

在這個時期誕生的 Dart 旨意成爲 Javascript 的接班人。但是其關注度不多。隨着 Flutter 的火熱,Dart 也進入了大衆的視野。Dart 與 Kotlin、Swift 徹底斷舍離 C 風格,Dart 仍然選擇 C 語言風格。在筆者看來,現在大部分項目都會由多種語言編寫,保持和 C 語言風格在多語言項目中也許是一件好事。前段時間筆者經常在 iOS、Android、PC、Mac 四個平臺編寫代碼,涉及語言不限於 Java、Kotlin、Objective-C、Swift、C/C++、Dart。語言風格一天切換好幾次,這反而非常不人性化。

Dart 沒有很好地成爲 JavaScript 的接班人,誰能想到下一年的 TypeScript 火起來了?TypeScript 選擇和 Dart 不同的方法接班——相比 Dart 激烈的方式,TypeScript 完全兼容 JavaScript。TypeScript 還增加一些語法讓編譯器把錯誤提前暴露,大大增強了 JavaScript 的安全性,給 JavaScript 狠狠的續了一命,讓 JavaScript 可以繼續「荼毒」程序員們。話說回來,Dart 在安全性、性能方面都給 JavaScript 帶來了巨大的進步,也祝福 Dart 最終能順利接班。

2021-今:雖然新語言在誕生,但我們也不能忽視每個編程語言都在不斷的發展和變化。在 2022 年穀歌推出的 Carbon,旨在修復 C++的幾個明顯缺點,提高 C++的可讀性、安全性,並平滑語言的學習曲線。Carbon 和 D 語言有點相似,屬於對 C++現代化的改良派,但是和 D 語言不同的是:Carbon 有個好父親,並且通過「雙向互操作性」融入 C++生態,也拋棄 了C++的歷史包袱,並使得語言的語法可以重新設計。

從 Java 被逐漸替代的經驗教訓中我們發現,目前 C++在應用層正處於城池漸失的狀態。我們應該明白:應用層和底層框架的需求不同,不應該從頂到底都使用一套語言。現在 C++ 所失之城池就是新語言非常好的機會。抓住應用層的安全、人性化、和與 C++ 的雙向互操作性,Carbon 確實是準確找到了定位。簡而言之,谷歌的 Carbon 還是備受期待的。

除了在應用層 C++ 有待進步,在底層場景上的C++也有很大的進步空間。2022 年,Herb Sutter 的實驗項目 CppFront 值得一提。簡單來說,CppFront 通過給 C++增加一層預處理語法規則(cpp2) 來提高 C++的易用性和安全性。和 Rust、Carbon 不同,Herb Sutter 的這個實驗項目不是尋找 C++的代替者,而是 「尋找突破界限的方法」,使 C++ 本身向前發展,並加倍努力使用 C++,而不是切換到其他東西。這是個爲 C++標準探路的實驗項目,有豐富的理論和實驗,下一代 C++標準必然能煥發出新的活力。但是也別太奢望 C++能回到從前那樣樣能手的輝煌,歷史的經驗告訴我們大而全的語言最後都會被替代。

我們從時間維度簡單的從上往下捋了一遍,不難看出:主流通用編程語言主要受 2 個成熟語言(Smalltack 和 C 語言,且都誕生於 1972 年)的影響。有的語言被某個影響深一些,有的兩者都汲取;接着主要往更安全、人性化、跨平臺這三個方向進行發展,而在性能,語法,重用生態、擴展性,IDE 友好等多維度各有發展、取捨、借鑑。

同時我們也發現:編譯型和解釋型語言邊界逐漸模糊,語法流行交替更迭,語法語義更加明確,語言的目標領域更加細化。別看近十幾年新語言出了那麼多,語法花裏胡哨,其實很多語言同質化嚴重。類型後置也是早就玩過的,每個時代流行不同罷了。前面我們順着時間簡單過了一遍圖中的部分語言,這張大圖可以幫助各位梳理思路。

02、編程語言未來二十年發展趨勢

編程語言的發展離不開計算機領域其他技術的發展。編程語言發展至今,特性的互相借鑑的情況越來越普遍,語言生態互通也更常見(如直接兼容,或者 Bridging 技術),編譯型和解釋型界限也越來越模糊(比如 Dart 既能編譯運行也能解釋運行,還能邊解釋運行邊編譯),語言之間的性能差異也越來越小(V8 引擎,JIT,硬件性能提高),語言之間的互相轉換也開始普遍(Kotlin to Java to JavaScript,Dart to Javascript)。甚至,在 AI 的加持下,準確的把具有垃圾回收語言(如 Kotlin)往沒有垃圾回收語言(如 C)的轉換,也變得可能。

如果使用 AI 做預處理,靜態檢查和類型安全的語言沒有了優勢。如果使用 AI 輔助編程,我們甚至發現我們不是在寫代碼,而是在跟 AI 聊天(如最近很火的 chatGPT)!這時你還會糾結 AI 在使用什麼編程語言嗎?高級編程語言發展的黃金時代即將落幕。我們很難再看到像垃圾回收、空安全、異步等讓我們興奮不已的新語言特性了。當然,編程語言還是會繼續往更安全、人性化(可讀性、可寫性)、跨平臺這三個方向進行發展。

但是 AI 輔助編程的出現讓編程語言的使用者發生了一些變化,編程語言將同時被人類和 AI 共同使用——基於這個方向,編程語言的可讀性(精簡、語義準確)和跨平臺會更加重要。

[圖片上傳失敗...(image-80d5bf-1678195469014)]

使用Copilot從js轉換爲python

03、長期展望:二十年後的發展趨勢是什麼?

探討這個問題,我們要回到編程語言的初心:什麼是編程語言?編程語言是被標準化的、用來向計算機發出指令、讓程序員利用計算機能力的工具。

簡而言之,編程語言只是我們利用計算機能力的工具。小白用戶能理解按鈕、圖片、短視頻,計算機能理解彙編指令。這時需要一羣聰明的人把用戶需求轉換爲機器代碼,這羣人用編程語言讓這項工作變得簡單。

二十年後我們還需要一羣人專門設計交互、視覺、框架、代碼來架起小白用戶使用計算機的橋樑嗎?也許到那時的人們也許分不清 AI 和計算機的區別了,到那時利用計算機的能力也許就像我們現在跟同事說話交流一樣簡單。

也許你會覺得 AI 也需要編程語言去實現,以方便後續的維護和迭代。但是也許那時 AI 已經具備自己維護代碼的能力了,也許人類已經看不懂什麼是 C++、Python,只有 AI 懂了,甚至 AI 自己發明新的編程語言編寫了下一代的 AI(AI 可能已經覺得可讀性是個包袱了,直接寫機器代碼不是更爽?)。就如第一個 C 語言編譯器是用匯編寫的,後面 C 語言編譯器是用 C 語言寫的一樣。我們前面討論的大部分的編程語言註定回到了歷史的垃圾桶裏。本來無一物,何處惹塵埃。

筆者認爲,編程語言也許將在歷史的發展中失去了作用和價值,成爲未來博物館中一個陳列的展品,向世人展示人類過去經歷的苦難。

以上便是作者從業多年的感想全部內容。當然,這只是筆者的一己之見。編程語言孰是孰非?想必見仁見智、言人人殊。那在你心目中,誰是世界上最好的編程語言呢?你最看好哪個語言?歡迎各位開發者在評論區交流分享。

-End-

原創作者|李楊

技術責編|李楊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章