新疆網(wǎng)站建設(shè)需要多少錢(為什么會(huì)有這么多編程語(yǔ)言)為什么會(huì)有這么多編程語(yǔ)言的人,
【編者按】本文主要探討為什么存在這么多的編程語(yǔ)言,以及新的編程語(yǔ)言為什么不斷地被創(chuàng)造出來(lái)作者從計(jì)算機(jī)歷史博物館的一幅展示編程語(yǔ)言演化的巨圖入手,分析了不同的編程語(yǔ)言是如何受到前人的影響,以及如何針對(duì)特定的任務(wù)或工作負(fù)載而設(shè)計(jì)的。
作者認(rèn)為,控制是創(chuàng)造新編程語(yǔ)言的最大主題,因?yàn)椴煌墓净蚪M織可能有不同的目標(biāo)或需求,而現(xiàn)有的編程語(yǔ)言可能難以滿足或改變?cè)逆溄樱篽ttps://cacm.acm.org/blogs/blog-cacm/262424-why-are-there-so-many-programming-languages/fulltext
未經(jīng)允許,禁止轉(zhuǎn)載!作者 | Doug Meil 譯者 | 楓葉聊齋責(zé)編 | 夏萌出品 | CSDN(ID:CSDNnews)在上世紀(jì) 90 年代,一位朋友問(wèn)我為何存在那多的編程語(yǔ)言他雖然對(duì)計(jì)算機(jī)有所了解,但并非專業(yè)開發(fā)者。
他不解地問(wèn):“為何沒(méi)有出現(xiàn)一個(gè)卓越的編程語(yǔ)言?” 我回答說(shuō),編程語(yǔ)言通常是針對(duì)特定的任務(wù)或工作負(fù)載而設(shè)計(jì)的,從這個(gè)意義上說(shuō),大多數(shù)語(yǔ)言在它們能夠?qū)崿F(xiàn)什么方面差別不大,而更多的是在于它們使什么變得容易最后一句話是我從別人那里聽(tīng)來(lái)的,我感覺(jué)很有道理,很貼切。
其實(shí)這個(gè)問(wèn)題我也沒(méi)想明白幾年前,我有幸參觀了加利福尼亞山景城的計(jì)算機(jī)歷史博物館這個(gè)博物館收藏豐富,其中一幅編程語(yǔ)言演變圖讓人印象深刻這幅圖非常讓人震撼,無(wú)論是用過(guò)任何語(yǔ)言寫過(guò) “Hello World” 的人都會(huì)情不自禁地走過(guò)去觀看,找找自己鐘愛(ài)的語(yǔ)言,我也沒(méi)能例外。
人們本能地用指尖追溯圖中的 "影響" 軌跡,深入了解這些語(yǔ)言的歷史發(fā)展和未來(lái)趨勢(shì),具體內(nèi)容取決于他們所關(guān)注語(yǔ)言的年代
圖片來(lái)源:計(jì)算機(jī)歷史博物館這張圖從遠(yuǎn)處看,就像在講述一段故事。
圖片來(lái)源:計(jì)算機(jī)歷史博物館圖表左側(cè)的標(biāo)題寫道:"這幅圖給我們展示了大概 150 種編程語(yǔ)言,它們只是無(wú)數(shù)編程語(yǔ)言中的一部分這些語(yǔ)言中有通用型的,也有專用型的新語(yǔ)言很少能夠完全擺脫舊語(yǔ)言的束縛,它們都受到了舊的語(yǔ)言的啟發(fā)或者借鑒,這些關(guān)系用箭頭標(biāo)注出來(lái)了。
"這意味著,這張復(fù)雜的圖表只是編程語(yǔ)言演變的一小部分罷了。圖表上的時(shí)間線是 1954 年到 2000 年。而此圖開始制作時(shí)已經(jīng)存在的編程語(yǔ)言,現(xiàn)在已經(jīng)更多了。軟件界似乎總有新的編程語(yǔ)言出現(xiàn)。
往事如煙我們現(xiàn)今在計(jì)算領(lǐng)域所視為理所當(dāng)然的事物,回望計(jì)算機(jī)的初期時(shí)代,都顯得不可思議早在那時(shí),存儲(chǔ)、內(nèi)存和處理能力都是昂貴且稀缺的資源為了能在計(jì)算機(jī)實(shí)驗(yàn)室使用計(jì)算機(jī),人們需要克服種種困難,無(wú)論環(huán)境多么艱苦。
然而,在那個(gè)時(shí)代,相對(duì)來(lái)說(shuō),編程語(yǔ)言的命名空間還是一片未開墾的土地,1950年代和1960年代初的編程語(yǔ)言可以直接以其功能進(jìn)行命名,比如 FORTRAN(Formula Translator,公式翻譯器)、COBOL(Common Business Oriented Language,通用商業(yè)的通用語(yǔ)言)、BASIC(Beginners All-purpose Symbolic Instruction Code,初學(xué)者通用符號(hào)指令代碼)、ALGOL(Algorithmic Language,算法語(yǔ)言)以及 LISP(List Processor,列表處理器)。
你可能沒(méi)聽(tīng)過(guò) SNOBOL(String Oriented and Symbolic Language, 面向字符串和符號(hào)編程語(yǔ)言,1962年)這個(gè)名稱,但通過(guò)名稱,你能夠輕易推測(cè)出這門語(yǔ)言是用來(lái)做什么的。
若在那個(gè)時(shí)期,面向?qū)ο蟮木幊谈拍畋桓鼮閺V泛地理解,我們可能會(huì)用一種叫做 "OBJOL" 的語(yǔ)言編程——這將是一個(gè)根據(jù)那個(gè)時(shí)代的命名模式直接命名的面向?qū)ο笳Z(yǔ)言我們必須贊賞 PL/I(1964年)的大膽之處,它試圖成為那個(gè) "唯一的優(yōu)秀編程語(yǔ)言"。
它的名字已經(jīng)表明了一切:編程語(yǔ)言1理論上不應(yīng)該存在 2、3 或 4雖然 PL/I 并未如其設(shè)計(jì)者期望的那樣成為計(jì)算機(jī)編程的"不朽之作",但它確實(shí)引出了軟件行業(yè)的一個(gè)核心問(wèn)題:早在 1960 年代初,人們就開始提出這個(gè)問(wèn)題:為什么有這么多種編程語(yǔ)言?。
此時(shí)此刻Scala(2003年)、Go(2009年)、Rust(2010年)、Kotlin(2011年)和 Swift(2014年)只是自 2000 年以來(lái)創(chuàng)造出的眾多編程語(yǔ)言的一部分今天的技術(shù)環(huán)境中,似乎已經(jīng)有適用于所有基礎(chǔ)語(yǔ)言特性組合的編程語(yǔ)言,包括:。
許可證:開源(各種類型的許可證)、商業(yè)平臺(tái):操作系統(tǒng)、硬件支持語(yǔ)言范式:過(guò)程式、函數(shù)式、面向?qū)ο蟮阮愋拖到y(tǒng):動(dòng)態(tài)、靜態(tài)等并發(fā)性:?jiǎn)尉€程、多線程內(nèi)存管理:自動(dòng)垃圾收集、手動(dòng)管理執(zhí)行方式:解釋執(zhí)行、編譯到虛擬機(jī)、本地編譯等
其他語(yǔ)言特性:內(nèi)置的數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)庫(kù)和網(wǎng)絡(luò)功能以及其他實(shí)用性能,構(gòu)成了一份龐大的候選列表似乎這些編程語(yǔ)言已經(jīng)足夠滿足在任何平臺(tái)上的任何低級(jí)、高級(jí)、函數(shù)式、過(guò)程式、對(duì)象、單線程、多線程、編譯或腳本需求。
那么,為什么新的編程語(yǔ)言仍在不斷地被創(chuàng)造出來(lái)?在我看來(lái),最大的原因是對(duì)控制權(quán)的追求。
掌控與命運(yùn)在二十世紀(jì)九十年代中葉,微軟的主要開發(fā)語(yǔ)言是 Visual Basic 和 Visual C++,它們都起源于較早的計(jì)算機(jī)語(yǔ)言Visual Basic 因其在構(gòu)建 Windows 桌面應(yīng)用的前端方面展示出的優(yōu)秀能力而受到青睞,但在諸如數(shù)據(jù)結(jié)構(gòu)和線程等高級(jí)語(yǔ)言特性方面卻顯得力不從心。
而 Visual C++ 則呈現(xiàn)出另一種情況——開發(fā)者可以通過(guò)它實(shí)現(xiàn)幾乎所有的功能,但這也意味著他們必須面對(duì) C++ 的高復(fù)雜性在那個(gè)時(shí)期,出現(xiàn)了一種位于兩者之間,折中的語(yǔ)言的機(jī)會(huì),接著在 1996 年,Java 應(yīng)運(yùn)而生。
作為一種全能的面向?qū)ο笳Z(yǔ)言,Java 既沒(méi)有 C++ 的過(guò)度復(fù)雜,又提供了豐富的功能性,這一特點(diǎn)令人矚目我至今記得在微軟的 Visual J++ 剛剛發(fā)布的時(shí)候,我也曾嘗試過(guò)使用它那時(shí)候,幾乎每個(gè)人都加入了這場(chǎng) Java 的盛宴。
Java 的主要設(shè)計(jì)理念之一就是跨平臺(tái)性不幸的是,這與當(dāng)時(shí)微軟主張的只在自家平臺(tái)運(yùn)行的策略產(chǎn)生了沖突,這也就引發(fā)了支持 Java 的 Sun Microsystems 公司與微軟之間從 1997 年開始的訴訟。
雙方的關(guān)系趨于緊張,最終導(dǎo)致微軟在 2002 年推出了另一種看似與 Java 極為相似,但實(shí)則非 Java 的語(yǔ)言:C#C# 成功地填補(bǔ)了 Visual Basic 和 Visual C++ 之間的空缺,并且是微軟可以完全掌控的一種語(yǔ)言,這與 Java 極為不同。
Java 的廣泛影響力實(shí)際上證明了它的重要性,這遠(yuǎn)遠(yuǎn)超過(guò)了與單一訴訟的關(guān)系2010 年,Oracle 以 Google 在 Android 移動(dòng)平臺(tái)上使用 Java 為由,對(duì) Google 提起訴訟,這是因?yàn)?Oracle 在收購(gòu)了 Sun Microsystems 后成為了 Java 語(yǔ)言的所有者。
這場(chǎng)法律糾紛持續(xù)了十年,最終在 2021 年進(jìn)入了美國(guó)最高法院的審理程序
全面設(shè)計(jì)控制系統(tǒng)維護(hù)與發(fā)展常常頗具挑戰(zhàn)性,我在 BLOG@CACM 的多篇帖子中討論過(guò)這個(gè)話題,例如《Log4j 和無(wú)感的高風(fēng)險(xiǎn)任務(wù):管理軟件組件升級(jí)》和《快速系統(tǒng)轉(zhuǎn)換的藝術(shù)》軟件增長(zhǎng)的悖論在于,系統(tǒng)接受度的增長(zhǎng)會(huì)帶來(lái)使用量的提升,從而可能帶來(lái)更大的成功,并進(jìn)一步吸引更多的使用者。
然而,隨著系統(tǒng)的采用和使用增加,可能會(huì)變得越來(lái)越難以進(jìn)行改變,特別是大規(guī)模的改變,因?yàn)檫@可能會(huì)破壞向后兼容性雖然這種情況并非無(wú)解,但的確非常困難管理編程語(yǔ)言的發(fā)展可能是最難的挑戰(zhàn)之一開發(fā)者是編程語(yǔ)言的用戶,他們不僅生產(chǎn)力高,而且經(jīng)常會(huì)以創(chuàng)新的方式使用語(yǔ)言特性,其中有些使用方式甚至可能超出了語(yǔ)言的初始設(shè)計(jì)預(yù)期。
如果存在特定的邊緣情況,尤其在大規(guī)模應(yīng)用場(chǎng)景下的開發(fā)者,終將會(huì)找出并利用這些情況Go 語(yǔ)言(2009 年發(fā)布)是一個(gè)典型的例子,其設(shè)計(jì)目標(biāo)旨在做出權(quán)衡:足夠強(qiáng)大,但又不過(guò)于復(fù)雜Go 語(yǔ)言的誕生部分源于 Google 對(duì)一種能在其容器化云環(huán)境中高效、可預(yù)測(cè)部署的語(yǔ)言的需求。
另外一個(gè)原因是希望有一種語(yǔ)言能夠在網(wǎng)絡(luò)和并發(fā)性方面有強(qiáng)大的能力,但在語(yǔ)言特性方面不要太繁雜,因?yàn)樵O(shè)計(jì)者們顯然對(duì) C++ 的復(fù)雜性感到反感Google 或許可以通過(guò)為它自身已經(jīng)在使用的語(yǔ)言構(gòu)建新的編譯器和運(yùn)行時(shí)引擎來(lái)滿足第一個(gè)需求。
盡管這并非易事,但 Google 有足夠的人才資源來(lái)實(shí)現(xiàn)這一目標(biāo)然而,改變開發(fā)者正在做的事情以及他們的開發(fā)方式需要對(duì)編程語(yǔ)言的語(yǔ)法和功能進(jìn)行調(diào)整,而這種改變往往相當(dāng)困難,尤其是當(dāng)開發(fā)者被告知某些事情不再被允許或必須以不同方式進(jìn)行時(shí)。
有時(shí)候,只要有足夠的資源(如 Google),針對(duì)手頭的用例創(chuàng)建新的東西,然后從零開始可能會(huì)更加容易于是,計(jì)算機(jī)歷史博物館的計(jì)算機(jī)語(yǔ)言墻面圖又增加了一個(gè)節(jié)點(diǎn)Go 語(yǔ)言的名稱實(shí)際上與 2003 年的一個(gè)完全不相關(guān)但更強(qiáng)調(diào)語(yǔ)法的語(yǔ)言 Go! (帶感嘆號(hào))有所沖突,這反映出語(yǔ)言命名空間的差異化正變得越來(lái)越難。
盡管存在這種沖突,Google 為何仍選擇這個(gè)名稱?這個(gè)問(wèn)題我不得而知,你可以自行探索致謝在此我要向計(jì)算機(jī)歷史博物館的 Dag Spicer 表達(dá)深深的感謝,他通過(guò)郵件向我提供了計(jì)算機(jī)編程語(yǔ)言發(fā)展圖的 PDF 文件。
十分感謝!參考資源計(jì)算機(jī)歷史博物館 - 鏈接:https://computerhistory.org/編程語(yǔ)言發(fā)展史 - 鏈接:https://en.wikipedia.org/wiki/Timeline_of_programming_languages
PL/I - 鏈接:https://en.wikipedia.org/wiki/PL/I《挑戰(zhàn)者》(電影)- "只能有一部" - 鏈接:https://en.wikipedia.org/wiki/Highlander_(film)
編程語(yǔ)言范式對(duì)比 - 鏈接:https://en.wikipedia.org/wiki/Comparison_of_multi-paradigm_programming_languagesSun/Microsoft Java 訴訟:
2002年的報(bào)道:鏈接:https://www.cnet.com/tech/tech-industry/sun-microsoft-settle-java-suit/2009年的報(bào)道:鏈接:https://www.cnet.com/tech/tech-industry/sun-settles-with-microsoft-announces-layoffs/
Visual J++ - 鏈接:https://en.wikipedia.org/wiki/Visual_J%2B%2BOracle/Google Java 訴訟 - 鏈接:https://www.bbc.com/news/technology-56639088
Go! (2003) - 鏈接:https://en.wikipedia.org/wiki/Go!_(programming_language)Go (2009) - 鏈接:https://en.wikipedia.org/wiki/Go_(programming_language)
BLOG@CACM 文章精選:Log4j 和無(wú)感的高風(fēng)險(xiǎn)任務(wù):管理軟件組件升級(jí)(鏈接:https://cacm.acm.org/blogs/blog-cacm/257897-log4j-and-the-thankless-high-risk-task-of-managing-software-component-upgrades/fulltext)
快速系統(tǒng)轉(zhuǎn)換的藝術(shù)(鏈接:https://cacm.acm.org/blogs/blog-cacm/252981-the-art-of-speedy-systems-conversions/fulltext)
你是否曾被編程語(yǔ)言的選擇困擾過(guò)?在你的開發(fā)經(jīng)歷中,你是否發(fā)現(xiàn)了某個(gè)編程語(yǔ)言在特定任務(wù)上的優(yōu)勢(shì)?讓我們一起在評(píng)論區(qū)分享你的見(jiàn)解吧!
推薦閱讀:?微信新增文章朗讀功能;超越 ChatGPT 記錄,Threads 上線 5 天用戶破億;在刪除數(shù)據(jù)前如何通知客戶|極客頭條?ChatGPT 最強(qiáng)代碼解釋器突破“封印”:30 秒出片、5 分鐘制作游戲、可視化分析...樣樣精通!
?都 2023 年了,OAuth 為什么還是讓人頭疼?