傳說人類建造通天塔觸怒上帝,上帝施法令人類語言混亂彼此之間沒法交流。這就是說各類各樣的語言其實就是禍亂之源——只會致使交流的不便。但是看看現在的程序設計語言的數量,你會懷疑人類是否又在造「通天塔」了?真的有這麼多語言的必要嗎?我到底要學習多少種程序設計語言纔夠用呢?程序員
根據維基的資料,能夠稱得上相對「主流」(有人用、有文檔)的程序設計語言至少有600種,還有大量的商業化失敗、實用性不高、語言小衆(這裏的「語言」指的是編碼的語言,通常的程序設計語言都習慣用拉丁字母集合或其超集來做爲源碼的字符集,也有用日文、俄文編程、漢語編程的,好比易語言)就難以統計了(保守估計能夠上萬種),儘管已經有了這麼多種程序設計語言,仍然有大量的人投入了大量的時間來研發新的語言,這難道不是重複通天塔的故事嗎?正則表達式
爲了解釋「爲何會有這麼多種程序設計語言」這個問題,想讓咱們來看一份較新的最流行編程語言流行榜:算法
排行榜上排名前十的依次是:C、Java、Object-C、C++、C#、PHP、Python、JavaScript、Perl和VB。下面我會根據這份排行榜來回答咱們的問題。首先闡述一個基本觀點:程序設計語言被創造的目的主要有三個——實用目的、學術目的、商業及特殊應用須要。且聽一一分解:shell
能夠看見在排行榜中,C,Java,C++這樣的語言幾乎是年年穩居前五。這些語言的實用性都是很是高的。讓咱們回顧一下C語言的歷史:1973年AT&T的Ken Thompson由於研發和維護操做系統的須要,要求一種高效簡潔的程序設計語言,因而在BCPL語言的基礎上創造了C語言。Java、C++等語言也都是在有着相似的高要求的任務下臨時創造出來,而後再不斷髮布標準進行改進的(C語言是爲了操做系統,Java是爲了嵌入式應用和網絡開發……) 若是現有的輪子不夠好,那麼就去本身造一個輪子,也正是由於這個特殊的緣由,全部這些以實用爲目的的語言都很高效,語法構造方法、編程邏輯和配套的編譯技術都很成功,因此可以切切實實地解決工程上的問題。另外,這些實用目的語言的語法都很自由(Python由於「明確」、「簡單」的哲學因此算個例外),正好符合了不一樣性格的程序員的須要。另外很是重要的一點是:「決定一種程序設計語言是否強大的是這個語言的庫(標準程序庫、類庫、包、組件、單元、模塊……每種語言都有本身的叫法)而不是程序設計語言自己」;這可能會讓不少人不高興:說實話,C語言在語言的優雅性和友好性上(好比==和=)徹底和Ada、Pascal比不了(Ada是軍方人員設計的,Pascal是數學家設計的),可是C語言依然很是流行,這是由於你想要寫一個含有系統調用的程序,用C語言是最佳選擇,Ada和Pascal這樣的語言想要直接和內核交流是很麻煩的。同理也能夠解釋C++、Java、Perl等語言的流行,你想要寫多線程的程序用C++的多線程庫和Java的包就好了,你想寫正則表達式相關的程序用Perl或者C++ boost庫就行了……懂得不要重複造輪子是很重要的,遇到不能解決的問題,先去查查資料看有沒有人已經寫好了相似的程序,直接把他的函數抄過來就是了——這恐怕是不少人都會作的吧?這些實用性的語言,在長期使用的普遍的使用過程當中積累了大量優秀的庫(C++的STL、BOOST和有些編譯器自帶的庫,Object-C專門針對Mac OS X的庫,Fortran的便於科學計算的函數等等),並且還有愈來愈多的程序員在不斷增長更好的庫,這些都使這些「語言」愈來愈強大。數據庫
這些程序設計語言在發展過程當中既有一些公共的庫(好比文件的I/O),也有一些特有的庫(好比線程庫、RE庫),這些特有的庫每每是某一語言的最大優點,能夠說正是這些各自獨立的庫把不一樣的語言區別開來,久而久之,解決某些特定問題時程序員就傾向使用某一特定語言。這並非說這些特有的庫沒法移植到其它的語言上,只是因爲代碼量巨大,移植是在是個不小的工程(何況,在某種語言中表述很方便的語言在另外一種中就會難以表示,好比C語言有不少語言都沒有的顯示指針,在Lazarus項目中,程序員開發了一個程序用以把C頭文件自動轉換成Pascal單元,即便這樣,實現代碼的量依舊很大,這種源到源的語言翻譯的介紹能夠參見龍書的引論部分,不學編譯原理的請略過)。由於有如此多的專用庫,這些實用目的語言愈來愈多也就不稀奇了。編程
無論什麼程序設計語言,在本質上都不過是機器級別的0或1。所謂的高級語言不過是機器眼中的胡言亂語(這也正是編譯技術存在的價值)。網絡
然而,人不是機器,也不可能也不必成爲機器。創造程序設計語言的目的是爲程序員服務的,應該說,一個程序員所用的語言很大程度上決定了他的思惟方式——程序設計語言自己就是一種嚴謹的數學模型、一種高效的思惟方式。爲了說明這個道理我以一個物理題爲例來解釋:一輛汽車作勻速直線運動,以2m/s的速度通過了6m,問汽車用了多少時間?顯然t=s/v=6/2=3(s),這也能夠列方程來解決:設運動用時t s,則 tv=s,即 2t=6,解得t=3,這好像畫蛇添足。若是把問題稍微「複雜」一下:一輛汽車以1m/s的初速度作加速爲2m/s2的勻加速直線運動,通過了6m,問汽車用時多少時間?根據運動學公式列方程 V0*t+1/2*a*t2=s,即 1*t+0.5*2*t2=6,解得 t=2,也就是要用2s。又或者能夠這樣作:由速度與時間的關係能夠獲得 v(t)=v0+a*t,而數據結構
解這個等式一樣也能夠求出t。這個時候使用方程就很天然了,用定積分卻顯得多餘。從中咱們知道什麼?人的思惟能力是有限的,面對複雜的新問題,要麼用就用原來老方法麻煩地進行計算,要麼提出新的高效的模型來解決問題。無論是算術、方程仍是微積分、傅立葉變換或是其它高級的數學方法、模型都只是一個簡化問題的抽象層(數學家看到了我說這句話恐怕會很生氣的,但這就是事實),做爲類比,程序設計語言就比如這裏的數學模型,越是複雜的問題、越是大的規模(指問題規模),才越能體現出高級語言的價值(有人用過幾十多種語言寫」hello world」,這有什麼意義呢?我用機器語言都能寫hello world)。知道了語言模型對於思惟方式的影響,咱們就能解釋這麼多語言的學術上(或者說是研究上)的目的了:機器語言/彙編語言意味着程序員專一的是寄存器、內存地址、狀態、位的打開或關閉,所以思惟重在每一條實際的指令;而C、Pascal這樣的命令式語言注重每個「計算過程」,所以思惟重在將計算方法、算法、數學模型表達出來;而Java、C++這樣的面向對象的程序設計語言,試圖用對象、類、屬性、方法這些概念來統一的描述算法和數據結構,OO語言的思惟所以可以重在算法和數據;還有像Lisp、Haskell、Erlang、Prolog這樣的函數式、邏輯式語言,強調的是數學的推演、函數的運算、邏輯的證實,我認爲它們纔是最接近人的思惟的語言;而像SQL這樣的語言,強調是「高產出」,它們是對經常使用的指令進行了簡化、「宏化」(Macronize,本人本身造的一個詞),它們的思惟是「要作什麼」而不是「怎麼作」;最後,是像HTML這類Markup語言(有人說HTML不是程序設計語言……)我的認爲是一種glue(膠水語言,最有名的glue算是Lua了),它對文本(好比網頁)的格式進行描述,同時又把JavaScript、Applet等等擴展「鏈接」在一塊兒,它們的思惟是「組合」,是怎樣才能協調各個組件、把組件的功能發揮到極致(提及排版不得不提提TeX了,它和HTML的思惟相似,各類開發好的宏集就是它的「組件」)。最後我還想再談一談「學術風味」很濃的函數式語言,函數式語言歷史悠久,但多年以來一直在學術界活躍,少有可以成功商業化的,多年來一直處於不溫不火的的狀態。但隨着今年來編譯技術的發展,函數式語言的執行效率已經很高了,加上大數據時代對於大量數據處理的需求、機器深度學習的成熟、現代架構計算機的發展,僅僅依靠程序執行的單線程性能提高已經不可以知足實際需求了,只有併發和併發才能知足這樣的高負荷計算要求,純函數語言處理起多線程來十分方便,可以「榨乾」處理器的運算潛力,這也是近年來Erlang之類的語言大放異彩的重要緣由。在現代計算機結構和工藝發展難度大的狀況下,這些函數式語言可能會成爲推進計算力的重要動力,這一點能夠參見本人的論文《AACOS:基於編譯器和操做系統內核的算法設計與實現》(因爲版權的問題,我暫時不能把論文貼出來:-))。多線程
(如下言論僅僅是本人我的觀點,沒有任何指責的意思)架構
開發一種編程語言是能夠賺錢的,你信嗎?
實際上開發一種新的語言意味着創建本身的「統一標準」(提及標準就不得不談高通了,高通從「標準」上撈了多少銀子?),一方面能夠方便維護本身的產品,另外一方面能夠藉助市場地位強迫程序員學習某種語言進而達到本身(至少在某一領域)的霸主地位。爲何這麼多年以來微軟對BASIC情有獨鍾?在DOS時代,QBASIC——一種BASIC的變種,是每臺PC上必裝應用,也是當時不少人必學的一種語言,QBASIC不管是從程序執行效率仍是語言的思惟性上都很差,可是由於是預裝的,本着「不夠好但夠用」的原則,許多用戶竟然湊合下來了(慚愧本人就是從QBASIC開始接觸編程的)!這恐怕和IE用戶如此衆多的緣由是殊途同歸的吧?就這樣QBASIC竟然一時成爲了最受歡迎的入門編程語言工具。到後來,微軟推出Visual Basic其實是爲了和Borland(現已被收購)的Delphi競爭入門級編程工具市場(在至關長的一段時間內VB都不是Delphi的對手,能夠參見本人的另外一片隨筆《Borland和Microsoft的對話》,這直接致使了C#的誕生——C#——一種C++、Java、Object Pascal雜交的到的混血兒),憑藉本身在BASIC用戶上的積累,在RAD領域混得不錯了,微軟又趁熱打鐵的推出了VBS/VBE、VBA等等腳本語言,目的就是拉攏本身的VB用戶,使這種糟糕的語言可以勉勉強強適應系統GUI編程、辦公套件編程、數據庫編程,好了如今造成了一個有機的總體。一個程序員要麼學多種語言來完成不一樣的任務,要麼學一種不夠好但夠用的語言——而後,一招鮮,吃遍天……學習一種語言的成本是很高的(要時間和電費),因此有不少程序員會選擇微軟指定的這一標準。還有近幾年大紅的Object-C、Swift、Go,雖然名義上是開源的,可是誰知道他們的真正目的?除此以外,還有不少DSL(Domain-Specific Language,專業領域語言),好比sed和awk是爲了處理文本,PHP是爲了處理Web開發、Emacs Lisp和Vim腳本是爲了擴展編輯器功能,PostScript是爲了排版,batch和各類shell script是爲了shell編程等等。這裏介紹一個典型:Adobe的ActionScript,它的做用就是爲了支持Adobe本身的Flash,主要用於Flash動畫和應用程序,不論ActionScript語言自身發展的多好不過是一個擴展罷了。
好了,已經介紹完了實用目的、學術目的、商業及特殊須要,相信各位對「爲何會有這麼多種程序設計語言」這個問題有了更深入的理解,也可能有了更多的疑惑。若是你有任何疑惑或者願意和我交流,歡迎留言。對了,除了我說的三個目的以外還有沒有別的創造新語言的緣由?有,我本身設計了一種名爲Grove的語言,用「樹」來完成過程編程和lambda表達式,改天把解釋器的源碼發出來交流一下。個人目的呢?Just for fun……