一圖看懂編程語言遷移模式:終點(diǎn)站是Python、Go、JS
有著20年編程經(jīng)驗(yàn)的資深程序員,以自己多年來的經(jīng)歷,總結(jié)出程序員的編程語言切換規(guī)律,做了一個(gè)主流編程語言的進(jìn)階流程圖,展示不同編程語言之間的承接關(guān)系、程序員選擇編程語言的方向和路徑。
鐵打的程序員,流水的編程語言。時(shí)代在發(fā)展,編程語言也與時(shí)俱進(jìn),不斷有新的、更好或者更時(shí)髦的語言出現(xiàn),程序員也會(huì)或主動(dòng)、或被動(dòng)去學(xué)習(xí)一門新的、”更好“的編程語言。
Tailscale_io聯(lián)合創(chuàng)始人Avery Pennarun,一位有著20年編程經(jīng)驗(yàn)的資深程序員,以自己多年來的經(jīng)歷,總結(jié)出程序員的編程語言切換規(guī)律,做了一個(gè)主流編程語言的進(jìn)階流程圖,展示不同編程語言之間的承接關(guān)系、程序員選擇編程語言的方向和路徑。
Avery這個(gè)人,很像是小說、人物報(bào)道里的典型程序員,有點(diǎn)偏執(zhí),喜歡搞怪。曾經(jīng)做過7年的Debian開發(fā),或許這段經(jīng)歷能夠說明一些問題。因?yàn)锳very資歷深涉獵廣,我們也能夠從這篇文章中,了解到編程語言發(fā)展過程的一些有趣的歷史傳承。
我們看到,圖中總共有4條主線,分別是:
- 低級語言,即匯編和C那一支
- 商用或者教學(xué)用語言,即BASIC那一支
- 專為數(shù)學(xué)和科學(xué)開發(fā)的語言,即R那一支
- 腳本、膠水語言,即Shell那一支
或許有人會(huì)說這張圖里缺少了HTML、CSS、Haskell和Lisp,這不重要,因?yàn)锳very并沒打算展開去講它們。
Avery提到,最初的時(shí)候,4類語言有一個(gè)比較明確的邊界。低階語言編程的程序員使用C,匯編或者Turbo Pascal,商用大型程序員使用VB(當(dāng)然那個(gè)時(shí)候的“大型”,和現(xiàn)在的“大型”完全不在一個(gè)量級),數(shù)值計(jì)算人員使用Fortran,R或MATLAB,膠水編程使用Shell或Perl。
程序員不會(huì)用Perl來寫操作系統(tǒng),也不會(huì)用VB寫大數(shù)相乘?,F(xiàn)代語言則模糊了相互之間的邊界,很多R寫的程序,也可以用Python實(shí)現(xiàn)。語言之間的轉(zhuǎn)換主要在于挑選不同的風(fēng)格。
低級編程語言
先來看看傳說中的匯編。用匯編寫程序是相當(dāng)困難的,但即使在人工智能蓬勃發(fā)展的今天,某些場景下匯編仍然是不可替代的編程語言,而且,所有編譯語言的代碼都會(huì)被轉(zhuǎn)成匯編或者機(jī)器語言。
從匯編開始出現(xiàn)了3個(gè)分支,在風(fēng)格上有明顯的差異,不過我們先看C這一支。Pascal特點(diǎn)是有"begin...end";而C是用{}?;ɡㄌ柕娘L(fēng)格影響了后世很多語言,雖然討厭花括號的程序員群體也不在少數(shù)。
而且C有一種魔力,一旦你開始使用就很容易形成一種習(xí)慣,不管最終的效率高低,你總會(huì)想用C去實(shí)現(xiàn)一切。而且C也是為數(shù)不多的能合理實(shí)現(xiàn)所有上述四類編程問題的語言之一,而且速度也還可以。
C再往下,是C++和Python 2。C++雖然名字看起來好像是C的進(jìn)階,然而風(fēng)格卻大不相同。Avery吐槽”用C++是因?yàn)楹芏嘧錾逃么笮统绦蜷_發(fā)的程序員別無選擇“。
而膠水編程就好辦多了,直接上手Python 2。雖然Python很慢,同時(shí)代的Perl也有不少簇?fù)怼5鳛橐幻鸆語言選手,Avery認(rèn)為Perl的語法風(fēng)格只能用怪誕來形容。相比之下,更接近C的Python顯然是更好的選擇。
不需要花費(fèi)太多精力就能很快適應(yīng)Python的語法;在Python里調(diào)用C函數(shù)的成本比Java以及其他語言低多了!缺點(diǎn)就是慢,但你可以調(diào)用C模塊來緩解啊。
后來Java出現(xiàn)了,大批C和C++程序員迅速投入Java懷抱,以至于很長一段時(shí)間Java都霸占著編程語言No 1的位子。
Java的缺點(diǎn)是運(yùn)行時(shí)很慢,然而相比C++超慢的編譯速度、讓人頭大的header文件、超弱的跨平臺性…這點(diǎn)缺點(diǎn)不算什么了。
Go剛出現(xiàn)的時(shí)候,有人稱其為C++和Java的終結(jié)者,結(jié)果并沒有。Avery說,想當(dāng)年Go最輝煌的那陣子是因?yàn)镻ython 2程序員發(fā)現(xiàn)它跑的比Python快,RAM占用比Python少,寫代碼的難度相當(dāng)。
雖然現(xiàn)在認(rèn)為Go是一門“系統(tǒng)”語言,但Avery認(rèn)為本質(zhì)上,Go其實(shí)還是一個(gè)膠水兒語言。
商用編程語言
BASIC是基于讓“新手能夠輕松掌握”的目的開發(fā)的,但是學(xué)院派發(fā)現(xiàn)有BASIC編程經(jīng)驗(yàn)的學(xué)生,很難教好他編程,這實(shí)在是有點(diǎn)諷刺。當(dāng)然他們也沒選擇C,而是選擇了更適合教學(xué)用的Pascal。
后來微軟將BASIC轉(zhuǎn)變成Visual Basic,選擇我們?nèi)匀辉贓xcel中使用VB,只不過它改名叫宏。
后來Turbo Pascal的作者創(chuàng)建了一門新的語言Delphi,口碑很不錯(cuò),再后來還開發(fā)了C#。相反,VB.NET則可以說是非常失敗了。
Avery還不忘給出很有殺傷力一擊:我其實(shí)很想在VB后面再加一個(gè)箭頭,但不好意思,我的確不知道這幫程序員后來去哪兒了??赡苻D(zhuǎn)行做網(wǎng)頁了?或者去搞Excel的宏?
膠水編程語言
Avery說,膠水語言的鼻祖要數(shù)Unix的Shell。Unix的設(shè)計(jì)哲學(xué)倡導(dǎo)一次只做一件事,這些功能單一、但是好用的小模塊,通過pipeline鏈接起來,就能合力完成一件復(fù)雜的“大任務(wù)”,頗有點(diǎn)螞蟻群的味道。
理想雖然美好,無奈敗給了現(xiàn)實(shí),于是有了awk,一個(gè)和C語法相似的解釋語言。
接下來有了Perl,Perl對互聯(lián)網(wǎng)的興起起到了非常大的推動(dòng)作用,同時(shí)也借助互聯(lián)網(wǎng)Perl收獲了超贊的口碑。人們使用Perl來運(yùn)行web的CGI腳本,接受HTML請求,然后進(jìn)行解析。
你知道Perl最讓人印象深刻的是什么嗎?讓人眼花繚亂的標(biāo)點(diǎn)符號!
當(dāng)然,有人覺得Perl語法丑陋(比如Avery),那么他可能之后會(huì)選擇使用Python;相反,有人愛死Perl的風(fēng)格,那么可能會(huì)選擇Ruby。
所以,如果你還在用Perl寫Web CGI腳本,那么請繼續(xù)吧;或者,你可以考慮一下PHP。
前端編程語言
JavaScript是一門編程語言,現(xiàn)在應(yīng)該已經(jīng)是一個(gè)不爭的事實(shí)了。然而,Avery指出,正因?yàn)镴S是一個(gè)大雜燴,把HTML、CSS、面向?qū)ο?、函?shù)式編程、動(dòng)態(tài)語言、JIT等等所有涉及到HTML請求的概念,統(tǒng)統(tǒng)囊括進(jìn)來,導(dǎo)致這個(gè)語言特別丑。
而且你能相信一門在20多年前,僅僅花了10天時(shí)間就做出來的語言嗎?顯然它存在著很大的缺陷和一些無法修復(fù)的嚴(yán)重錯(cuò)誤。
我們回頭再看這張圖👇,注意一下右下角Python 3和JS:
你會(huì)看到Python和JS形成了一個(gè)循環(huán)。為什么會(huì)這兩個(gè)會(huì)出現(xiàn)糾纏反復(fù)呢?Avery說因?yàn)橛肑S久了容易變得不正常,需要通過Python治療一下。(hmmmm...)
接下來的TypeScript,可能因?yàn)樽髡呤荄elphi的開發(fā)者,Avery對TypeScript給予了很高的評價(jià)。
在node.js出現(xiàn)之前,JS被認(rèn)為就是一門前端語言。而現(xiàn)在成為了一門前端+后端+命令行的一條龍語言。
Avery也沒放過Python 3。他說在Python 3中編寫系統(tǒng)程序,你會(huì)發(fā)現(xiàn)自己經(jīng)常搞亂unicode轉(zhuǎn)換,甚至連文件名都會(huì)搞亂!
善有善報(bào),惡有惡報(bào)。
所有,親愛的新智元讀者們,你們怎么看呢?請留言表達(dá)你們對Avery這個(gè)路線圖的態(tài)度。
參考鏈接:
https://apenwarr.ca/log/20190318
注:本文觀點(diǎn)帶有強(qiáng)烈的主觀傾向,新智元的讀者中,可能有人會(huì)持有不同意見,贊同也好反對也好,歡迎大家留言提出自己的看法!