AI 前線導(dǎo)讀: 本文作者以自己作為程序員的角度出發(fā),繪制了一個(gè)主流編程語(yǔ)言的變遷圖,用以表示程序員在不同語(yǔ)言之間的切換路徑。也就是當(dāng)程序員開始使用編程語(yǔ)言 A,下一個(gè)最有可能切換過(guò)去的是哪一種編程語(yǔ)言。在這張變遷圖中,存在若干“終極節(jié)點(diǎn)”,這意味著程序員在這些節(jié)點(diǎn)上已經(jīng)找不到更好的可替代的編程語(yǔ)言了。那么,哪些編程語(yǔ)言才是最終贏家呢?
更多優(yōu)質(zhì)內(nèi)容請(qǐng)關(guān)注微信公眾號(hào)“AI 前線”(ID:ai-front)關(guān)于編程語(yǔ)言,還有很多類似的圖可以表示它們相互之間的演進(jìn)。不過(guò)我并不想從語(yǔ)言設(shè)計(jì)者角度來(lái)說(shuō)明這個(gè)問(wèn)題,而是想從程序員本身來(lái)看待語(yǔ)言演變。雖然兩者間有些接近,但并不完全相同。從該圖可以看出,如果開始使用的是編程語(yǔ)言 A,下一個(gè)最有可能切換過(guò)去的是哪種語(yǔ)言。這種推測(cè)不是非??茖W(xué)。不過(guò)如果你需要精確的科學(xué),就不會(huì)在這里閱讀這篇文章了,對(duì)嗎?也許這張流程圖對(duì)我來(lái)說(shuō),能揭示更多的內(nèi)容。
聲明:在此處,不考慮程序員最喜歡的是什么語(yǔ)言。人們可以在任意兩個(gè)語(yǔ)言之間切換,也可以學(xué)習(xí)很多種語(yǔ)言、然后選擇最適合工作的一種語(yǔ)言。本文中的觀點(diǎn)有一定的傾向性。
在接下來(lái)的篇幅里,我所闡述的均為個(gè)人觀點(diǎn)。為了不影響讀者閱讀,就不再一一做出聲明了。

程序員遷移模式
我想強(qiáng)調(diào)下最普遍的“終極節(jié)點(diǎn)”。在這些節(jié)點(diǎn)上,人們?cè)谒麄兯幍木S度找不到更好的可替代編程語(yǔ)言。 這些終極節(jié)點(diǎn)包括:Rust、 Java、 Go、 Python 3、javascript 和 node.js(node.js 作為一種特殊的 javascript,在這里特別指出)。
幾年前,我認(rèn)為 C 也是一個(gè)終極節(jié)點(diǎn)??赡墁F(xiàn)在也還可以這樣認(rèn)為,因?yàn)橛写罅康闹匾?xiàng)目(如 OS 內(nèi)核)仍使用了 C,而且可以認(rèn)為它無(wú)可替代。不過(guò)有跡象表明 C 其實(shí)是可以替代的。我最喜歡的例子就是 有趣的空指針。Linux 內(nèi)核有個(gè)編譯器帶來(lái)的致命弱點(diǎn),即 NULL 值“不可能”出現(xiàn),因此沒(méi)有對(duì)函數(shù)進(jìn)行空指針檢查。C 也是一團(tuán)糟,其規(guī)格里有幾個(gè)新編程語(yǔ)言所沒(méi)有的致命錯(cuò)誤。也許某天這些錯(cuò)誤能被修復(fù)。
讓我們回退幾步。如果從頂部開始,根據(jù)人們進(jìn)入編程的不同規(guī)格,可以看到四個(gè)主干:
“低級(jí)”編程,包括 asm 和 C。
“商業(yè)型”或“學(xué)習(xí)型”編程,從 BASIC 開始。
計(jì)算類 / 科技類編程,如 Fortran,MATLAB 和 R。
腳本 / 膠水編程,如 Shell 和 Perl。
我們也會(huì)談到“數(shù)據(jù)庫(kù)查詢語(yǔ)言”,比如 SQL。它是一枝獨(dú)秀,所有替代它的嘗試都以失敗告終。 數(shù)據(jù)庫(kù)語(yǔ)言從上世紀(jì)六十年代開始就停滯不前了。甚至到現(xiàn)在,其關(guān)鍵字仍使用大寫,因?yàn)椋ㄋ麄冋J(rèn)為)這樣能更好的理解代碼。
我還忽略了 HTML 和 CSS。他們是真正的語(yǔ)言,不過(guò)現(xiàn)在大家都開始學(xué)習(xí)這兩種語(yǔ)言,圖上無(wú)法用相應(yīng)的箭頭來(lái)標(biāo)識(shí)。Lisp 也沒(méi)有考慮在內(nèi),因?yàn)樗恢睕](méi)有流行過(guò),雖然有一小部分人一直希望它能流行起來(lái)。我還建議添加第五個(gè)分類,“配置編輯”。
該圖也忽略了 Haskell。它可以在旁邊用一個(gè)獨(dú)立的框來(lái)表示,和其他語(yǔ)言之間沒(méi)有出入的箭頭,不過(guò)這沒(méi)關(guān)系。Haskell 是個(gè)自嘲式的大笑話,除非涉及到 Monads,它不再使用 I/O 概念。
不管怎么樣,讓我們回到上世紀(jì)九十年代。假設(shè)那時(shí)編程世界很簡(jiǎn)單,(1) 初級(jí)程序員使用 C,asm 或者 Turbo Pascal,(2) 商業(yè)程序員使用 VB,(3) 數(shù)值計(jì)算人員使用 Fortran,R 或 MATLAB,(4) 膠水編程者使用 sh 或 Perl。
那時(shí),編程語(yǔ)言就是這么嚴(yán)格劃分的。畫該圖時(shí),我才意識(shí)到這一點(diǎn)。顯然,我們不會(huì)用 Perl 來(lái)寫操作系統(tǒng)內(nèi)核,不會(huì)用 MATLAB 來(lái)寫膠水程序,不會(huì)用 VB 來(lái)寫大型矩陣相乘算法。
現(xiàn)在則變化很大。選擇什么樣的語(yǔ)言已經(jīng)不再像過(guò)去那樣明確了。
我們先來(lái)看樹起點(diǎn) asm(匯編語(yǔ)言)。用 asm 來(lái)寫程序是相當(dāng)困難的。不過(guò)即使到現(xiàn)在,它仍是寫某些程序最好的方式(如電腦啟動(dòng)后的最初幾個(gè)指令,或是中斷處理的入口代碼)。不管是在 App Store 里還是手機(jī)上的 JIT 里,每個(gè)編譯語(yǔ)言最終都會(huì)將代碼編譯成匯編或機(jī)器語(yǔ)言。
基于 asm,出現(xiàn)了兩個(gè)分支:C 類型分支和 Pacal 類型分支。(Algol 出現(xiàn)的更早,不過(guò)此處忽略掉。宣稱自己是 Algol 程序員的人并不多。Algol 對(duì)其他語(yǔ)言影響很大。)
Pascal 風(fēng)格分支語(yǔ)言的特點(diǎn)是有begin...end。C 風(fēng)格語(yǔ)言的特點(diǎn)則是有括號(hào)。當(dāng)然,C 影響了很多的編程語(yǔ)言設(shè)計(jì),這點(diǎn)在圖中沒(méi)有體現(xiàn)。因?yàn)槲覀儸F(xiàn)在討論的是程序員,而不是語(yǔ)言設(shè)計(jì)人員。
首先來(lái)看看 C。很奇怪,一旦人們開始使用 C,就習(xí)慣用它來(lái)處理各種情況。不管實(shí)現(xiàn)優(yōu)劣與否,它是為數(shù)不多的能合理實(shí)現(xiàn)所有四類編程問(wèn)題的語(yǔ)言之一。這四類都有些難度(除了低級(jí)編程,它正是 C 擅長(zhǎng)的領(lǐng)域),不過(guò) C 都能搞定,速度也還可以。
如果你是個(gè) C 程序員,接下來(lái)會(huì)使用那種語(yǔ)言呢?這取決于用它來(lái)做什么。
顯然,C++ 是一個(gè)選擇。雖然其名字與語(yǔ)法和 C 很像,但它其實(shí)和 C 風(fēng)格迥異。除了 BeOS,其他操作系統(tǒng)內(nèi)核不會(huì)使用 C++。在極具潛力的 Rust 使用前,操作系統(tǒng)基本都使用 C 編寫。
但是商業(yè)(“大型程序”)和數(shù)值計(jì)算(“快速程序”)領(lǐng)域的人員喜歡 C++。說(shuō)喜歡不一定準(zhǔn)確,但他們別無(wú)選擇,只能使用 C++。
對(duì)于膠水程序,很多人會(huì)直接從 C(或 C++)轉(zhuǎn)到 Python 2。我最近也這樣做過(guò)。和怪異的 Perl 不同,Python 2 類似 C 語(yǔ)言風(fēng)格,其語(yǔ)法更簡(jiǎn)單。C 程序員很容易理解 Python C 模塊(并可以編寫新的 Python 模塊)。從 Python 里調(diào)用 C 函數(shù)比其他語(yǔ)言更簡(jiǎn)單。如果在 Java 里調(diào)用,就需要處理非引用計(jì)數(shù)的垃圾回收問(wèn)題。Python 的“os”模塊提供了 C 系統(tǒng)調(diào)用及該調(diào)用能工作的環(huán)境。程序員可以訪問(wèn) C 語(yǔ)言中的錯(cuò)誤碼并設(shè)置相應(yīng)信號(hào)處理程序。唯一的問(wèn)題就是 Python 有些慢。不過(guò)只把它作為膠水語(yǔ)言,則可以 不考慮 Python 的慢速。速度慢時(shí),可以寫 C 模塊或調(diào)用 C 的庫(kù)或子程序。
另外,Java 面世后,很多 C 和 C++ 商業(yè)軟件的程序員非??斓厍袚Q到 Java。C++ 編譯時(shí)間長(zhǎng),頭文件繁多,可移植性差,有釋放后重用的錯(cuò)誤問(wèn)題。因此,雖然 Java 運(yùn)行的很慢(和 python 不同的是,Java 宣稱“理論上運(yùn)行很快”),人們還是更愿意使用 Java。
我記得有篇文章講過(guò),Go 的設(shè)計(jì)者最開始認(rèn)為 Go 可以和 Java 或 C++ 媲美,但實(shí)際沒(méi)有做到。Java 就像知名酒店,或是門洛帕克(Menlo Park),一旦入住就不想離店。同時(shí),程序員沒(méi)有從 C++ 切換到 Java 主要是因?yàn)椋篴)Java 速度比 C++ 慢,b)Java 仍有垃圾回收的經(jīng)典問(wèn)題。
Go 在之前已經(jīng)切換到 Python 2 的膠水程序人員中流行起來(lái)。事實(shí)證明 Python 的慢速是其痛點(diǎn)所在。計(jì)算機(jī)復(fù)雜度急劇增加,Python 膠水程序規(guī)模也越來(lái)越大。相較其優(yōu)勢(shì),動(dòng)態(tài)類型帶來(lái)的麻煩更多,因此人們開始使用預(yù)編譯二進(jìn)制。Python 2 占用很多內(nèi)存,因此 Go 做了 RAM 改進(jìn),避免了從 C++ 遷移到 Go 帶來(lái)的問(wèn)題。Go 的難度和 Python 差不多,但它運(yùn)行更快,占用 RAM 更少。
我們現(xiàn)在稱 Go 是一種“系統(tǒng)”語(yǔ)言,因?yàn)樘崞鹉z水程序,我們更多的是想到 Perl 和 Ruby,不過(guò)它們的作用是一樣的。(試試告訴一個(gè) C 語(yǔ)言內(nèi)核開發(fā)者,Go 是“系統(tǒng)”語(yǔ)言,看看他們的反應(yīng))Go 是粘合劑,可以把各個(gè)組件組合到一起成為一個(gè)系統(tǒng)。
我們接下來(lái)看 Visual Basic 和 Pascal 分支。人們有不同的想法:明顯正確的(“我為什么會(huì)使用與 C 或 Java 一樣讓人痛苦的語(yǔ)言呢?”),或明顯錯(cuò)誤的(“可視化的....Basic?開玩笑吧?”)。二十世紀(jì)八十年代和九十年代,一些人仍認(rèn)為編程應(yīng)該讓新手可以方便使用,因此在個(gè)人電腦上預(yù)裝了免費(fèi)的編程語(yǔ)言,大部分都是 BASIC。
另一方面,大學(xué)教授編程時(shí),則避開了 BASIC(“如果學(xué)生前期使用過(guò) BASIC,就不能對(duì)學(xué)生很好的進(jìn)行編程授課”),也沒(méi)有選擇 C。他們更傾向于 Pascal,認(rèn)為 Pascal 易于學(xué)習(xí)。就像 Algol 的學(xué)術(shù)論文里提到的一樣,而且它的語(yǔ)法適合教學(xué),能讓每個(gè)學(xué)生都能聽(tīng)懂。因此就有了學(xué)術(shù)分支和個(gè)人電腦分支,不過(guò)它們有個(gè)共同點(diǎn),那就是都和 C 不像。
基于 PC(DOS)的 BASIC 演變?yōu)榛?Windows 的 Visual Basic,這可能是 javascript 出現(xiàn)前使用最多、最受歡迎的編程語(yǔ)言。(現(xiàn)在,它仍是在 Excel 中使用的“宏”語(yǔ)言。目前有很多 Excel 的程序員,雖然他們并不認(rèn)為自己是程序員。)
同時(shí),Pascal 也在努力往 PC 轉(zhuǎn)。因?yàn)?Turbo Pascal 的出現(xiàn),它變得流行起來(lái),并一度成為最快的編譯器。在速度上,Pascal 的確沒(méi)有夸張。甚至有一些 C 程序員也喜歡用 Pascal,不是因?yàn)橄矚g其類 C 的語(yǔ)法,而是因?yàn)樗乃俣群芸臁#═urbo C 也可以,但速度還不夠。它比其他 C 編譯器都快。)(大學(xué)里,Pascal 學(xué)術(shù)性越來(lái)越強(qiáng),后來(lái)演變成 Modula 和 Ada。如果不是美國(guó)軍方在其高可靠系統(tǒng)中采用了 Ada 語(yǔ)言,這個(gè)分支早該終結(jié)了。現(xiàn)在我們可以忽略 Ada。)
那時(shí)還有兩個(gè)“商業(yè)”開發(fā)分支:BASIC 和 Pascal 分支。Windows 問(wèn)世后,出現(xiàn)了 Visual Basic。基于 DOS 的 Turbo Pascal 有點(diǎn)過(guò)時(shí),基于 WIndows 的 Turbo Pascal 也并不出眾。為了競(jìng)爭(zhēng),Turbo Pascal 的設(shè)計(jì)者 Anders Hejlsberg 創(chuàng)建了 Delphi。Delphi 和 Visual Basic 一樣,有可視化的編程環(huán)境,但它基于 Turbo Pascal 語(yǔ)言,也極少出現(xiàn)找不到或不匹配實(shí)時(shí)動(dòng)態(tài)鏈接庫(kù)的煩人問(wèn)題。
Delphi 很好,但它不屬于 Microsoft。摻雜商業(yè)因素后,局面變得有些困難。在一系列出人意料的事件之后,Hejlsberg 離開了 Microsoft,但仍繼續(xù) C# 的開發(fā),發(fā)布了 Microsoft .NET 平臺(tái),并包含 Visual Basic.Net(這是個(gè)很可怕的產(chǎn)品)。據(jù)稱 C# 統(tǒng)一了兩個(gè)分支。
不幸的是如前所述,VB.NET 很可怕。它和 Visual Basic 幾乎沒(méi)有共同點(diǎn),更像是 C++ 的一個(gè)慢速版本,披了件有點(diǎn)非典型 Basic 的語(yǔ)法外衣,還帶著一個(gè)更糟的 UI 設(shè)計(jì)工具。C# 也不是 Delphi。不過(guò)這幾種語(yǔ)言都銷聲匿跡了,Microsoft 盡力推動(dòng)了這一點(diǎn)。(除了 Microsoft Office,它到現(xiàn)在仍在使用最開始的 Visual Basic 語(yǔ)法,稱為Visual Basic for Applications, 即 VBA。比起.NET,它使用的更廣泛,更受用戶喜歡。)
我不清楚怎樣才能叫做一名 Visual Basic 程序員。微軟致力于讓他們改用 VB.NET,但大多數(shù)人并不愿意。我想在圖中畫一條“他們實(shí)際的選擇”的箭頭,不過(guò)老實(shí)說(shuō)我也不知道應(yīng)該指向哪里。也許他們成為了 web 開發(fā)者,或者編寫了 Excel 的宏。
從現(xiàn)在看,如果寫基于微軟主推的基于.NET 平臺(tái)的 Windows 軟件,是件很有趣的事??赡苁褂玫恼Z(yǔ)言都會(huì)深受 Hejlsberg 的影響。Hejlsberg 的語(yǔ)言在反擊之前被微軟和 Visual Basic 所遏制,于是 Hejlsberg 轉(zhuǎn)向?qū)?Typescript,這個(gè)留待以后討論。
最初的膠水語(yǔ)言是 Unix shell,它因引入“管道”概念也很著名?!肮艿馈边B接簡(jiǎn)便的工具來(lái)完成復(fù)雜的工作。
啊,就是那些日子那些日子一去不復(fù)返,Perl 就是獻(xiàn)給它們的悼詞—— Rob Pike
事實(shí)證明,設(shè)計(jì)小而簡(jiǎn)單的工具是困難的,通常我們沒(méi)有足夠的時(shí)間來(lái)做這個(gè)。能夠讓我們跳過(guò)這些輕便工具,致力于編寫奇特的、能夠粘著很多亂七八糟的小程序的語(yǔ)言變得越來(lái)越流行。(它對(duì) shell 語(yǔ)言的缺陷,尤其是與引用和通配符擴(kuò)展規(guī)則相關(guān)的缺陷并沒(méi)有幫助。)
第一個(gè)是 awk,它是語(yǔ)法和 C 類似的解析語(yǔ)言,可以用在 shell 的管道上。那時(shí),在一種語(yǔ)言(sh)的一行中里使用另一種微語(yǔ)言(awk)有點(diǎn)奇怪,慶幸的是我們適應(yīng)了,因?yàn)楝F(xiàn)在的 web 程序都是這樣的。(我們略過(guò) csh,它是另一種與 C 語(yǔ)法不兼容的語(yǔ)言,存在不同的致命缺陷,可以被 sh 替代。)
接下來(lái)是 Perl。awk 沒(méi)有足夠多的標(biāo)點(diǎn)符號(hào),從而促成了 Perl 的產(chǎn)生。(好吧,這只是個(gè)玩笑。)
Perl 開始到 Perl 5,越來(lái)越受歡迎?,F(xiàn)在,Perl 停止改進(jìn)語(yǔ)法,在 Perl 6 上傾盡全力,從零開始打造。(在圖中并沒(méi)有標(biāo)出 Perl 6,因?yàn)檫€沒(méi)有人切換過(guò)去。)
這樣的配置給在幾個(gè)方向斷層進(jìn)行“粘合”留下了空間。如果程序員覺(jué)得 Perl 的語(yǔ)法差勁,可能會(huì)切換到 Python。如果他們認(rèn)為 Perl 的語(yǔ)法很神奇有效力,只需要一些調(diào)整,則可能會(huì)切換到 Ruby。如果使用 Perl 來(lái)運(yùn)行 web 的 CGI 腳本,則可能會(huì)保持原樣,也可能會(huì)轉(zhuǎn)而切換到 PHP。
Ruby 很快成為 web 服務(wù)器支持的語(yǔ)言(進(jìn)而是 Ruby on Rails)。Python 也同樣在演進(jìn)。
現(xiàn)在有趣的是:整整一代程序員摒棄了命令行方式(這也是膠水語(yǔ)言運(yùn)行的方式),希望在 web 端可以做任何事情。從某方面來(lái)說(shuō),這樣更好,比如在一個(gè)膠水程序中可以超鏈接到另一個(gè)膠水程序。從另一方面來(lái)說(shuō),則更糟糕,因?yàn)楝F(xiàn)在所有的 web 程序都很慢,不能使用腳本,而且安裝 Electron 的另一個(gè)副本需要 500MB 的 RAM 空間等等。這就引入了 web 語(yǔ)言這個(gè)話題。
圖中,集中在 javascript 的“膠水”分支有很多的箭頭指向,這并不奇怪。javascript 最初只使用于前端。當(dāng) node.js 出現(xiàn)后,這種情況完全改變了?,F(xiàn)在,只需要學(xué)習(xí)一種語(yǔ)言來(lái)寫前后端和命令行工具。javascript 最初的設(shè)計(jì)是將其作為最終的膠水語(yǔ)言,試圖融合 HTML、CSS、面向?qū)ο缶幊?、面向函?shù)編程、動(dòng)態(tài)語(yǔ)言、JITs 以及其它一切能通過(guò) HTTP 請(qǐng)求得到的東西。
但是這樣不太好,因?yàn)楹笙蚣嫒輰?duì)于 web 的成功至關(guān)重要。要保證這一點(diǎn),就無(wú)法修復(fù)一些嚴(yán)重錯(cuò)誤。1995 年,經(jīng)過(guò) 10 天的設(shè)計(jì),javascript 發(fā)布了。對(duì)于 10 天的成果而言,它相當(dāng)優(yōu)秀,但同時(shí)它也存在一些問(wèn)題,無(wú)法對(duì)其進(jìn)行修復(fù)。
這就是圖中唯一一個(gè)有雙向箭頭的地方:javascript 和 Python 3 之間。我們把它叫做腳本語(yǔ)言的陰陽(yáng)兩面。
大部分出現(xiàn)過(guò)的膠水 +web 語(yǔ)言正在消失,Python 不在其列,至少目前還不會(huì)消失。我猜是因?yàn)?Python 本身是合理的。使用 javascript 編程時(shí)間足夠長(zhǎng)的話,過(guò)段段時(shí)間后就會(huì)變得不大正常。這時(shí)為了緩解壓力,程序員有可能會(huì)切換到 Python。
同時(shí),如果長(zhǎng)時(shí)間使用 Python,最后準(zhǔn)備編寫 web 應(yīng)用程序時(shí),前端代碼和后端使用完全不同的語(yǔ)言是很煩人的。一個(gè)的語(yǔ)法是 [a,b,c].join(,),而另一個(gè)則變成了,.join([a,b,c]),這讓人完全記不清誰(shuí)是誰(shuí)了。
一種語(yǔ)言有 JIT,可以讓其一旦運(yùn)行起來(lái)就會(huì)速度很快。而另一種則是啟動(dòng)快,運(yùn)行慢。
一種有合理的命名空間系統(tǒng),而另一種則沒(méi)有。
我不清楚從長(zhǎng)期看,Python 3 是否能打敗 javascript。但至少目前看,它不會(huì)被擊敗。
同時(shí),對(duì)于編程事實(shí)分支從不滿意的 Hejlsberg,看到了 javascript 的很多問(wèn)題,引入了 TypeScript。與此同時(shí),微軟突然停止了對(duì) Windows 應(yīng)用程序的大力推進(jìn),開始大面積推廣 web 和開源。這意味著 Microsoft 第一次將其開發(fā)者推向 web 語(yǔ)言即 javascript。在此基礎(chǔ)上,他們有自己的 TypeScript,我覺(jué)得這是一種很好的語(yǔ)言。這個(gè)分支存在有數(shù)十年,開始和其分支融合,可能不久后會(huì)消失。
TypeScript 和 javascript 比,能勝出嗎?這是個(gè)有趣的問(wèn)題,我也不知道。我以前賭 Hejlsberg 能贏,不過(guò)我一般容易賭輸。
Python 2 和 Python 3 的對(duì)比綜上所述,我對(duì) Python 2 和 3 有了結(jié)論。它們很相似,但不盡相同。我認(rèn)為,這是因?yàn)樗麄冊(cè)谡麄€(gè)程序員語(yǔ)言遷移圖中所處的位置不同。Python 2 開發(fā)者來(lái)自 C 和 Perl 開發(fā)人員,希望編寫膠水代碼。Web 服務(wù)器是后續(xù)添加的一個(gè)應(yīng)用場(chǎng)景。我的意思是,Python 2 出現(xiàn)后,web 程序變得流行起來(lái),這并不出人意料。很多 Python 2 的開發(fā)者轉(zhuǎn)到 Go 的開發(fā),因?yàn)樗麄兿雽懙哪承跋到y(tǒng)膠水”代碼使用 Go 正合適。
Python 3 的開發(fā)者是從不同的語(yǔ)言切換而來(lái)的。事實(shí)證明,Python 3 問(wèn)世后,Python 的使用得到很大的發(fā)展,不過(guò)新加入的人群和以前的人群有所不同。由于帶有模塊 SciPy 和 TensorFlow,從科學(xué)類和數(shù)值類處理轉(zhuǎn)過(guò)來(lái)的新程序員占了其中很大的比例。老實(shí)說(shuō),在高吞吐量的數(shù)值處理中,Python 是一個(gè)相當(dāng)怪異的選擇。但不論如何,這些庫(kù)的存在是我們選擇它的一個(gè)原因。我猜 Python 的另一個(gè)優(yōu)勢(shì)則是易于和 C 模塊集成。當(dāng)然,Python 3 本身就是網(wǎng)絡(luò)編程。
想要理解 Python 2 和 3 的區(qū)別,只需看看其不同的字符串類型。Python 2 中,字符串是一組字節(jié),因?yàn)椴僮飨到y(tǒng)、Unix 管道處理、網(wǎng)絡(luò) socket 的處理均以字節(jié)為單位。對(duì)于系統(tǒng)程序而言,Python 2 是膠水語(yǔ)言,其處理以字節(jié)為單位。
在 Python 3 中,字符串是一組 unicode 碼。因?yàn)槿藗儾簧瞄L(zhǎng) unicode 碼的轉(zhuǎn)換,而和網(wǎng)絡(luò)交互時(shí),都是以 unicode 為基礎(chǔ)。做科學(xué)數(shù)值計(jì)算的人不關(guān)心字符串,做網(wǎng)絡(luò)編程的人更關(guān)心 unicode,所以 Python 3 使用 unicode。如果要用 Python 3 來(lái)編寫系統(tǒng)程序,就會(huì)一直疲于 unicode 的轉(zhuǎn)換,即使最簡(jiǎn)單的文件名也需要進(jìn)行轉(zhuǎn)換。這也正是有其因,必有其果。
Misunderstanding Exceptions
https:///log/20070823
You cant make C++ not ugly, but you cant not try
https:///log/20100721
原文鏈接:https:///log/20190318