如何理性的評價各種程式設計語言的優劣?

來源:互聯網
上載者:User
我不是想找萬能的銀彈,也不是讓個別phper來引戰的,知乎上雖然有一個類似的問題,PHP、Java、Python、C、C++ 這幾種程式設計語言都各有什麼特點或優點? - C(程式設計語言),但是裡面是賣萌和抖機靈的多,沒有看到一些作為一個初學者真正想知道的問題。

舉個例子,PHP能夠進行WEB開發,也能進行案頭開發,但並沒有那款案頭軟體是用PHP開發的,所以PHP這門語言其實更適合於web開發,這算是對PHP一些評價。都說語言是工具,要在合適的時候使用合適的工具,不瞭解特性又怎麼在合適的時候用呢?但瞭解語言的特性肯定是那些有一定使用經驗的人才有發言權的啊,我問這個問題就是為了從有經驗的人口中瞭解這些特性,學習學習。真的不是故意想挑起語言之爭什麼的。

謝謝各位小夥伴解答啦 ~ > _ < ~

回複內容:

首先這個問題是沒有辦法明確回答的,因為“理性”一詞的定義並不明確,優劣一詞也不明確。我只能說一下自己的觀點。

在這裡先推薦一篇矽谷創業教父Paul Graham的文章Beating the Average,希望大家先讀一下。

正如題主所說的那樣,“PHP能夠進行WEB開發,也能進行案頭開發,但並沒有那款案頭軟體是用PHP開發的,所以PHP這門語言其實更適合於web開發,這算是對PHP一些評價。” 所有的通用程式設計語言(General Purpose Programming Language)都是圖靈等價的,計算能力上沒有任何差別,但是為什麼沒有什麼人喜歡用圖靈機來編案頭、網路或者其他應用?!為什麼大家不人人用彙編?!所以在爭論電腦語言優劣的時候祭出圖靈等價只能是很low方式。但是在計算性上的確所有語言都是等Power的,那麼問題來了,我們通常爭論一個語言比另一個語言更強大的時候我們到底在TMD爭論什嗎?!或者說同一門的新版本比舊版本更強大,或者更明確一些,Java 1.8裡有lambda,那麼它是否比Java 1.7更強大?Java 1.5引入了泛型,那麼它是否比1.4要強大?Python 3.5裡有用async還有await協程,那麼Python 3.5是否比Python 3.4更強大?首先我覺得新版本是更強大的,泛型的引入避免了一些運行時的類型錯誤,lambda讓函數不必顯示地包在對象之中。Python的協程解放了一些對程式流程的控制。然後我也覺得它們沒有讓這語言更強大,因為差不多的特性都能在老的版本上實現,只是比較挫。 但是,但是1.5中引入的泛型你是否可以用庫來彌補?顯然好像是不行的。所以特性可以分為能用庫來彌補的跟不能用庫來彌補的,我覺得這是1.5比1.4真正強大了,1.5真是要優於1.4,這一點上應該沒有什麼爭議。但Java 1.8是不是比1.7更優,你可以跟我再爭論一下,並且我不覺得這種爭論有任何結果。

那麼對於語言是否更優,我的定義是語言A的特性不能用語言B的庫來彌補,那麼A語言在這種特性上就是更優,如果B可以用庫彌補A的這種特性那麼A是不是更優可以有爭議。這種爭議我通常會躲開或者擱置。

那麼顯然,C語言應該是比彙編更優的,首先C語言可以定義更多的類型、結構體,這是組合語言庫不能彌補的,其次,C語言有三種控制流程的語句,順序、條件、迴圈(忘記是麥卡錫還是Dijkstra還是霍爾最先提出的了,知道的告訴我一下)而你再厲害的彙編庫也不可能彌補C語言有if for while這些文法上的優勢。

以下純個人觀點:
那麼Java是否比C++更優?Well,Java有自動的記憶體回收,C++也出了Smart Pointer,不同的只是學習成本。在其他一些地方Java也有些特性是C++用庫沒有辦法彌補的。

Java是否比C語言優?大的尺度上好像並沒有,Java的物件導向只是一種抽象問題的思想,而在C語言裡有人一樣也可以物件導向來編程。但是其他有有些方面Java的確更優,比如說數組index out of bound。

Haskell是否比Java更優?答案是肯定的。Haskell裡有的一堆可以讓你少寫成百上千行代碼的特性Java裡都沒。

文中給了一個叫Blub的悖論:
有一個用Blub語言(假想的語言)的程式員,它是一個比Cobol還有組合語言更強大的語言。因為對於彙編那是編譯器要的事。而對於Cobol這個用Blub的程式員不知道Cobol程式員怎麼用Cobol把事情搞定,因為Cobol連XXX特性都沒有,所以這個程式員並不會使用Cobol或者彙編。

只要當這個Blub程式員向下審視其他不如Blub強大的語言時,這種不強大十分明顯,因為這些語言沒有Blub程式員習慣使用的特性。而當它們抬頭看更強大的語言時,他們並不覺得他們在仰望。他們看到的只是一個奇怪的語言(這裡作者應該是指Lisp),並且認為Blub與它是一樣強大的,只是裡面有一堆奇怪的東西。Blub已經夠好了,它他用Blub的方式思考。

悖論到此結束。
這也許就是語言之爭的起源,一般的人只是做著比較單一的工作,只要有一種語言他們熟悉並且走夠好就可以了,同時,他們已經習慣了這種語言的思考方式。後者是很可怕的。

(這裡扯點別的,有人問一個中國人:為什麼而學習?這裡的為什麼而跟了一個動詞,我們慣性地會想一個目標,比如為中華崛起而讀書。為往聖繼絕學,為萬世開太平,總是要有一個目標。這裡的為什麼對應英語what ... for,而老外用的是why?所以有的老外會這樣回答這個問題“因為知識本身就是值得學習的”這個老外是歐幾裡得,雖然他是希臘人可能不用英語,但是我只想說自然語言都會限制我們的思考,就更不用說電腦語言了)

比如在一門沒有遞迴的語言中你思考的語言永遠都只是迴圈那幾樣東西,在彙編裡你永遠的只想著如果搞那堆寄存器,應該用什麼指令。所以你應該跳出來,打破你現在熟悉的東西,忘掉它重新開始,看看Haskell、F#、Lisp、Scala、Scheme、Clojure、Ocaml、Erlang,這個世界豐富多彩的。Haskell、F#裡我能舉出好多你在Java、C++、C#裡永遠也沒法用庫彌補的特性。但是這並不代表你就一定要用Haskell與F#,我唯一不希望看到的是你專精了C跟C++語言好多年,然後又去花好多時間去鑽研Go或者Python,因為我覺得它們不會給你帶來新的思想。

最後引用一句Beating the Average中的話:
人人都知道,把你全部的程式全部使用彙編手寫是錯誤的,但是很少有人注意到一個更一般的原則:如果你可以選擇多種語言,若其中大部分語言都是相同的,那麼如果你不用那個強大的就是錯誤。

當然對於這個原則是有例外的。如果你需要寫一個程式來與已有的程式協同工作,那麼新的程式還是用與原來相同的語言比較好。如果你需要寫一個非常簡單的程式比如操作bit,那麼一個抽象能力不怎麼高的語言就夠了,並且這樣還會更快。如果你要寫一個短的,並且寫完就棄用的程式,那麼你就用庫最強大,能幫你快點完成工作的語言。但是對於一般的應用軟體,你一定想用你所知道的最強大(並且效率還不錯)的語言,用任何類似的其他語言都是一個錯誤,比如說組合語言。 以下轉自王小波的文章:打工經曆 。
來源,王小波的書
沉默的大多數小說線上閱讀
本文 打工經曆
希望軟體公司老闆不要學下例的那種。

在美留學時,我打過各種零工。其中有一回,我和上海來的老曹去給家中國餐館裝修房子。這家餐館的老闆是個上海人,尖嘴猴腮,吝嗇得不得了;給人家當了半輩子的大廚,攢了點錢,自己要開店,又有點燒得慌——這副嘴臉實在是難看,用老曹的話來說,是一副赤佬像。上工第一天,他就對我們說:我請你們倆,就是要省錢,否則不如請老美。這工程要按我的意思來幹。要用什麼工具、材料,向我提出來,我去買。別想揩我的油……

以前,我知道美國的科技發達、商業也發達,但我還不知道,美國還是各種手藝人的國家。我們打工的那條街上就有一大窩,什麼電工、管子工、木工等等,還有包攬裝修工程的小包工頭兒;一聽見我們開了工,就都跑來看。先看我們掄大鎚、打釺子,面露微笑,然後就跑到後面去找老闆,說:你請的這兩個寶貝要是在本世紀內能把這餐館裝修完,我輸你一百塊錢。我臉上著實掛不住,真想扔了釺子不幹。但老曹從牙縫裡啐口吐沫說:不理他!這個世紀幹不完,還有下個世紀,反正赤佬要給我們工錢……

俗話說,沒有金剛鑽,別攬磁器活。要是不懂怎麼裝修房子就去攬這個活,那是我們的錯。我雖是不懂,但有一把力氣,幹個小工還是夠格的。人家老曹原是滬東船廠的,是從銅作工提拔起來的工程師,專門裝修船艙的,裝修個餐館還不知道怎麼幹嗎……他總說,現在的當務之急是買工具、租工具,但那赤佬老闆總說,別想揩油。與其被人疑為貪小便宜,還不如悶頭幹活,賺點工錢算了。

等把地面打掉以後,我們在這條街上贏得了一定程度的尊敬。順便說一句,打下來的水泥塊是我一塊塊抱出去,扔到垃圾箱裡,老闆連個手推車都捨不得租。他覺得已經出了人工錢,再租工具就是吃了虧。那些美國的工匠路過時,總來聊聊天,對我們的苦幹精神深表欽佩。但是他們說,活可不是你們倆這種幹法。說實在的,他們都想攬這個裝修工程,只是價錢談不攏。下一步是把舊有的隔斷牆拆了。我覺得這很簡單,揮起大鎚就砸——才砸了一下,就被老闆喝止。他說這會把牆裡的木料砸壞。隔斷牆裡能有什麼木料,不過是些零零碎碎的破爛木頭。但老闆說,要用它來造地板。於是,我們就一根根把這些爛木頭上的釘子起出來。美國人見了問我們在幹什麼,我如實一說,對方捂住肚子往地下一蹲,笑得就地打起滾來。這回連老曹臉上都掛不住了,直怪我太多嘴……

起完了釘子,又買了幾塊新木料,老闆要試試我們的木匠手藝,讓我們先造個門。老曹就用鋸子下起料來:我怎麼看,怎麼覺得這鋸子不像那麼回事兒,鋸起木頭來直拐彎兒。它和我以前見過的鋸子怎麼就那麼不一樣呢。正在幹活,來了一個美國木匠。他笑著問我們原來是幹啥的。我出國前是個大學教師,但這不能說,不能丟學校的臉。老曹的來路更不能說,說了是給滬東船廠丟臉。我說:我們是藝術家。這話不全是扯謊。我出國前就發表過小說,至於老曹,頗擅丹青,作品還參加過上海工人畫展……那老美說:我早就知道你們是藝術家!我暗自得意:我們身上的藝術氣質是如此濃鬱,人家一眼就看出來了。誰知他又補充了一句,工人沒有像你們這麼幹活的!等這老美一走,老曹就扔下了鋸子,破口大罵起來。原來這鋸子的正確用途,是在花園裡鋸鋸樹杈……

我們給赤佬老闆幹了一個多月,也賺了他幾百塊錢的工錢,那個餐館還是不像餐館,也不像是冷庫,而是像個破爛攤。轉眼間夏去秋來,我們也該回去上學了。那老闆的臉色越來越難看,天天催我們加班。催也沒有用,手裡拿著手錘鐵棍,拼了命也是幹不出活來的。那條街上的美國工匠也嗅出味來了,全聚在我們門前,一面看我們倆出洋像,一面等赤佬老闆把工程交給他們。在這種情況下,連老曹也繃不住,終於和我一起辭活不幹了。於是,這工程就像熟透的桃子一樣,掉進了美國師傅的懷裡。本來,辭了活以後就該走掉。但老曹還要看看美國人是怎麼幹活的。他說,這個工程幹得窩囊,但不是他的過錯,全怪那赤佬滿肚子餿主意。要是由著他的意思來幹,就能讓洋鬼子看看中國人是怎麼幹活的……

美國包工頭接下了這個工程,馬上把它分了出去,分給電工、木工、管子工,今天上午是你的,下午是他的,後天是我的,等等。幾個電話打出去,就有人來送工具,滿滿噹噹一卡車。這些工具不要說我,連老曹都沒見過。除了電鋸電刨,居然還有用電瓶的鏟車,可以在室內開動,三下五除二,就把我們留下的破爛從室內推了出去。電工上了電動升降台,在天花板上下電線,底下木工就在裝配地板,手法純熟之極。雖然是用現成的構件,也得承認人家幹活真是太快了。裝好以後電刨子一跑,賊亮;幹完了馬上走人,運走機械,新的工人和機械馬上開進來……轉眼之間,飯館就有個樣兒了……我和老曹看了一會兒,就灰溜溜地走開了。這是因為我們都當過工人,知道怎麼工作才有尊嚴。
現在的年輕人真是,什麼腦子都不動,就想得到可以寫論文層級的知識,真不知道是說你們幼稚好還是居心不良好。在學校就炒功課,出來社會就抄襲,一幫廢材。

想要符合理性評價,那麼科學的評價是一種理性的評價。
要科學的評價,只需要建立可重複性的驗證或者實驗手段就可以了。

以下是一種僅供參考的驗證或者實驗方法的步驟:

1. 選擇一個常見的可程式化解決的問題
2. 選擇候選程式設計語言可使用的語言措施、庫等等範圍
3. 邀請足夠多的中等或以上水平程式員的程式員,在約定的範圍內編寫代碼解決這個問題
4. 升級這個問題或者擴充這個問題的應用範圍

按以上步驟迭代,統計每次迭代時(也就是問題變化時)解決問題的各語言的代碼的變化量。

關於候選編程的問題,應該盡量貼合主流的開發環境需要解決的問題。
---
至於要討論什麼才是語言優劣的標準,那是另外一個問題。The Economy of Programming Languages OpenClassroom
我覺得對於程式設計語言,其實不必過於的理性。首先往往程式設計語言不是我們能夠選擇的,而且就算你可以選擇,但是選擇的餘地其實也並不多。作為一個愛好其實根本不必太理性。我個人其實比較喜歡clojure的,但是沒有實際的應用情境,如果自己搞一些東西,一定會用的,但是這段時間工作很忙碌,也就沒有時間搞了,但是我是發自真心的喜歡這個語言。

此外,我還比較喜歡靈活度比較高的語言,但又不必處理太多的底層細節,比如javascript,python,ruby。討厭那些需要處理無窮細節,規則無比複雜的語言,代表性的有c++。

好的語言應該是這樣的:簡單,可靠,靈活。
特性上應該有:支援函數性也支援物件導向,高度靈活的文法,龐大的類庫,有記憶體回收機制,有異常處理機制,進階的多執行緒模式(比如actor),能用最少的代碼做最多的事情。符合這些的其實只有clojure了。

但是一旦我決定使用clojure來開發我們的應用,就要面對無法招到人得窘境了,這裡是西安,不是西雅圖。我就不喜歡寫代碼,所以我需要用的東西哪個語言有實現,我就用哪個語言,跨語言開發也不難一般我認為,菜鳥支援他是因為不需要學習太多東西,同時老闆支援他是因為手下很多活都需要菜鳥幹,那就是一個爛語言。這就是讀史的重要性。每種程式設計語言的基因基本上決定於剛被設計出來時的用途,雖然後天改造也有影響,但是把魚改造成熊掌無論如何是不如直接找熊要熊掌的。

上個圖吧,稍老了點,侵刪。

我非常贊成鳥哥的話:
或許人性都是如此, 覺得掌握了複雜的東西會比較吊, 然而他們卻忘記了, 還是我剛才的觀點, 語言只是你學習來解決你實際問題, 把你的想法變為實際的工具, 你的成長應該是你在使用它們解決問題的過程中, 解決問題的經驗的成長, 而不是語言的使用技藝的增長.
還有:
PHP的程式員, 需要認真的想好, 你的代碼會怎麼被執行, 你怎麼寫代碼, 最終的執行效率才最高. 而不像其他的語言, 程式員可以把一部分最佳化工作交給編譯器. 實際上,各種語言最根本的區別是思維哲學不同。
php是務實,一切以最簡單的程式碼完成功能為主,好開發,好部署,好更新。
python是極致簡潔,力求用最簡潔的文法高效完成任務。
java是嚴謹,文法要求各種強制類型,強制try catch之類的。
其他語言也各有各自的思維哲學,實際上,學到一定程度後,就會對不符合自己性格的語言越來越排斥,雖然會用,但不會喜歡。
各種語言的應用領域有不同,但新項目開發中具體使用哪種語言,基本上是由總監的喜好,和公司的人手決定的,而並不是什麼更適合。
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.