我心中編程語言的評價標准


最近微博上各路大牛又開始爭論語言問題,引發了我寫水文的沖動,遂寫篇文章談談我的看法。

首先我的觀點是,對編程語言客觀合理的評價不該是個A比B好還是A比B差的問題,我認為編程語言應該從以下幾個特性去評價:

緊湊性

所謂緊湊,就是有限的語法和運行時機制所容納的特性,緊湊性是一種優點。在這一點上做得最NB的是Lisp,它的語法定義極度簡單,以下幾行就是Lisp的全部語法了:

s_expression = atomic_symbol \
              / "(" s_expression "."s_expression ")" \
              / list 
list = "(" s_expression < s_expression > ")"
atomic_symbol = letter atom_part
atom_part = empty / letter atom_part / number atom_part
letter = "a" / "b" / " ..." / "z"
number = "1" / "2" / " ..." / "9"
empty = " "

這種程度堪稱語法緊湊性的極致了。

又比如說JavaScript,很多不明真相的群眾認為它的語言特性飄忽不定,非常難以把握,但是實際上,JavaScript的運行時在緊湊性方面做得非常到位,比如實際上,函數參數、變量、函數聲明、with這些特性,其實在運行時都是通過scope chain這一底層機制實現的。

反過來說,緊湊性比較糟糕的要數C++了,C++的海量語法,以及那些基本沒人用的nb關鍵字對於每一個C++學習者都是很大的負擔。

一些語言雖然大量的提供了特性,但是在沒有保證語言的緊湊性的前提下添加功能完全是災難性的,沒錯我就是在吐槽Ruby——這一句是個純粹的個人觀點。

抽象能力

抽象能力應該是現階段語言進化的第一優先級,抽象手段無非函數式、過程式和面向對象三種,看計算機語言的流行歷史,不難看出 函數式=>過程式=>面向對象=>函數式回歸 這樣的規律。Lisp一直在學術界評價頗高,但是其商業應用一直低迷,其抽象能力比較弱一直是個重要的原因。

C++之所以能夠從C語言手里啃下半壁江山興起,就是因為C++盯准了抽象能力這一項。而Java則是提供了跟C++差不多級別的抽象能力之后,又砍掉不少功能,以提高緊湊性。

近年來隨着JavaScript的函數式編程被提起,F#的出現和C#的語言進化,函數式回歸成了新主題。於是有了C#這樣的全能選手,然而實際上抽象能力與緊湊型是互相矛盾的,C#再怎么努力,多種不同的抽象范式之間的靈活組合還是會給學習者帶來很大麻煩。

動態性

所謂動態性就是運行時能力的大小,對於編程語言來說,這個特性並非一個純粹的褒義詞。

動態性意味着更加靈活,意味着開發者有更多的"魔術"可以玩。而開發者會天生對動態語言有親昵地感覺,這是人的本性。

但是凡動態語言,JavaScript、Python、Ruby這些,實際上已經意味着與地層開發無緣了。

同時靈活意味着少約束,少約束意味着大規模程序很難被編寫出來。到目前為止,很少聽到過超過10萬行級別的JS語言項目,這樣的現象多少與JS的動態性有關。

反過來看,動態性較低的C語言現在成了驅動和OS內核開發的不二之選,因為好像驅動里面根本用不着那些看上去NB的抽象——即使你用了C++,也是像C一樣用而已。

語法噪音

語言除了功能和設計,“長相”也是很重要的。這里要提到一個語法噪音的概念,比如JS里面的function,相比lambda表達式,這個噪音就多了

arr.some(function(x){ return x<2});

而C#里面可以這么寫:

arr.some(x=>x<2);

這里面,function關鍵字,return關鍵字,各種符號,其實實際意義都不大,因為JS語法設計,而必須要加上,這就是一種噪音。

有趣的是,向python這樣的語言對於“去噪”的追求達到了極致,甚至不惜用空白做標志干掉花括號,這個做法導致了其毀譽參半,喜歡的人特別喜歡,不喜歡的人特別討厭。

結語

編程語言是程序員每天都在用的工具,討論語言是很自然的事情,但是,討論誰更優雅,那個語言最好是毫無意義的,理解各種語言設計時的考量,充分理解他們的優缺點才對我們有幫助,才能讓我們更好地選擇語言。最后用我在知乎某問題的答案來結束這篇文章:你在家用臉盆喝水么?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM