12.18 程序員遷移模式

我製作了一個主流編程語言的流程圖,說明程序員如何從一種編程語言遷移到另外一種:

程序員遷移模式

上圖中紅顏色標記了目前最常見的“終端節點”(所謂終端節點是人們在這裡停下來因為他們找不到更好的東西)。終端節點是:Rust,Java,Go,Python 3,Javascript和node.js.

如果我們從頂部開始,您可以看到四個主要分支,對應於人們進入編程專業化的路徑:

  • “低級”編程,包括asm和C.
  • “業務”或“學習”編程,從BASIC開始。
  • 數值/科學編程,例如Fortran,MATLAB和R.
  • 腳本/膠水編程,如shell(sh)和perl。

(我們也許可以談論像SQL這樣的“數據庫查詢語言”,除了真的只有SQL,令我非常沮喪的是,每次試圖替換它的嘗試都失敗了。數據庫語言在20世紀60年代陷入困境。,但他們甚至仍然將關鍵字大寫,因為(他們認為)這樣更容易理解SQL代碼。)

(我也遺漏了HTML和CSS。抱歉。他們是真正的語言,現在每個人都必須學習它們,但是沒有地方可以放箭頭。我也省略了Lisp系列,因為它從來沒有真正流行..)

(而且我跳過了Haskell,因為......好吧,我認為它只是一個漂浮的盒子,沒有箭頭標識進出,除非你涉及Monads,否則Haskell會排除掉I / O的概念。)

無論如何,讓我們回到20世紀90年代,並假裝世界很簡單,(1)低級程序員使用C或asm或Turbo Pascal,(2)商業程序員使用VB,(3)數字程序員使用Fortran或R或MATLAB,和(4)膠水程序員使用sh或perl。

語言遷移主要是關於風格

讓我們看一下開頭的樹的部分的asm(彙編語言)。Asm是編寫程序的一種令人難以置信的痛苦方式,儘管到目前為止,它仍然是編寫某些東西的最佳方式(例如,計算機啟動後的前幾條指令,或中斷處理程序的入口代碼)。每種編譯語言最終都會以這種或那種方式編譯成彙編語言或機器語言,即使這種情況發生在App Store內部或手機上運行的JIT中。

當我們抽象超出asm時,發生的第一件事就是分成兩個分支:C-like分支和Pascal-like分支。

我們先來看看C. 奇怪的是,一旦人們開始使用C,他們就開始使用它的各種東西。如果你是C程序員,那你下次去向哪裡編程?這取決於你使用它的原因。

儘管C ++的名稱和語法在哲學上不是很像C語言。除非你是BeOS,否則你不用C ++編寫操作系統內核。操作系統人員堅持使用C,至少在Rust到來之前,看起來後者有一些真正的潛力。

但業務(“大型程序”)和數值計算(“快速程序”)的人們喜歡C ++。好吧,對於很多人來說,“喜歡”不是正確的詞,但他們堅持使用它,而沒有更好的。

對於膠水語言,許多人直接從C(或C ++)跳到python 2,與perl的古怪不同,Python 2是一種熟悉的類C語言,語法更簡單。C程序員很容易理解python C模塊是如何工作的(以及編寫一個新的python模塊)。從python調用C函數比其他語言(如Java)更便宜,在Java中,您必須與非引用的垃圾收集器進行鬥爭。python“os”模塊只為您提供C系統調用,這是C系統調用的方式。

唯一的問題是python很慢,很慢。但如果你把它當作一種粘合語言, 你就不會關心python的緩慢 。

另外,當Java出現時,許多C和C ++“商業軟件”程序員很快就會使用它。Java運行速度非常慢(雖然不像python,它被宣傳為“理論上很快”),但人們樂於付出緩慢的價格來擺脫C ++的長編譯時間,頭文件瘋狂,可移植性不便以及免費使用後錯誤。

我記得在某處看過Go的發明者最初認為Go會成為Java或C ++的競爭者,但這並沒有真正成功。。Java就像那個著名的酒店,也可能來自門洛帕克,一旦你辦理入住手續,你就永遠不會退房。從C++跳到Java的程序員一般不願再轉到其他語言了,雖然,a)Java比C ++慢一些,b)Java也有垃圾收集,這是一個宗教問題。

Go 之前確實受歡迎的是python 2,事實證明,python的緩慢是一種痛苦。隨著計算機變得越來越複雜,python粘合程序往往變得越來越大,然後動態類型開始帶來比價值更多的麻煩,預編譯你的二進制文件開始得到回報。並且python 2使用了大量的內存,因此Go提供了RAM改進,而不是像從C ++遷移時那樣有害。Go並不比python更難寫,但它運行速度更快,並且(通常,有些)RAM更少。

如今我們稱Go為“系統”語言,因為“膠水”語言讓我們想起了太多的perl和ruby,但它們都是做同樣的工作,將組件粘合在一起以構成系統。

Hejlsberg因素

讓我們看看Visual Basic和Pascal分支。

早在20世紀80年代和90年代,一些人仍然認為編程應該對新程序員來說是平易近人的,因此個人計算機使用預先安裝的編程語言免費提供,幾乎總是BASIC。

相比之下,當大學教授編程時,他們避開了BASIC,但也避開C.他們贊成Pascal,這後者被認為相當容易學習,看起來像所有那些歷史悠久的Algol學術論文,其語法可用於教授關於解析器的課程。所以你有了Pascal學術分支和個人計算PC Pascal分支這兩個分支,但他們的共同點是他們都不喜歡C.

PC上的BASIC(在DOS上)最終成為Windows上的Visual Basic,直到javascript出現可能是有史以來最常用和最受歡迎的編程語言。

與此同時,Pascal設法遷移到個人電腦並受到歡迎,主要得益於Turbo Pascal,這可能是有史以來最快的編譯器。他們不是在開玩笑說Turbo。他們甚至讓一些C程序員使用它,儘管後者更喜歡C語法,只是因為它太快了。

(Pascal在大學裡的學術應用越來越多,後來演變成了Modula和Ada。如果美國軍方不採用Ada用於高可靠性系統,那麼這個分支可能會消失。讓我們今天忽略Ada。)

在歷史上,我們有兩個主要的“業務”開發人員分支:BASIC分支和Pascal分支。當Windows發佈了Visual Basic。用於DOS的Turbo Pascal看起來有點舊,Turbo Pascal for Windows並不是超級引人注目。為了競爭,Turbo Pascal的發明者Anders Hejlsberg創建了Delphi,一個像Visual Basic這樣的可視化環境,但是基於Turbo Pascal語言,並且運行時使用更少的可執行的卻總是丟失或不兼容的DLL。

在一個意想不到的事件中,最終Hejlsberg從Delphi所在公司Borland跳槽到微軟工作,在那裡他開始發明C#語言,該語言推出了Microsoft .NET平臺,該平臺也有Visual Basic .NET變種(這很糟糕)。這統一了兩個分支。

不幸的是,如上所述,VB.NET很糟糕。它幾乎不像Visual Basic; 它更像是一個較慢的C ++版本,但頂部的語法不太基本,而且UI設計工具更糟糕。C#也不是Delphi。

我認為有趣的是,如果你使用微軟首選的基於.NET的平臺為Windows編寫軟件,你可能會使用一種受Hejlsberg影響很大的語言,他發明的語言曾經被微軟和Visual Basic殺死了,但是他又殺回來了,殺死了VB。

然後他繼續編寫Typescript....

膠水語言的簡史

最初的粘合語言是Unix shell,因為它引入了“管道”的概念,它將小而簡單的工具互連起來,以完成複雜的工作。

事實證明,設計小而簡單的工具很困難,而且我們大多沒有足夠的時間。因此,讓你跳過小型簡單工具而不是編寫扭曲,粘性混亂的語言變得更加流行。(sh語法也有很大缺陷,尤其是在引用和通配符擴展規則方面。)

首先是awk,它是一種可以在shell管道中使用的C語法外觀解析器語言。

接下來是Perl,受到了awk的“啟發”,因為awk沒有足夠的標點符號。(好吧,開個玩笑。有點。)

Perl在不斷髮展普及,一直髮展到了perl 5,然後他們決定停止逐步改進語法,而是推出全部丟棄過去並從頭開始的perl 6。(Perl 6未顯示在我的圖表,因為沒有人遷移到它上面。)

這使得“膠水”工作的空間在幾個方向上斷裂。如果你認為perl語法很難看,你可能會切換到python。如果你認為perl語法是驚人的和強大的,只需要一些調整,你可能切換到ruby。如果您使用perl來運行Web CGI腳本,那麼,也許您一直這樣做,或者您可能放棄並切換到PHP這個新的事物。

沒過多久,ruby也會增加Web服務器支持(然後是Ruby on Rails)。Python也是這樣發展起來的。

這裡發生的事情很有意思:整整一代程序員都放棄了命令行,這本來是膠水語言運行的地方,人們希望在網上做所有事情。在某些方面,這更好,因為例如:您可以從一個膠水程序超鏈接到下一個。在其他方面它更糟糕,因為所有這些現代網絡程序都很慢且無法編寫,並且需要500MB的RAM,因為你必須安裝另一個Electron的副本......好吧,我想這會把我們帶到網上。

網絡語言

您可能會驚訝地發現我的圖表幾乎包含了整個“膠水”分支中的所有內容,這些分支彙集在javascript上。Javascript最初被認為是一種前端語言,但是當node.js出現時,它永遠改變了。現在,您只需學習一種語言並編寫前端和後端以及命令行工具。Javascript被設計成最終的粘合語言,以某種方式將HTML,CSS,面向對象,函數式編程,動態語言,JIT以及您可以通過HTTP請求進行交談的所有其他事物聯繫在一起。

但它很難看。強調向後兼容性對於網絡的成功至關重要,這也阻止了人們解決其最嚴重的缺陷。Javascript在1995年的10天內出爐,它在10天的工作中非常出色,但也有一些錯誤,我們無法修復它們。

這讓我們看到了我的圖表中唯一的雙向箭頭:從javascript到python 3,再回來。我們稱之為腳本語言的陰陽。

大多數其他歷史膠水+網絡語言正逐漸消失,但不是python。至少還沒有。我想那是因為......這是理智的。如果你在javascript中編程的時間足夠長,那麼瘋狂就會在一段時間後開始找到你。也許您需要一個壓力釋放閥,然後切換到python。

同時,如果你在python中編程的時間足夠長,最終你將需要編寫一個Web應用程序,然後你的前端代碼與後端完全不同的語言非常煩人,完全不同的怪癖。一個是['a','b','c'].join(','),一個是','.join(['a','b','c']),你永遠不會記得哪個是哪個。

其中一個有一個JIT,一旦它啟動就會快速運行,但其中一個啟動速度很慢而且運行緩慢。

其中一個有一個合理的命名空間系統,另一個有......好吧。沒有。

從長遠來看,我不認為python 3可能會擊敗javascript,但它也不會明顯失敗。

與此同時,Hejlsberg從未對他的替代現實編程分支感到滿意,他看到了javascript的許多問題並引入了TypeScript。與此同時,微軟突然停止對本機原生Windows應用程序支持如此咄咄逼人,並開始大力支持Web和開源。這意味著微軟第一次將自己的開發人員推向了網絡語言,這意味著javascript。他們有自己的TypeScript。

TypeScript會贏過純javascript嗎?有趣的問題,我不知道,我之前打賭過Hejlsberg的語言,而且我總是失敗。

Python 2與Python 3

儘管如此,現在我終於可以說出python 2 和 3.它們是非常相似的語言,但不知何故不一樣。在我看來,這是因為它們在整個程序員遷移圖表中佔據了完全不同的位置。

Python 2開發人員來自C和perl的世界,並且想要編寫粘合代碼。後來補充說,Web服務器是事後的想法。我的意思是,在 python 2發佈後網絡變得流行,所以這並不奇怪。許多python 2開發人員最終都轉向Go,因為他們想要編寫的那種“系統粘合”代碼是Go適合的。

Python 3開發人員來自不同的地方。事實證明,自python 3開始以來,python的使用已經增長了很多,但新人與舊人不同。由於像SciPy和Tensorflow這樣的模塊,新人們中有很大一部分來自科學和數字處理領域。對於高吞吐量的數字處理來說,Python實際上是一個非常奇怪的選擇,但無論如何,這些庫都存在,所以我們就選擇了它。我想,python與C模塊的輕鬆集成的另一個勝利。當然,python 3也是以網絡為主題製作的。

要了解python 2和3之間的受眾差異,您只需要查看不同的字符串類型。在python 2中,字符串是一系列字節byte,因為操作系統以字節byte為單位進行處理。Unix管道以字節為單位。網絡套接字以字節為單位。它是系統程序的粘合語言,膠水語言以字節為單位。

在python 3中,字符串是一系列unicode字符,因為人們一直在搞亂unicode轉換......當與web交互時,一切都是unicode。進行科學數值計算的人不太關心字符串,做網絡編程的人非常關心unicode,所以它使用unicode。儘管如此,嘗試在python 3中編寫系統程序,你會發現自己經常搞亂unicode轉換,即使是在文件名之類的簡單事情中也是如此。善有善報惡有惡報。

最後,小編想說:我是一名python開發工程師,整理了一套最新的python系統學習教程,想要這些資料的可以關注私信小編“01”即可,希望能對你有所幫助。


分享到:


相關文章: