1. 程式人生 > >30種程式語言的比較選擇問題

30種程式語言的比較選擇問題

本文涉及到的程式語言:C、C++、Java、C#、Prolog、VB、Scala、Clojure、Haskell、Ada、Python、Ruby、Pascal(Delphi)、Fortran、Lisp、matlab、Perl、Erlang、Boo、Tcl、Bash、C shell、Objective-C、PHP、PL-SQL、Transact-SQL、ASP、JSP、Lua、smalltalk、R、D,golang,rust

涉及到的工具:sed、awk、grep

我們現在學一門語言,大部分是要用到了才學(基本上是中國的公司用什麼我們學什麼),基於興趣的不多。

比如,大頭肯定是C++和java,因為這個最容易混飯吃。最近多玩用了Erlang,還有不少公司跟風上了Erlang,讓這個沉默了好久的語言忽然被明星了。

大公司一般除了C++外,都會招Java,事實上,網際網路公司,Java佔了半壁江山(當然,沒選java架構的除外,有不少.net族的)。所以,生活在貧困線上的廣大中國程式猿很少有人會去看看諸如scala之類的玩意。不過作為膠水,python、perl還是有一定的使用者量的。隨著網際網路迭代速度的加快,很多公司甚至用python直接寫大吞吐的後臺,騰訊的python情結就比較重。而隨著網路安全重要性的提高,大部分的網路安全從業者選擇了python作為攻擊式的語言,因為快又方便。要不很難應對變化更快的poc。而隨著開源軟體的興起,storm,kafka等也使用了小眾的clojure,scala等。但是我們看到在最核心的nginx,ats,lvs等基礎架構,還是c一支獨大。最多有在之上的lua外掛系統(lua真是個好伴侶)

似乎,我們生活中只有這麼幾種語言。。。

貌似,遇到一個問題,我們該選擇什麼語言呢?雖然每個語言本質上都是圖靈完備的,但是能用prolog寫出來的東西,如果用別的語言寫,會無比痛苦。這就是不同語言存在的原因:不同的問題,不同思考方式(程式設計正規化)。

  • 解決問題case:已知大量事實,和事實之間的約束,要求挖掘關係。
果斷用prolog族語言。

例如,漢諾塔、地圖著色、數獨問題、八皇后問題等這種考驗智商,並且需要從已知規則中發現模式的問題。擁有一大堆已知案例的應用(例如大部分的人工智慧情況)

除非你是研究者,程式設計師一般是遇不到這種問題的。當然頂級的程式設計師也確實得具備解決這些問題的能力。但是他們就算解決也是用c解決的。這屬於叫好不叫座的科研型語言。

  • 應用程式case:從小到超大型應用程式,非完全網際網路應用

這也是大部分軟體公司遇到的情況。一般有幾種沒辦法分出高下的解決方案:C++,Java,C#,VB。當然,這裡面可以有CLR和JVM的不同衍生。例如,理論上,你也可以用scala來代替(不過估計大型公司不會冒這個險)。還是在理論上,你也可以用函數語言程式設計的ClojureHaskell來做(估計沒人會那麼傻)。還是在理論上,也可以用Ada這種強悍的通用語言,但估計沒人願意接受比C++還複雜的程式語言。理論上(基本只能在理論上),不嫌棄的話smalltalk也行。還是在理論上,python、ruby等配合一定的圖形介面庫也可以勝任(但專案大到一定的程度是,你會欲哭無淚)。

但是,我另起一行。有個語言:D語言。我個人不認為不可以列入首選名單。但是貌似知名度不行啊。。。。企業支援少啊。。。。。確實是門優秀的語言。C++太尾大不掉,需要一種語言,讓C++成為純粹的C++。

最近谷歌強勢的推出了golang,背景是後臺程式設計師C++寫的好的太缺,python寫的後臺實在是效率不行。於是一個在這之間的,注重工程管理的,並且是全靜態編譯的golang誕生了,你會發現其擁有C++匹配的效率,也擁有python般豐富的程式設計庫。其go和channel機制著實讓人著迷,一出來就吸引了大量的後臺開發人員,有的公司甚至後臺全面轉向go。但是其之前版本的記憶體回收機制比較爛,所以也有無數坑。現在的golang已經基本解決了這些問題,編譯器也用golang重新實現了。可以說已經產品化了。

與golang競爭搶這個市場的還有rust,這是一個為並行而生,意在取代c++的程式語言。與golang的定位是相同的,但是目的是不同的。rust複雜,很複雜,上手難,但是一旦你掌握,這將是一個很強大的武器。已經有公司放棄golang轉向rust的。但是這個語言的致命缺陷就是複雜,我們已經有一個複雜的C++了,他啥都能幹,還要一個rust做什麼?當然,我不能把rust拍死,畢竟這門語言的牛逼程度時比較逼近C++的。不過我高度懷疑其會較好不叫座。

稍小一點規模的,無法接受面向物件的程式設計師,有不少用C的。雖然OOP程式設計師看他們像是不開化的人,但是他們有他們的哲學(我從嵌入式開發過來,相當長時間內也擺脫不了C,總本能的排斥OOP),但是如果讀者是一個nginx或者其他的c底層基礎設施絕對會對oop嗤之以鼻,核心的程式設計正規化已經給c下了一個什麼叫對什麼叫錯的定義了。由於核心作為標杆,大家竟然同步的統一了程式設計風格。不用商量。nginx給那些歧視c的人上了生動的一課,現在哪一個網際網路公司能離開nginx?

  • 解決問題case:程式規模不是很大的偏數學問題

曾經很多人用Pascal(包括擴充套件的Delphi),曾經很多人用Fortran,但是都明顯在退步。大型通用語言(C++、Java、C#)表明了他們在各種環境的適應能力。lisp系列也在一些問題上展現出古老的魅力。(但這個語言遠沒有《黑客與畫家》的作者給我們描述的那樣神奇,個人認為。不過我的C++風格思想佔了主導,可能沒辦法公正的評價lisp,但是據我的使用lisp經驗,在大部分情況下,我最後還是放棄了它。因為大部分情況下我總能找到用C++(或其他OOP語言)更好的原因)

另外,讀研的一般都用過matlab。這個工具,兩個字:強大!不過僅指科學計算方面。脫離了這個方面,就得考慮合不合適了,畢竟固定的矩陣思維不是啥情況都有效的。我用matlab最多的是神經網路,圖片和訊號處理。毫不誇張的說,matlab活脫脫一個photoshop啊。。。(當然,你得會用。。。)不過matlab的神經網路確實不行,做的太差了,小規模的網路可以,3層不用BP的F網,幾十個就掛掉了。有這個需求的用ANN吧。(還是C++,偷笑)

  • 特殊應用case:需要大量處理字串的應用

首選利器是Perl,不過如果你習慣了sed、awk、grep,也能很方便的完成相同的功能,但perl是吸收三家所長做的。

其次是C++,別拍我。諸位用過regex嗎?就是boost裡的那個,最近被併入C++11啦。有了正則表示式的C++,處理字元,無敵了很多哇。當然,Java程式設計師別拍我,我知道這種庫一個大型的通用語言都會有。我提C++,一般順帶著不否定Java和C#能以相似的代價完成相同的功能。

  • 特殊應用case:需要一個膠水,粘結不同語言寫出來的程式

首選是python。倆字:精簡(呀,這麼說一個強大的語言有點太輕浮了,但比起ruby,確實簡單吶。。。)(另外Boo在.net是可以用來取代python)

其次是ruby。倆字:複雜

畢竟,沒有rails,ruby根本火不起來。事實證明,python的哲學很對。當然兩種語言有很多細節的不同,甚至在程式設計正規化上不同(真想不明白白ruby支援多種正規化怎麼可能是個優點?市場證明了python的純粹)

還有一種程式設計思路就是shell。因為linux的一系列命令本身就是一系列可以完成小型功能的程式,你可以在任何語言中直接呼叫系統命令完成想要的操作,這是程式碼複用的一種方式,而且複用程度相當高。如果大部分核心演算法都可以用現有的命令,那麼shell就是你程式設計的最佳選擇。不過bash shell的語法比較奇怪,很容易寫出讓人看不懂的東西,初學者看起來更是天書,所以,直接用來寫大型程式還是免了。。。

  • 特殊應用case:自動化測試
不用問了,肯定是tcl了。由於這個特殊應用,所以個人使用者基本用不到,大部分是嵌入式公司。華為、數通、邁普等。。。

shell也可以比較好的完成這個工作。不過由於通用語言的強勢崛起,尤其是python,已經被越來越多的用到專業領域。通用向專業滲透在晶片上就是如此,在程式語言上這個趨勢也挺明顯的。

  • 特殊應用case:系統底層

這個肯定是C了。作業系統,驅動,底層軟體,大部分都是C寫的,呼叫API,如果不用微軟的Activex之類的技術,還是得老老實實用C API的。C寫的程式碼,用si看,真的很舒服。而且c寫的好,根本不用文件。別人我說c++啥的也可以不要,c的程式碼直接追蹤,就算你有百萬行,除非你用了一堆回撥,否則追起來那簡直是輕鬆。查邏輯問題也是很容易,程式碼冗餘大有的時候是缺點(在軟體工程看來),但是實際的工程使用時,你會發現他們其實也是不小的優點。尤其是你的上級的需求經常變化,你可以把c用處指令碼的感覺。

  • 特殊應用case:系統管理
這個系統管理,一般指linux的。首選肯定是各種shell啦:Bash、C shell
  • 特殊情況case:蘋果平臺
我們沒得選。。。。objective-C和swift最近swift開源了,java因為版權問題也鬧起來了。swift會不會在其他領域大展身手還說不準,畢竟又是一個通用的語言。但是其餘golang,rust,c++競爭,市場基本已經沒有空間留下了。
  • 特殊領域:嵌入式
 大部分都是C了。不過andriod平臺和蘋果平臺就得聽話了。gmszone 網友建議把Ada也放在這裡,我不否定Ada在嵌入式領域的廣闊未來和實實在在的實力。但C主導了嵌入式這麼久,程式設計師基本沒辦法接受別的思維了。比如ARM,三年前我用的Xscale,我實在不願意想象放棄C。嵌入式的玩意對錯有時候根本沒辦法說,所以很重要的是經驗,前人的積累,所以就像壟斷一樣,不是革命性的優秀根本無法動搖根基的。我用過spartan的FPGA,我記得當時選的core也全部是用C做程式設計介面。所以,很抱歉這裡我無法接收該網友的意見。
  • 特殊應用:網頁
嵌入網頁內的,最火的肯定是PHP(後端)和javascript(前端)了。前者代替了古老的cgi。php的fastcgi實現fpm開創了一個時代,時至今日,wordpress等網站和現有的空間,也大部分提供的方案也是php+fpm。但是,java系的jsp內嵌javaasp內嵌C#,都是php的強勁對手。網站的後臺開發被python帶的很high,流行起了網路框架了,djongo等現成的網路框架,可以讓你直接註冊到url,不用關心任何底層問題。但是做網頁還是php的天下。通用語言在各個方面咄咄逼人。
  • 特殊應用:資料庫
就是比哪個SQL版本更被人接受。標準sql自然不必說,根據排名,PL(SQL)/Transact-SQL上榜。最近興起的nosql已經基本發展出格局了,nosql大部分都是用通用語言實現的,不需要使用sql了。但是如mongodb還是支援標準sql。
  • 特殊應用:並行,分散式
並行越來越重要了。兩年前首選Erlang,現在無論是golang還是rust都是現成的為並行而生的。但是,基於已有的條件,還是考慮選用通用語言的並行優化。C++、Java、C#等都在這方面做了很多優秀的工作。c在這方面的建樹應該是最優秀的,pthread,upc等優秀的工作,使得用c組織現成也是非常輕鬆的,並且可以取得最完整的控制。
  • 特殊應用:特定語言的功能增強
不用問了,我想說的是Lua。用C++寫實現,用Lua寫邏輯是好多遊戲的經典開發策略。(當然像Unity用的javascript,Unreal用的自己的。)在通用大型語言的基礎上學會用Lua加速,是一種很有趣的實踐。nginx,ats上都有lua的外掛,這種基礎設施你是不敢輕易的用c寫了模組然後全網替換的。會出一級事故的,經歷過的肯定都懂。哈哈~!~~
  • 特殊應用:人工智慧
人工智慧上,prologlisp是寵兒。R語言有時也被用於資料探勘(但是太慢了),但是現在的人工智慧庫最優秀的也大部分是用c寫的。如此多的基礎架構師c應用有兩個原因:c真的很好,超強的控制能力和程式碼可讀性。還有一個是他們更多的關注底層演算法和技術研究,只會用c。。。。。。後面這條看起來無助,但是卻是很多優秀專案的事實原因。。。。