小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

為什么會有這么多種程序設計語言?

 聯(lián)合參謀學院 2015-05-29

傳說人類建造通天塔觸怒上帝,上帝施法使人類語言混亂彼此之間無法交流。這就是說各種各樣的語言其實就是禍亂之源——只會導致交流的不便??墒强纯慈缃竦某绦蛟O計語言的數(shù)量,你會懷疑人類是否又在造“通天塔”了?真的有這么多語言的必要嗎?我到底要學習多少種程序設計語言才夠用呢?

根據(jù)維基的資料,可以稱得上相對“主流”(有人用、有文檔)的程序設計語言至少有 600 種,還有大量的商業(yè)化失敗、實用性不高、語言小眾(這里的“語言”指的是編碼的語言,一般的程序設計語言都習慣用拉丁字母集合或其超集來作為源碼的字符集,也有用日文、俄文編程、漢語編程的,比如易語言)就難以統(tǒng)計了(保守估計可以上萬種),盡管已經(jīng)有了這么多種程序設計語言,仍然有大量的人投入了大量的時間來研發(fā)新的語言,這難道不是重復通天塔的故事嗎?

為了解釋“為什么會有這么多種程序設計語言”這個問題,想讓我們來看一份較新的最流行編程語言流行榜:

排行榜上排名前十的依次是: C Java 、 Object-C C++ 、 C# 、 PHP 、 Python JavaScript 、 Perl VB 。下面我會根據(jù)這份排行榜來回答我們的問題。首先闡述一個基本觀點: 程序設計語言被創(chuàng)造的目的主要有三個——實用目的、學術目的、商業(yè)及特殊應用需要。 且聽一一分解:

一、實用目的

可以看見在排行榜中, C , Java , C++ 這樣的語言幾乎是年年穩(wěn)居前五。這些語言的實用性都是非常高的。讓我們回顧一下 C 語言的歷史 1973 AT&T Ken Thompson 因為研發(fā)和維護操作系統(tǒng)的需要,要求一種高效簡潔的程序設計語言,于是在 BCPL 語言的基礎上創(chuàng)造了 C 語言。 Java 、 C++ 等語言也都是在有著類似的高要求的任務下臨時創(chuàng)造出來,然后再不斷發(fā)布標準進行改進的( C 語言是為了操作系統(tǒng), Java 是為了嵌入式應用和網(wǎng)絡開發(fā)……) 如果現(xiàn)有的輪子不夠好,那么就去自己造一個輪子 ,也正是因為這個特殊的原因,所有這些以實用為目的的語言都很高效,語法構造方法、編程邏輯和配套的編譯技術都很成功,所以能夠切切實實地解決工程上的問題。另外,這些實用目的語言的語法都很自由( Python 因為“ 明確”、“簡單”的哲學所以算個例外),正好符合了不同性格的程序員的需要。另外非常重要的一點是:“ 決定一種程序設計語言是否強大的是這個語言的庫 (標準程序庫、類庫、包、組件、單元、模塊……每種語言都有自己的叫法) 而不是程序設計語言本身 ”;這可能會讓很多人不高興 :說實話, C 語言在語言的優(yōu)雅性和友好性上(比如 == = )完全和 Ada 、 Pascal 比不了( Ada 是軍方人員設計的, Pascal 是數(shù)學家設計的),但是 C 語言依然非常流行,這是因為你想要寫一個含有系統(tǒng)調用的程序,用 C 語言是最佳選擇, Ada Pascal 這樣的語言想要直接和內核交流是很麻煩的。同理也可以解釋 C++ Java 、 Perl 等語言的流行,你想要寫多線程的程序用 C++ 的多線程庫和 Java 的包就行了,你想寫正則表達式相關的程序用 Perl 或者 C++ boost 庫就好了……懂得不要重復造輪子是很重要的,遇到不能解決的問題,先去查查資料看有沒有人已經(jīng)寫好了類似的程序,直接把他的函數(shù)抄過來就是了——這恐怕是很多人都會做的吧?這些實用性的語言,在長期使用的廣泛的使用過程中積累了大量優(yōu)秀的庫( C++ STL BOOST 和有些編譯器自帶的庫, Object-C 專門針對 Mac OS X 的庫, Fortran 的便于科學計算的函數(shù)等等),而且還有越來越多的程序員在不斷增加更好的庫,這些都使這些“語言”越來越強大。

這些程序設計語言在發(fā)展過程中既有一些公共的庫(比如文件的 I/O ),也有一些特有的庫(比如線程庫、 RE 庫),這些特有的庫往往是某一語言的最大優(yōu)勢,可以說正是這些各自獨立的庫把不同的語言區(qū)別開來,長此以往,解決某些特定問題時程序員就傾向使用某一特定語言。這并不是說這些特有的庫無法移植到其它的語言上,只是由于代碼量巨大,移植是在是個不小的工程(況且,在某種語言中表述很方便的語言在另一種中就會難以表示,比如 C 語言有很多語言都沒有的顯示指針,在 Lazarus 項目中,程序員開發(fā)了一個程序用以把 C 頭文件自動轉換成 Pascal 單元,即使這樣,實現(xiàn)代碼的量依舊很大,這種源到源的語言翻譯的介紹可以參見龍書的引論部分,不學編譯原理的請略過)。因為有如此多的專用庫,這些實用目的語言越來越多也就不稀奇了。

二、學術目的

不管什么程序設計語言,在本質上都不過是機器級別的 0 1 。所謂的高級語言不過是機器眼中的 胡言亂語(這也正是編譯技術存在的價值)。

然而,人不是機器,也不可能也沒必要成為機器。創(chuàng)造程序設計語言的目的是為程序員服務的,應該說, 一個程序員所用的語言很大程度上決定了他的思維方式——程序設計語言本身就是一種嚴謹?shù)臄?shù)學模型、一種高效的思維方式 。 為了說明這個道理我以一個物理題為例來解釋 :一輛汽車做勻速直線運動,以 2m/s 的速度經(jīng)過了 6m ,問汽車用了多少時間? 顯然 t=s/v=6/2=3(s) ,這也可以列方程來解決:設運動用時 t s ,則 tv=s ,即 2t=6 ,解得 t=3 ,這好像多此一舉。 如果把問題稍微“復雜”一下:一輛汽車以 1m/s 的初速度做加速為 2m/s 2 的勻加速直線運動 , 經(jīng)過了 6m ,問汽車用時多少時間? 根據(jù)運動學公式列方程 V 0* t +1/2*a*t 2 =s ,即 1*t+0.5*2*t 2 =6 ,解得 t=2 ,也就是要用 2s 。 又或者可以這樣做:由速度與時間的關系可以得到 v(t)=v 0 +a*t,而

解這個等式 同樣也可以求出 t 。這個時候使用方程就很自然了,用定積分卻顯得多余。從中我們知道什么?人的思維能力是有限的,面對復雜的新問題,要么用就用原來老方法麻煩地進行計算,要么提出新的高效的模型來解決問題。不管是算術、方程還是微積分、傅立葉變換或是其它高級的數(shù)學方法、模型都只是一個 簡化問題的抽象層 (數(shù)學家看到了我說這句話恐怕會很生氣的,但這就是事實),作為類比,程序設計語言就好比這里的數(shù)學模型,越是復雜的問題、越是大的規(guī)模(指問題規(guī)模),才越能體現(xiàn)出高級語言的價值(有人用過幾十多種語言寫” hello world” ,這有什么意義呢?我用機器語言都能寫 hello world )。知道了語言模型對于思維方式的影響,我們就能解釋這么多語言的學術上(或者說是研究上)的目的了:機器語言 / 匯編語言意味著程序員專注的是寄存器、內存地址、狀態(tài)、位的打開或關閉,因此思維重在每一條實際的指令; C 、 Pascal 這樣的命令式語言注重每一個“計算過程”,因此思維重在將計算方法、算法、數(shù)學模型表達出來;而 Java C++ 這樣的面向對象的程序設計語言,試圖用對象、類、屬性、方法這些概念來統(tǒng)一的描述算法和數(shù)據(jù)結構, OO 語言的思維因此能夠重在算法和數(shù)據(jù);還有像 Lisp 、 Haskell Erlang 、 Prolog 這樣的函數(shù)式、邏輯式語言,強調的是數(shù)學的推演、函數(shù)的運算、邏輯的證明,我認為它們才是最接近人的思維的語言;而像 SQL 這樣的語言,強調是“高產出”,它們是對常用的指令進行了簡化、“宏化” Macronize, 本人自己造的一個詞),它們的思維是“要做什么”而不是“怎么做”;最后,是像 HTML 這類 Markup 語言(有人說 HTML 不是程序設計語言……)個人認為是一種 glue (膠水語言,最有名的 glue 算是 Lua 了),它對文本(比如網(wǎng)頁)的格式進行描述,同時又把 JavaScript Applet 等等擴展“連接”在一起,它們的思維是“組合”,是怎樣才能協(xié)調各個組件、把組件的功能發(fā)揮到極致(說起排版不得不提提 TeX 了,它和 HTML 的思維類似,各種開發(fā)好的宏集就是它的“組件”)。最后我還想再談一談“學術風味”很濃的函數(shù)式語言,函數(shù)式語言歷史悠久,但多年以來一直在學術界活躍,少有能夠成功商業(yè)化的,多年來一直處于不溫不火的的狀態(tài)。但隨著今年來編譯技術的發(fā)展,函數(shù)式語言的執(zhí)行效率已經(jīng)很高了,加上大數(shù)據(jù)時代對于大量數(shù)據(jù)處理的需求、機器深度學習的成熟、現(xiàn)代架構計算機的發(fā)展,僅僅依靠程序執(zhí)行的單線程性能提升已經(jīng)不能夠滿足實際需求了,只有并發(fā)和并發(fā)才能滿足這樣的高負荷計算要求 ,純函數(shù)語言處理起多線程來十分方便,能夠“榨干”處理器的運算潛力,這也是近年來 Erlang 之類的語言大放異彩的重要原因。在現(xiàn)代計算機結構和工藝發(fā)展難度大的情況下,這些函數(shù)式語言可能會成為推動計算力的重要動力,這一點可以參見本人的論文《 AACOS: 基于編譯器和操作系統(tǒng)內核的算法設計與實現(xiàn)》(由于版權的問題,我暫時不能把論文貼出來 :-) )。

三、商業(yè)及特殊應用需要

(以下言論僅僅是本人個人觀點,沒有任何指責的意思)

開發(fā)一種編程語言是可以賺錢的,你信嗎?

實際上開發(fā)一種新的語言意味著建立自己的“統(tǒng)一標準” (說起標準就不得不談高通了,高通從“標準”上撈了多少銀子?), 一方面可以方便維護自己的產品,另一方面可以借助市場地位強迫程序員學習某種語言進而達到自己(至少在某一領域)的霸主地位 。為什么這么多年以來微軟對 BASIC 情有獨鐘?在 DOS 時代, QBASIC—— 一種 BASIC 的變種,是每臺 PC 上必裝應用,也是當時很多人必學的一種語言, QBASIC 無論是從程序執(zhí)行效率還是語言的思維性上都不好,但是因為是預裝的,本著“不夠好但夠用”的原則,許多用戶居然湊合下來了(慚愧本人就是從 QBASIC 開始接觸編程的 !這恐怕和 IE 用戶如此眾多的原因是異曲同工的吧?就這樣 QBASIC 居然一時成為了最受歡迎的入門編程語言工具。到后來 ,微軟推出 Visual Basic 實際上是為了和 Borland (現(xiàn)已被收購)的 Delphi 競爭入門級編程工具市場(在相當長的一段時間內 VB 都不是 Delphi 的對手,可以參見本人的另一片隨筆《 Borland Microsoft 的對話》,這直接導致了 C# 的誕生—— C#—— 一種 C++ 、 Java Object Pascal 雜交的到的混血兒),憑借自己在 BASIC 用戶上的積累,在 RAD 領域混得不錯了,微軟又趁熱打鐵的推出了 VBS/VBE 、 VBA 等等腳本語言,目的就是拉攏自己的 VB 用戶,使這種糟糕的語言能夠勉勉強強適應系統(tǒng) GUI 編程、辦公套件編程、數(shù)據(jù)庫編程,好了現(xiàn)在形成了一個有機的整體。一個程序員要么學多種語言來完成不同的任務,要么學一種不夠好但夠用的語言——然后 ,一招鮮,吃遍天……學習一種語言的成本是很高的(要時間和電費),所以有很多程序員會選擇微軟指定的這一標準。還有近幾年大紅的 Object-C 、 Swift 、 Go ,雖然名義上是開源的,但是誰知道他們的真正目的?除此之外,還有很多 DSL Domain-Specific Language ,專業(yè)領域語言),比如 sed awk 是為了處理文本, PHP 是為了處理 Web 開發(fā)、 Emacs Lisp Vim 腳本是為了擴展編輯器功能, PostScript 是為了排版, batch 和各種 shell script 是為了 shell 編程等等。這里介紹一個典型: Adobe ActionScript ,它的作用就是為了支持 Adobe 自己的 Flash ,主要用于 Flash 動畫和應用程序,不論 ActionScript 語言自身發(fā)展的多好不過是一個擴展罷了。

好了,已經(jīng)介紹完了實用目的、學術目的、商業(yè)及特殊需要,相信各位對“為什么會有這么多種程序設計語言”這個問題有了更深刻的理解,也可能有了更多的疑惑。如果你有任何疑惑或者愿意和我交流,歡迎留言。對了,除了我說的三個目的之外還有沒有別的創(chuàng)造新語言的原因?有,我自己設計了一種名為 Grove 的語言,用“樹”來完成過程編程和 lambda 表達式,改天把解釋器的源碼發(fā)出來交流一下。我的目的呢? Just for fun…… 

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多