標籤:

為什麼目前流行的編程語言都是很早以前就發明的?

剛剛看了《Hackers Painters》覺得裡面講lisp語言未來會流行的那部分理論很有意思,也很有說服力。

下面講講我自己的想法:

機器性能本身是貶值的,按照摩爾定律,平均過去大約是每過18個月就能以原先一半的價錢買到相同性能的CPU,相對於這種貶值速度,人力資源的價值可以認為是固定不變的,也就是說人力資源相比於機器性能的價值越來越高。

所以人們在開發軟體的過程中,相比於過去,越來越不重視代碼的優化,具體可以參見Andy and Bill』s Law。

但是按這種邏輯,編程語言也會越來越接近自然語言,學習門檻越來越低,但是運行性能也越來越低。可是目前流行的編程語言都是很早以前發明的,都是設計給那時候的計算機運行的,為什麼它們沒有被現在發明的語言所淘汰?

各種熱門語言的發明時間(排名不分先後,也未包含所有熱門編程語言):

Python 1991

Java 1995

Ruby 1990

PHP 1994

Javascript 1995

R 1993

而且奇怪的是這幾種語言都集中在1990~1995之間。


題主列出的語言中:

  • Python 1991

  • Java 1995

  • Ruby 1990

  • PHP 1994

  • Javascript 1995

  • R 1993

許多都是針對 C/C++ 難學、不容易寫得正確、不夠動態等問題而創造出來的。這些語言的運行時卻多數由 C/C++ 實現的。所以我覺得這些語言在 C++ (1983) 年後出現是很正常的。而當時的需求也是大量快速實現應用層面的軟體(互聯網也促進計算機的應用更廣),那麼降低門檻能使更多人參與開發,降低難度也提高了開發效率,高動態性可適因更頻密的需求變化,相對地降低性能是可接受的。

可是目前流行的編程語言都是很早以前發明的,都是設計給那時候的計算機運行的,為什麼它們沒有被現在發明的語言所淘汰?

計算機架構並沒有太大幅度的改變。以前慢的,現在也慢;以前快的,現在也快。但一些變化也是有的,例如多核機器需要並行的語言特性,SIMD 指令集可能更適合一些 DSL 等。流行的語言會被改進,適應新的需求。


《H P》關於語言流行的理論只是作者淺白的臆測。看語言流行推薦你看 Patterns of Software: Tales from the Software Community by Richard P. Gabriel a€」 Reviews, Discussion, Bookclubs, Lists


對人類來說,學習編程語言遠比學習自然語言容易。培訓一門編程語言只需要幾個月,學一門外語沒幾年不能用。而且不要忘了,自然語言是更古老的人類發明的,按照題主的理論就比古老的編程語言更應該淘汰。

所以認為編程語言必然向自然語言靠攏是完全沒有根據的。

大約在上世紀90年代開始,編程語言的設計就不再明顯受到計算機性能的制約,此後的編程語言並未針對計算機性能進行大的妥協,因而繼續提升計算機性能並不會從根本上改變編程語言的設計思路。

另外,你如果覺得一個語言有缺陷,首先想的應該是改進或者新增你需要的元素,而不是造一門新語言,畢竟造新語言涉及到,舊的現有的語言文獻無法被捨棄的問題。

一門編程語言,只要它存在著大量的可用,可復用,可移植的代碼,基本上就不可能消亡。因為,舉個例子,你總不可能每寫個網路應用就自己寫一遍tcpip協議棧吧?

結論:新編程語言想要流行的門檻不是越來越低而是越來越高了,因為現存的流行語言存在數不清的框架,庫,復用共享代碼,這是無價的資源。新語言不把大多數庫跟編程框架做好,要想談淘汰舊語言簡直是個笑話。


發明得早的語言,並不等於為當時的機器設計的語言。發明得早的語言,現在還活躍的並不是它的最初版,而是持續改進後的成果。事實上,過去編程語言流行有過三次浪潮,驅動力各不相同。

第一波是50~70年代,這一波是數學驅動的。

最早的編程語言都是沖著公式翻譯去的,1957 年的 FORTRAN 全稱是 IBM Mathematical Formula Translating System,它要為當時的機器生成代碼,但高級語言設計目標之一就是要機器無關嘛,所以直到 90 年代,在數值計算領域 FORTRAN 還是占統治地位,90年代末期這塊領域才逐漸 C/C++ 遷移了。

你說的 LISP 是 1958 年搞的,也非常高級。John McCarthy 當時搞人工智慧研究,需要表達大量關於世界的事實,他發現列表非常合適,為了直接書寫列表就搞出來這個 LISP。當時,數值計算性能比 FORTRAN 慢 10~100 倍,不過這幫搞人工智慧的還是用得很開心。

當然這一波里也有異類,比如 1959 年開搞的 COBOL 就是專門為商用軟體而非科學計算設計的,高級到不行,只有數字和字元串兩種數據類型,語法接近英語,到90年代後期,差不多2000億行代碼支撐著世界80%的商業,直到主機衰落,才逐漸失去活力,現在還有大量遺留系統在用它。

這一波出來的程序大多有一個特點,就是學術范,有很多超越時代的思想和特性,因而生命力極強。但是時至今日,它們的優點也被吸收到性能更好的、表達能力更強、學習曲線更短的新生代語言里,所以逐漸失去影響力也是必然的。

第二波則是70~90年代,這一波是系統驅動的。

1970 PASCAL,1972 C,1983 C++ 。這些語言都非常注重性能,雖然也是高級語言,但是沒有什麼不容易映射到機器上的東西。這些語言至今仍舊非常活躍,比如 C 和 C++ 在 TIOBE 基本還在前三。

第三波則是90年代到2012左右,這一波是互聯網驅動的。

1991 Python,1993 Ruby,1994 PHP,1995 Java,1995 JavaScript。沒有互聯網提供的 web 伺服器端開發機會,大約前3個都火不起來,最後那個 JavaScript 完全是互聯網的衍生物。服務端開發一般對計算性能不敏感,I/O什麼的才是大頭,而瀏覽器這頭一般計算量也有限,所以什麼語言都有可能火起來。

你特意把 C/C++ 拿掉是不對滴。第二波和第三波的語言現在都挺活躍的。

現在有點要出第四波的意思了,這一波是廠商驅動的,我的平台聽我的。

Apple 搞 Swift,Google 搞 Go,IBM 貌似下注 Swift 了,希望不要出一個 Worm IDE,微軟除了互聯網那一波搞出來的 C#/F# 又搞了 TypeScript,FaceBook React/JSX 那個其實不能算,不知道啥時候出個正而八經的語言不?

你說 Swift、Go 和 TypeScript 不流行,也是不對滴。


先問是不是,再問為什麼。總的我覺得題主的標題ok,但在一些細節上有可探討之處。首先各人關於「流行」定義可能有所不同,這裡我拿被引用比較多的TIOBE排名來說事,可見除了題主提到的幾個語言之外,還有其它一些:C(1972)、C++(1983)、Objective-C(1984)、Perl(1987)、C#(2000)、http://VB.net(2001,VB是1991,Basic是1964)。所以說,一方面並非都在題主說的1990~1995的區間,另外相對於C/C++那些90後也算不上「很久以前」。

語言要流行有很多因素,說的俗一點所謂「天時地利人和」。下面這張Babel Tower圖是1961年發布的,其中今天大家知道的有幾個?那個年代過於久遠而計算機發展又處於嬰幼兒期,Lisp/Basic/COBOL/APL這些在今天看來或小眾或過時的語言,實際上算是那個時代的倖存者了。這和辦企業倒是有類似之處:打個不恰當的比方,中國改革開放之初,各種小私有企業個體戶,在當時都算牛X,但從80年代初發家後面能夠一路壯大至今傲視群雄的又有幾個?

1980年代在西方開始了計算機的普及,1990年代開始全球互聯網浪潮。當時湧現出來的一批編程語言得以乘風而起。C/C++當時在兼顧性能與開發效率上是一個好的平衡,Java以a better C++出道作為「企業級」語言壯大至今,Perl在Unix管理上比C和shell更強並在互聯網的CGI時代火了一把,而當2000年那波熱潮退卻,在對Perl的一片罵聲中,此前默默無聞的Python/Ruby/PHP逐漸成長起來,R和Python又是趕上了近幾年的大數據、AI熱。

可以說當今流行的語言身上有幾個共通點:趕上行業格局變化的時候,針對了新熱點的需求,又經歷了較長一段時間的積累與自我完善。好比國內90年代初深化改革開放,開始搞房地產互聯網通訊這些,今天的萬科恆大或者BAT這幾個,都在是那個時代誕生的,又像是華為這種,除了自身過硬之外,有點類似C#是有後台支持的。流行的語言還要親民,要大眾化,一味搞高精尖的奇奇怪怪的比如Lisp/Haskell流行不起來。另外,在行業格局沒有劇烈變革的時候,現有的熱門語言就能形成壟斷,它們本身有好的群眾基礎,加上它們也可以小步吸收其它語言的優良特性(好像大企業兼并小企業或者「借鑒」其它企業的業務功能)。那麼在這種現實下,你今天一個人(甚至一群人)再牛難道能馬上搞出下一個BAT來?


為什麼中國論壇經常出現語言爭吵。就是很多人以為語言是一個可以獨立存在於使用場景的東西。事實上,你從語言發展史來看,語言的興衰核心還是使用場景的問題。

為什麼需要新的語言?一個新的語言怎麼能才能流行?往往是它能夠符合某個使用場景的需求。可以說,我們到今天為止,沒有產生太多值得用一個新語言去做的場景。所以,沒必要去開發一個新的語言。

實際上Objective-C雖然是一個1984年就有的老語言,但是在幾年前,iOS剛興起的時候,蘋果沒有開發一個新的語言來做iOS開發,就直接沿用了Mac社區開發者已經很習慣的Objective-C,出了啥問題么,其實沒有。雖然很多從Mac圈子外來的程序員有各種各樣的不適應,但是還是很容易的學會了Objective-C,也開發出了無數的App。當然最近幾年蘋果開發了新的Swfit語言。


因為一門新的語言,不慢慢修個十幾二十年bug,基本不能用。想想90年代的C++。


一門語言的流行是需要多方面的因素的:

1 語言本身設計滿足當時的需求

2 工具 (IDE / Editor)支持完善

3 工程中使用多,市場大

雖然對於1來說,一般新興的語言因為吸取其他語言的經驗積累,反而通常更少缺點;但是其中2和3常常需要很久的積累,也並不是語言設計者所能控制的。工具的發展本身就比較緩慢,比如以前想要給一個流行的IDE加入一門語言的支持是很難的事情,現在隨著各大主流Editor的插件模型 / API 漸漸成熟,做工具的速度比以前要快很多。一些平台的出現也推動了某些語言的發展。比如node的出現使得JavaScript及其衍生語言變成天生跨平台,滿足了很大的一部分需求。


這跟「建國以後再也沒誕生過百歲老人」有什麼區別?


您使用過 ES2015 2017, C++ 11/14/17, Java 8.0,PHP 7么?

你會發現它們現在還在進化喵~

至於 Python 3/2…


因為語言一直在更新啊,目前編程最常用的javascript是2015年發明的es6


中文還是中文但不再是兩千年前的中文了。java還是那個java 但也不再是從前的那個java了。


因為造輪子是需要時間的,沒輪子的語言,設計再好也沒啥卵用。

比如rust,2010年立項,比起題主列的一排算是萌新了,現在六年了,依然是萌新


房子造了這麼多年怎麼還在用磚塊,怎麼還要打地基


為什麼現在流行的計算機,都是很久以前發明的


讓我們來談談golang


好的架構是進化來的,不是設計來的

需要時間

編程語言同樣


為什麼沒有按你的邏輯發展?因為你的邏輯不對啊!計算能力是上升了,可是處理的問題也更加複雜了,很多以前解決不了的問題,硬體提升了現在可以解決了,難道把好不容易提升起來的硬體性能耗費在低效率的編程語言上?andy bill"s law 不是僅僅因為代碼優化變差啊,還因為軟體處理了更多更難的問題。很多情形對性能的要求是永遠存在的。


開玩笑了。。。從.net 1.0到4.0,從Windows form 到WPF,data binding,mvvm,編程語言兩年一小變,三年一大變,加上大型程序開發設計思路,20多年前的程序猿放到現在一臉懵圈,代碼看得似懂非懂,連工作都找不到。現在流行的C# 20年前有嗎?ASP dot NET(沒法加點,知乎自動把這個變成鏈接)20年前有嗎。。你編個小程序或許用20年前的東西就夠了。你搞大型軟體開發,結果就是gg。說編程語言一樣的看來還沒有進入這個行業或相關行業。


因為一門語言流行起來,需要時間。z?z


推薦閱讀:

如果計算機是由中國人發明的,那麼編程時寫代碼會是全中文嗎?
有哪些講編程範式的好書或好文?
Lua 的 table 索引默認從 1 開始,這樣做有什麼好處?
intel x86系列CPU既然是strong order的,不會出現loadload亂序,為什麼還需要lfence指令?
說說你使用Elixir/phoenix的實戰項目心得,以及對該語言/框架的前景的看法?

TAG:編程語言 |