1. 程式人生 > >世界上最好的程式語言(沒有絕對)

世界上最好的程式語言(沒有絕對)

轉載地址:http://blog.csdn.net/i10630226/article/details/41460383

談到這個話題,一定會有兩種人跳出來。 
一種人說,PHP 是世界上最好的程式語言;另一種人說,程式語言都大同小異,掌握了思想,什麼都簡單了。

首先我認為所有切實存在,功能重疊的事物,都是可以比較優劣的,有時不說出真相,只是真相太殘酷。『優秀』並非是主觀的,而是客觀存在的,世界上存在著被廣泛認同的『優秀』。否則,作家,設計師,設計程式語言的科學家,應該以什麼為目標來工作呢?

那麼什麼又是程式設計的思想呢?是迴圈,回撥,面向物件這些麼?但似乎並非每個程式語言都有這些元素。我在知乎『優秀的程式設計師應該掌握多少門程式語言』中列舉了幾種我瞭解的,各自具有代表性的程式語言:

    • C, 使用原始的記憶體管理的系統程式設計
    • Java, 工業級的面向物件的,靜態型別的虛擬機器語言
    • Python, 指令碼語言,動態型別的虛擬機器語言
    • Javascript, 基於事件回撥的函數語言程式設計
    • HTML/CSS, 宣告式的語言
    • Golang, 併發程式設計

可以看到,它們風格迥異,使用的領域似乎完全沒有重疊。

非要找共性的話,大概是它們都具有『抽象』的能力,描述『演算法』的能力,這也是有些人口中的『思想』,但我不認同。 
抽象是為了找到解決問題的方法,而程式語言是為了將解決問題的過程(演算法)表達出來。 
知道如何解決問題,不代表就能夠用程式語言表達出來;掌握程式語言,也不代表知道如何解決問題。

我們學習一門程式語言本身的時間並不多,更多的時間在學習它的函式庫,以及特定程式設計環境下的限制。 
例如學習 C 語言,我們需要知道計算機如何管理記憶體,如何實現函式呼叫,還要學習如何通過標準庫進行輸入輸出,而 C 語言本身的語法,完全可以用一個小時描述清楚。

所以,我們拋開這一切,去尋找世界上最好的程式語言呢。但結果是不存在,因為現在流行的程式語言設計者目光都太短淺。 
沒錯,優秀的不一定是用的人最多的,不一定應用得最廣泛,所以程式語言的設計者需要折中,拿出不那麼優秀的設計作為最終方案。

比如 php 之所以流行,是因為支援 PHP 的虛擬主機最便宜。 
比如 C 之所以流行,只是因為有太多專案一開始是用 C 寫的。 
比如 

Python 之所以流行,只是因為庫足夠多。 
比如 JavaScript 之所以流行,因為在瀏覽器裡這是唯一選擇。

他們都不是因為語言本身被設計得有多麼優秀而流行的。

我認為世界上最好的程式語言需要有這樣的特徵:

    • 核心足夠小
    • 可以擴充套件語法
    • 圍繞一種資料結構展開
    • 優秀的抽象能力
    • 可以被編譯成原生代碼

世界上最好的程式語言應當是全能的,否則如何和其他程式語言做比較呢?要做到這一點,就要保證這個語言的核心部分是最小的,不偏向於任何一個領域,也減少學習成本。

這方面的正面例子有 Lisp, Lisp 中的一切都是列表,核心部分僅包括不到十個基本運算子。從這個角度來看,你根本不知道 Lisp 是被設計用於什麼領域的——這是世界上最好的程式語言所必須的要素。

但是 Lisp 沒有火起來,因為有個笑話說的是一個 Lisp 程式末尾要有整整一頁的括號。

所以世界上最好的程式語言需要能夠靈活地擴充套件語法,這個概念通常被稱為超程式設計,例如 Ruby 就號稱支援超程式設計,雖然我沒有體驗過。 
除了擴充套件語法之外,最好還要能夠改變程式在編譯時的行為,這會加強超程式設計的能力,也會對提升效能有一定幫助。 
比如 PHP 和 python 都支援用 C 編寫擴充套件,如果這種語言支援用自己本身來寫擴充套件,並且能夠干預編譯器的行為,那麼這種改造會讓它適合幾乎所有領域的程式設計。雖然干預編譯器的行為是很危險的行為,只有少數人會編寫這種擴充套件,但是這總要比設計一門新的領域特定的語言要容易。

可以擴充套件語法,這是保證世界上最好的程式語言能夠快速適應各種特定領域程式設計的重要條件。

世界上最好的程式語言應該內建一種資料結構,能夠方便地在程式內,甚至包括程式外進行資料交換,讓整個語言圍繞著這種核心的資料結構展開,具有一種『一致性』的美感。 
這方面正面的例子是 Lisp 和 javascript, 但 Javascript 做得還不夠好,型別系統中有很多陷阱。

世界上最好的程式語言還應該有優秀的抽象能力,比如 C 的抽象能力就不夠,組織大型專案會非常麻煩。Lisp 的抽象手段又太單一,Java 和 C++ 的特徵又過於複雜。

『可以被編譯成原生代碼』這才是最具有挑戰性的一個特徵,前面我提了很多變態的需求,它們都需要在可以被編譯成原生代碼的條件下實現。可以被編譯成原生代碼,表示這種語言不需要虛擬機器,可以自行提供各種功能,效能上也有更多的優化空間。

在發表這篇日誌之前,又看了一遍王垠寫的『如何掌握程式語言』,頓時覺得自己的日誌似乎沒必要發了,但是既然寫了,還是發出來好了。

如何掌握程式語言:https://news.cnblogs.com/n/573342/

優秀的程式設計師應該掌握幾種語言?https://www.zhihu.com/question/22339358#answer-6300033

好的程式設計師應該掌握幾門語言?http://blog.csdn.net/candy1232009/article/details/8049611