html大空格(html中空格怎么打)
關(guān)注
“腳本之家
”,與百萬開發(fā)者在一起
出處:騰訊技術(shù)工程(ID: Tencent_TEG)
作者:kevinyangli,騰訊 CSIG 客戶端開發(fā)工程師
如若轉(zhuǎn)載請聯(lián)系原公眾號
客戶端開發(fā)在多種生態(tài)中生存就要熟練使用各種平臺的環(huán)境和語言?;仡欁约旱穆殬I(yè)生涯,涉及多個平臺生態(tài)以及對應(yīng)的原生編程語言。最近又用起了 Dart,經(jīng)常在寫代碼的時候要想想自己是在什么平臺,用什么 IDE,在寫什么語言。這種情況持續(xù)了一段時間之后對編程語言有了一些想法和探索的欲望,本文不拘泥于某個語言或者特性,而是從語言的發(fā)展和歷史的角度聊聊這個話題。
客戶端開發(fā)在多種生態(tài)中生存就要熟練使用各種平臺的環(huán)境和語言。回顧自己的職業(yè)生涯,涉及多個平臺生態(tài)以及對應(yīng)的原生編程語言。最近又用起了 Dart,經(jīng)常在寫代碼的時候要想想自己是在什么平臺,用什么 IDE,在寫什么語言。這種情況持續(xù)了一段時間之后對編程語言有了一些想法和探索的欲望,本文不拘泥于某個語言或者特性,而是從語言的發(fā)展和歷史的角度聊聊這個話題。
嚴謹起見,本文提到的“編程語言”指的是“ 第三代高級編程語言”。
讓我們從 時間維度入手來聊聊編程語言。一圖勝千言。我們從目前主流的編程語言中, 挑選出流行的,具有歷史影響力的,按時間從上往下排序,依據(jù)類型和指導(dǎo)思想進行聚類,根據(jù)互相的影響使用線條指向,并補充了一些關(guān)鍵性的特征和評價,整理下圖:
展開全文
整理圖的過程中,發(fā)現(xiàn)很多有趣的點,我們按時間順序從上往下講這張圖。
1950-1959:這期間出現(xiàn)了第三代高級語言的鼻祖:Fortran 和 Lisp。并且 在 1958 年已經(jīng)提出了結(jié)構(gòu)化編程,遞歸、異常、函數(shù)式、命令式、垃圾回收等目前常用的概念?,F(xiàn)在用到的大部分語言特性的理論的出現(xiàn)比我想象的早。
1960-1969:這一階段,IBM 的 ALGO 系列語言主要是對理論概念的探索和實踐,經(jīng)過兩個版本后誕生出 ALGO60 里程碑式的作品 ,奠定了現(xiàn)代高級編程語言的基礎(chǔ)。同時也有 Basic 語言希望降低編程門檻的探索,并 第一次引入了“類型后置”的語法以更符合人類閱讀習(xí)慣。
我們繼續(xù)往右看,發(fā)現(xiàn)一個獨特的系列:CPL 和 BCPL:這兩個語言首次闡釋了“ 特性不是越多越好”的黃金原則,因為拉長時間看,CPL 是第一個想成為大而全的語言。從 CPL 到 BCPL 到 C,都是在不斷的減少特性;從 C 到 C++再到 C++20,特性又在不斷的增加,這時你就會明白為什么 C++委員會對添加新特性是那么的謹慎和小心,但是這都阻擋不了讓 C++變成下一個 CPL 的步伐。1967 年誕生的 Simula64 提出了面向?qū)ο笏枷耄?面向?qū)ο笏枷腴_始發(fā)展。
1970-1979:這一年誕生出兩個影響力極大的語言: Smalltalk 和 C。巧合的是這兩個語言都是在 1972 年發(fā)布的。Smalltalk 一定程度上繼承了 Basic 遠離機器靠近人類的探索,發(fā)揚了 語言動態(tài)性的思想,探索了面向?qū)ο蟮乃枷耄:司幾g型語言和解釋型語言的界限,對后續(xù)的動態(tài)語言,腳本語言,客戶端語言產(chǎn)生了深遠的影響。
C 語言的誕生是為了滿足 Unix 而設(shè)計的,當(dāng)時 Unix 使用 BCPL 或 B 語言都無法滿足操作系統(tǒng)對編程語言的要求,因此 C 語言應(yīng)運而生。拋開語言特性,我們也能發(fā)現(xiàn) C 語言的優(yōu)勢有非常多:不但有需求(開發(fā)操作系統(tǒng)的動機),還有經(jīng)驗的加成(嘗試了 BCPL 和 B 語言,積累了大量的應(yīng)用經(jīng)驗),并且遇到了好項目(Unix 操作系統(tǒng)),被最聰明的一群人使用(Unix 操作系統(tǒng)開發(fā)工程師),注定了 C 語言具有強大的生命力。 這期間編程語言的思想已經(jīng)成熟,面向?qū)ο笏枷朐?Smalltalk 的推動下,成為下一階段新語言首捧的特性。
1980-1989:由于面向?qū)ο笤?GUI 領(lǐng)域具有獨特的優(yōu)勢,借著這十年圖形界面交互的高速發(fā)展的東風(fēng), 面向?qū)ο笏枷氚l(fā)展進入快車道。這十年是面向?qū)ο笏枷霗M行的十年。還記得上個十年的 Smalltalk 和 C 嗎?Smalltalk+面向?qū)ο笳Q生了 Self;C 語言+面向?qū)ο笳Q生了 C++;而 Smalltalk+C 語言+面向?qū)ο笳Q生了 Objective-C。蘋果公司選擇 Objective-C 作為其生態(tài)原生語言,使得我們在 2022 年還在寫 Objective-C 的代碼;C++和 Objective-C 對 C 語言的 100%兼容,使得這兩個語言可以充分繼承 C 語言的生態(tài)和人才,但是 Objective-C 的語法實在太別扭了,Objective-C 的關(guān)鍵字數(shù)量眾多,并且語法沒有一致性可言,在沒有 IDE 補全環(huán)境下是最難寫的語言。
C++保留了 C 語言的語法習(xí)慣和設(shè)計原則,從 C 切換到 C++幾乎沒有學(xué)習(xí)成本,并復(fù)用了 C 的生態(tài),這使得 C++迅速流行起來。面向?qū)ο蟮乃枷朐诋?dāng)時來看是實用且先進的,但是現(xiàn)在我們發(fā)現(xiàn)基于面向?qū)ο笏枷牒竺姘l(fā)展的各種設(shè)計模式開始把代碼玩出花來了,需要學(xué)習(xí)設(shè)計模式的就那幾個架構(gòu)師,但是現(xiàn)在人手一本設(shè)計模式,把大象放到冰箱里這么簡單事情都要先寫一堆的抽象,把看代碼把人繞暈...... 當(dāng)然,這是面向?qū)ο笏汲钡暮笤捔恕_@也導(dǎo)致后來很多人投向簡單直接的 C 了(做了這么多項目下來,發(fā)現(xiàn)面向?qū)ο蠛芏鄷r候是過度設(shè)計的源泉)。
1990-1999:這是編程語言發(fā)展最快速的時代,得益于計算機平民化和圖形界面的發(fā)展,計算機進入千家萬戶,應(yīng)用開發(fā)的需求激增,編程語言的訴求開始發(fā)生變化: 對性能要求變?nèi)?,而對安全(?nèi)存安全,線程安全),人性化(可讀性,表達力,低門檻),動態(tài)性等提出更高要求。首先登場的是 VisualBasic,強化了 IDE 和編程語言的結(jié)合,降低了應(yīng)用開發(fā)門檻。
接下來目前非常火的 Python 也誕生了,Python 誕生在關(guān)鍵字和語法越來越復(fù)雜的年代,于是反其道而行之,追求簡潔的語法,最具有標(biāo)志性的是為了省略“{}”直接用空格縮進來劃分代碼塊(這種語法首創(chuàng)是 1966 年的 ISWIM語言);有趣的是,Python 追求的簡潔語法不是其成功的關(guān)鍵(由于 IDE 的進步,這種語法的形式核心價值已經(jīng)消失), Python 成功的關(guān)鍵在于其出色的擴展性和跨平臺,這讓 Python 長期穩(wěn)解釋型語言頭把交椅,并且后來的同類語言都很難超越;另一方面,Python 提出的“ 一件事最好是只有一種方法來做”理念貫穿語言設(shè)計(筆者也非常認同的觀念)也成就了其優(yōu)秀的學(xué)習(xí)曲線和低門檻的優(yōu)點,一門語言能讓人快速上手也是其核心競爭力呀。
時間來到 1995 年,這一年誕生了四個我們耳熟能詳?shù)木幊陶Z言(Java;Java;PHP;Ruby),我們把編程語言發(fā)展最快速的時代頒發(fā)給這個時代絕對不為過。Java 對 C++做減法,增加了安全性,成為歷史上最成功的語言之一,嵌入式、客戶端、后臺都有 Java 的身影。但是這種成功不會持續(xù)太久, Java 涉及領(lǐng)域太多了,語言特性博而不精,這注定了 Java 在 20 年后的沒落,話又說回來,能在主流編程語言連續(xù) 10 多年榜上有名,已經(jīng)完成了 Java 的歷史使命。
Java 逐漸發(fā)展為瀏覽器上的原生語言,乘著 Web1.0、2.0 的東風(fēng),和低門檻的學(xué)習(xí)成本,以及解釋型引擎的發(fā)展,Java 已經(jīng)突破瀏覽器領(lǐng)域的限制,幾乎無所不能,前端開發(fā)者們拿著 Java 一次又一次的向客戶端和后臺陣地發(fā)起沖鋒,ReactNative、Node.js 等技術(shù)炙手可熱;隨著硬件和腳本引擎的進步,就連曾經(jīng)全用 C++編寫的 QQ 客戶端,現(xiàn)在也投入 Electron 的懷抱了;但是我們從現(xiàn)在的角度看,Java 的不少地方已經(jīng)落后于時代,我們急需一門新的語言或者革命來代替它。
2000-2010:這是 PC 互聯(lián)網(wǎng)的高峰和移動互聯(lián)網(wǎng)的萌芽的時代,也是我們記憶深刻的時代。C#在 2000 年首發(fā),微軟基于 C++和 VB 的經(jīng)驗,借鑒 Java 推出了濃墨重彩的 C#,我們站在歷史的高度可以說.Net 是失敗的框架,但是這都難以掩蓋 C#的光輝;C#和 Java 同樣是對 C++做減法,但是在很多細節(jié)上 C#相對 Java 更接近 C++;由于 C#搭上了不爭氣的搭檔.Net,不像 Java 那樣一開始就那么成功,塞翁失馬,反而讓 C#的歷史包袱非常輕。
C#在接下來的編程語言發(fā)展中多次成為第一個吃螃蟹的人,C#給現(xiàn)代語言帶來了非常多理念和思想,從 C#1.0 到 C#11,幾乎一年一個版本,這發(fā)展速度其他編程語言只能望其項背。第一次接觸可空類型(空安全),??運算符,dynamic 類型都是在 C#,筆者從事 windows 開發(fā)近十年,從學(xué)術(shù)角度來看,筆者對 C#的喜愛溢于言表。但是從工程角度來看,.Net 和 C#支持跨平臺,但是他倆動作總是慢半拍,錯過了 PC 互聯(lián)網(wǎng)和移動互聯(lián)網(wǎng)的機會,只在 Windows 平臺流行了。
C++作為通用語言真的太成功了,但是它已經(jīng)不是一門高安全性高人性化的一門語言,開發(fā)出更友好的安全的"C++"變得迫切起來,這時出現(xiàn)了很多新的語言蠢蠢欲試,其中包括 D 語言和 Rust:D 語言是 C++編譯器作者設(shè)計實踐的一門新語言,吸收了很實際項目的 C++經(jīng)驗教訓(xùn),但是仔細了解 D 語言你會發(fā)現(xiàn), 這就是拿 C++編譯器魔改的一個”私有 C++語言“編譯器; 這也導(dǎo)致很多 C++的弊病不能徹底廢除,屬于改良派。
過了 3 年,Rust 橫空出世:Rust 在理念上有很大的進步,比如雖然沒有垃圾回收器,但是強制使用者明確對象的所有權(quán),通過所有權(quán)編譯器可以在合適的時機釋放內(nèi)存: 這是第一次流行語言不使用垃圾回收方式解決內(nèi)存管理問題,在性能上比垃圾回收有著極大的優(yōu)勢,雖然性能無損,但是相比垃圾回收模式則需要開發(fā)者編碼時增加對象所有權(quán)的思考過程,即便如此,這也比在 C++花幾個星期解決內(nèi)存訪問異常的問題好多了呀。 Rust 屬于改革派,重新審視 C++的應(yīng)用場景,對語言特性重新設(shè)計,這真的是一次精彩的嘗試!Rust 也比 D 語言更加成功。
到了 2007 年,對后臺影響深遠的 Go 語言誕生,當(dāng)時大部分后臺還是用 C++或者 Java,我們前面說了 Java 注定會被替代,Go 首先在后臺開發(fā)常見吹響號角,后面還會提到 Kotlin 在客戶端嘗試替代 Java。Go 的誕生是一個非常好的時間節(jié)點,除了剔除很多 Java 的弊病,還直擊應(yīng)用場景的痛點,在性能(多核,網(wǎng)絡(luò),并發(fā))上著重發(fā)力,前進了一大步!
另外,Go 在工程上的成功容易掩蓋其了語法特性上的新嘗試: Go 語言是近代第一個撿起類型后置的語言,提供了豐富的語法糖(如:=)使得代碼簡短并語義明確,這直接影響了后面的 Swift,Rust、Kotlin 等有著改革雄心的語言。Go 的成功除了 Go 的優(yōu)秀因素外,我們也發(fā)現(xiàn): 瞄準細分應(yīng)用場景的語言在工程上是非常具有活力的。
2011-2020:移動互聯(lián)網(wǎng)的快速發(fā)展的時代,這個時代最需要的是提高移動端高生產(chǎn)力語言。首先登場的是 Android 平臺的 Kotlin,Kotlin 是 JVM 語言,能直接復(fù)用 JVM 的生態(tài),Kotlin 和 Java 有點像當(dāng)年的 Objective-C 和 C 的感覺,但是不像 Objective-C 和 C 能混編,Kotlin 重新設(shè)計了語法規(guī)則,大大提高了可讀性和安全性。3 年后蘋果公司也交出 Swift 的答卷,Swift 被簡單的形容為 “ 沒有 C 的 Objective-C”,Objective-C 花了 30 年,終于摒棄了 C 語言的影響。
新的語言不能沒有成熟生態(tài)的支持,和 Kotlin 與 Java 同是 JVM 語言不同,Swift 使用 橋接(Bridging)的方法得以復(fù)用 Objective-C 的生態(tài), 這未嘗不是一次創(chuàng)新的嘗試,可以讓 Swift 沒有任何包袱重新設(shè)計。Kotlin 和 Swift 都選擇了更適合于閱讀的類型后置,更簡潔的語法,更豐富的語法糖來提高可讀性和語義準確性。對于現(xiàn)有的大型項目的開發(fā)人員來說,從 Java 到 Kotlin 或者從 Objective-C 到 Swift 有點稍微難以適應(yīng),我們被 C 風(fēng)格語言荼毒了這么久,突然不荼毒了會很不習(xí)慣。
在這個時期誕生的 Dart 旨意成為 Java 的接班人,但是關(guān)注度不多,隨著 Flutter 的火熱,Dart 也進入了大眾的視野。Dart 與 Kotlin、Swift 徹底斷舍離 C 風(fēng)格不同, Dart 仍然選擇 C 語言風(fēng)格;在筆者看來,現(xiàn)在大部分項目都會由多種語言編寫, 保持和 C 語言風(fēng)格在多語言項目中也許是一件好事:前段時間筆者經(jīng)常在 iOS、Android、PC、Mac 四個平臺編寫代碼,涉及語言不限于 Java,Kotlin,Objective-C,Swift,C/C++,Dart,語言風(fēng)格一天切換好幾次,這反而非常不人性化。
Dart 沒有很好的成為 Java 的接班人,誰能想到下一年的 Type 火起來了? Type 選擇和 Dart 不同的方法接班,相比 Dart 激烈的方式,Type 完全兼容 Java,Type 增加一些語法讓編譯器把錯誤提前暴露,大大增強了 Java 的安全性,給 Java 狠狠的續(xù)了一命,讓 Java 可以繼續(xù)禍害程序員們。話說回來,Dart 在安全性、性能、都給 Java 帶來巨大的進步,也祝福 Dart 最終能順利接班。
2021-今:除了新語言的誕生,我們也不能忽視每個編程語言都在不斷的發(fā)展和變化,在 2022 年谷歌推出的 Carbon, 該語言旨在修復(fù) C++的幾個明顯缺點,提高 C++的可讀性、安全性,并平滑語言的學(xué)習(xí)曲線。Carbon 和 D 語言有點相似,屬于對 C++現(xiàn)代化的改良派,但是和 D 語言不同的是 Carbon 有個好爹, 并且通過“雙向互操作性”融入 C++生態(tài)的同時拋棄 C++歷史包袱,并使得語言的語法可以重新設(shè)計。
從 Java 被逐漸替代的經(jīng)驗教訓(xùn)中我們發(fā)現(xiàn),目前 C++在應(yīng)用層正處于城池漸失的狀態(tài);我們應(yīng)該明白,應(yīng)用層和底層框架的需求不同,不應(yīng)該從頂?shù)降锥际褂靡惶渍Z言,現(xiàn)在 C++所失之城池就是新語言非常好的機會, 抓住應(yīng)用層的安全、人性化、和與 C++的雙向互操作性,Carbon 確實是準確找到了定位。簡而言之,我對谷歌的 Carbon 還是非常期待的。
除了在應(yīng)用層 C++有待進步,即使在底層場景,C++也有很大的進步空間。2022 年,Herb Sutter 的實驗項目 CppFront 值得一提。簡單來說, CppFront 通過給 C++增加一層預(yù)處理語法規(guī)則(cpp2)來提高 C++的易用性和安全性。和 Rust、Carbon 不同,Herb Sutter 的這個實驗項目不是尋找 C++的代替者,而是 “ 尋找突破界限的方法,使 C++ 本身向前發(fā)展,并加倍努力使用 C++,而不是切換到其他東西”。這是個為 C++標(biāo)準探路的實驗項目,有這么豐富的理論和實驗,下一代 C++標(biāo)準必然能煥發(fā)出新的活力。但是也別太奢望 C++能回到從前那樣樣能手的輝煌,歷史的經(jīng)驗告訴我們大而全的語言最后都會被替代。
小結(jié)一下這 70 年總體的發(fā)展趨勢
前面我們從時間維度簡單的從上往下捋了一遍,不難看出,主流通用編程語言主要受 2 個成熟語言(Smalltack 和 C 語言,且都誕生于 1972 年)的影響,有的語言被某個影響深一些,有的兩者都汲??;接著主要 往更安全、人性化、跨平臺這三個方向進行發(fā)展,而在性能,語法,重用生態(tài)、擴展性,IDE 友好等多維度各有發(fā)展、取舍、借鑒。
同時我們也發(fā)現(xiàn) :編譯型和解釋型語言邊界逐漸模糊,語法流行交替更迭,語法語義更加明確,語言的目標(biāo)領(lǐng)域更加細化。別看近十幾年新語言出了那么多,語法花里胡哨,其實很多語言同質(zhì)化嚴重,類型后置也是早就玩過的,每個時代流行不同罷了。前面我們順著時間簡單過了一遍圖中的部分語言,圖中的信息遠不止我們這里討論的內(nèi)容,限于篇幅還請點開大圖品讀。
展望未來二十年發(fā)展趨勢
還是那句話, 編程語言的發(fā)展離不開計算機領(lǐng)域其他技術(shù)的發(fā)展。編程語言發(fā)展至今,特性的互相借鑒的情況越來越普遍,語言生態(tài)互通也更常見(如直接兼容,或者 Bridging 技術(shù)),編譯型和解釋型界限也越來越模糊(比如 Dart 既能編譯運行也能解釋運行,還能邊解釋運行邊編譯),語言之間的性能差異也越來越?。╒8 引擎,JIT,硬件性能提高),語言之間的互相轉(zhuǎn)換也開始普遍(Kotlin to Java to Java,Dart to Java),甚至在 AI 的加持下,準確的把具有垃圾回收語言(如 Kotlin)往沒有垃圾回收語言(如 C)的轉(zhuǎn)換也變得可能。
如果使用 AI 做預(yù)處理,靜態(tài)檢查和類型安全的語言沒有了優(yōu)勢;如果使用 AI 輔助編程,我們甚至發(fā)現(xiàn)我們不是在寫代碼,而是在跟 AI 聊天(如最近很火的 chatGPT)!這時你還會糾結(jié) AI 在使用什么編程語言嗎? 高級編程語言發(fā)展的黃金時代即將落幕,我們很難再看到像垃圾回收,空安全,異步等讓我們興奮不已的新語言特性了。當(dāng)然,編程語言還是會繼續(xù)往 更安全、人性化(可讀性、可寫性)、跨平臺這三個方向進行發(fā)展,但是 AI 輔助編程的出現(xiàn)讓編程語言的使用者發(fā)生了一些變化,編程語言將同時被人類和 AI 共同使用,基于這個方向,那么編程語言的 可讀性(精簡、語義準確)和 跨平臺會更加重要。
使用Copilot從js轉(zhuǎn)換為python
讓我們繼續(xù)展望,二十年后的發(fā)展趨勢是什么?
探討這個問題,我們要回到編程語言的初心: 什么是編程語言?
編程語言是被標(biāo)準化的,用來向計算機發(fā)出指令,讓程序員利用計算機能力的工具。
簡而言之, 編程語言只是我們利用計算機能力的工具,小白用戶能理解按鈕,圖片,短視頻;計算機能理解匯編指令,這時需要一群聰明的人把用戶需求轉(zhuǎn)換為機器代碼,這群人 用編程語言讓這項工作變得簡單;二十年后我們還需要一群人專門設(shè)計交互、視覺、框架、代碼來架起小白用戶使用計算機的橋梁嗎?到那時的人們也許分不清 AI 和計算機的區(qū)別了, 到那時利用計算機的能力也許就像我們現(xiàn)在跟同事說話交流一樣簡單。
也許你會覺得 AI 也需要編程語言去實現(xiàn),以方便后續(xù)的維護和迭代,但是也許那時 AI 已經(jīng)具備自己維護自己代碼的能力了,那時也許人類已經(jīng)看不懂什么是 C++、Python,只有 AI 懂了,甚至 AI 自己發(fā)明新的編程語言編寫了下一代的 AI(AI 可能已經(jīng)覺得可讀性是個包袱了,直接寫機器代碼不是更爽?)。就如第一個 C 語言編譯器是用匯編寫的,后面 C 語言編譯器是用 C 語言寫的一樣。我們前面討論的大部分的編程語言注定回到了歷史的垃圾桶里,本來無一物,何處惹塵埃。
編程語言將在歷史的發(fā)展中失去了作用和價值,成為未來博物館中一個陳列的展品,向世人展示人類過去經(jīng)歷的苦難。
END
程序員專屬衛(wèi)衣
商品直購鏈接
????
【???點擊查看更多詳情】
墻裂推薦!這才是專屬程序員們的T恤!
世界上最偉大最邪惡的軟件發(fā)明
2023需求最高的編程語言:Python、Java和Java
為拯救童年回憶,開發(fā)者決定采用古法編程:用Flash高清重制了一款游戲
為什么你的 Android 系統(tǒng)比 Windows 還大?
Office 2019/2021專業(yè)增強版,正版終身授權(quán)!
掃描二維碼推送至手機訪問。
版權(quán)聲明:本文由飛速云SEO網(wǎng)絡(luò)優(yōu)化推廣發(fā)布,如需轉(zhuǎn)載請注明出處。