為什么我們不再發明編程語言了?
上個世紀,數百種編程語言被發明出來,但是進入21世紀,當我們都進入互聯網時代時,只剩那么寥寥幾個了。
如果你翻一下TIOBE得編程語言排行榜,就會發現20年來,上躥下跳的就是那幾張老面孔:C , Java, Python ,C++ , C#, JavaScript......
80年代后期,平均每個月就會出現一種新語言,現在,平均每年出現一個就不錯了。
我有點好奇,就去扒了扒其他編程語言的出現時間,把他們分成了分為中生代、新生代和 老年代。
先看中生代的家伙們,20多歲,30出頭,正是編程的中堅力量。
- Python : 1991
- Visual Basic : 1991
- PHP : 1995
- Ruby : 1995
- Java : 1995
- JavaScript : 1995
- C# : 2000
(1995年還真是神奇的一年啊,幾位大佬同時誕生。)
再看這些老前輩,尤其是C語言,老而彌堅,屹立50年不倒,把系統級編程吃得死死的。
- Lisp : 1958
- Pascal : 1970
- C : 1972
- Objective-C : 1984
- C++ :1985
- Object Pascal : 1986
新生代則活力無限, 鋒芒畢露,對老家伙們虎視眈眈。
- Go : 2009
- Rust : 2010
- Kotlin : 2011
- Elixir : 2011
- Julia : 2012
- TypeScript : 2012
- Swift : 2014
新生代只是它們想挑戰中生代的地位,搶班奪權,希望渺茫。
主要有這么幾個原因:
1. 編程范型沒有變化
還是老三樣:面向過程,面向對象, 函數式。
在馮諾依曼架構下,恐怕也不會出現什么新的范型了吧。
現在TIOBE排行前十的中生代語言完美涵蓋了這些范型,例如Java,剛誕生的時候支持面向對象,但是后來補上了函數式這一課。
像Python、JavaScript一開始就支持面向對象和函數式編程。
2. 開發領域
開發領域有桌面開發、Web開發、系統級軟件開發、后端開發,數據分析,人工智能等。
中生代的編程語言不但這些領域看得死死的,還互相擴展,侵入對方的領地。
其中最典型的就是JavaScript這個屌絲的逆襲,一開始不過是寄居在瀏覽器中的一個小語言,后來通過V8, Node.js竟然進入了后端,還用Electron蠶食桌面開發!
Python也是,本來用它寫點兒小工具,開發點兒小網站,后來竟然傍上了人工智能這個大款,從此發達了。
3. 生態系統
Java , Python, JavaScript,C , C#等經過這么些年的發展,哪個不是積累了海量的類庫,哪一個沒有龐大的生態系統?想動它們,沒有一場革命是絕對不行的。
新語言即使很好,但是看看那么多現有的代碼,誰敢輕易切換?
4. 時代的紅利
Java遇到了互聯網,Python遇到了大數據和AI, JavaScript遇到了前端開發, 時代的機遇讓它們爆炸式發展。
Go的運氣不錯,遇到了云計算,強勢崛起。其他幾位想要出頭,那是相當難了。
我曾經悲觀地認為:主流的編程語言已經都被發明出來了!
以后新出現的語言都是改進,改良,沒法鬧革命翻身了。
舉個不恰當的比喻, C, Java, Python, JavaScript,C# , C++, PHP 就像現在的西方七國集團,牢牢占據著最大的市場,然后只要有新人冒出來,就會受到無情的打擊。就像現在中國想技術突破,被美國和西方不擇手段地打壓一樣。
圖片
但是也并不絕對,就像中國一定要向上突破一樣,我看到在系統編程領域,也有一個新星冉冉升起:Rust。
圖片
Rust雖然沒有發明新東西,但是卻融合了多種語言的特性和多種編程泛型,它不但包含了上面說的三大編程范式,還集結了泛型、底層內存管理、所有權等特性,可以說是一個集大成者(這也恰恰是它學習曲線陡峭的原因)。
Rust是一門同時追求安全、并發和性能的現代系統級編程語言,有望挑戰C語言的地位。
當然,編程語言少,對程序員來說是好事,程序員可以少學一點東西,少掉幾根頭發。
最后再聊聊人工智能時代的編程問題,我在《天才程序員》中看到一個有趣的比喻,說普通的編程就像循規蹈矩的機械裝置,機器會一板一眼地去執行,程序員在邏輯的宮殿中穿行,沿著頭腦中的路線行走,一切都有章可循。
但是訓練神經網絡就完全不同,程序員和程序之間更像園丁與田園的關系。
圖片
豆角為什么突然不長了?西紅柿為什么不好吃?園丁可能會換換土壤,可能會調整一下作物之間的距離,也有可能把豆角轉移到陽光充足的地方,或者少用些肥料?成功了!它們又開始茁壯成長了!
園藝技能的長進有賴于數之不盡的實驗和來之不易的經驗。很多新手園丁栽種的第一批作物要么長不好,要么就死了。但最終,經過不斷試錯(和借鑒同行的經驗),園丁們會積累更多知識,形成難以言傳的直覺,比如什么有效,什么無效。此時,如果你帶他們去新的田園,即便那里的土壤和光照條件完全不同,他們也可以很快弄清楚哪些作物更適合在此處栽種。
看到了吧,雖然編程技能必不可少,但是重點變成了收集數據,不斷訓練,不斷調整,然后“祈禱”程序奏效。
不知道這是程序員的幸運呢,還是不幸?
如需轉載,請通過作者微信公眾號coderising獲取授權。