一張圖概括程式語言發展史 === 一張圖 --- **程式語言是一組用來定義計算機程式的語法規則。它是一種被標準化的交流語言,用來向計算機發出指令。一種計算機語言讓程式設計師能夠準確地定義計算機所需要使用的資料,並精確地定義在不同情況下所應當採取的行動。儘管人們多次試圖創造一種通用的程式設計語言,卻沒有一次嘗試是成功的。之所以有那麼多種不同的程式語言存在的原因是設計程式語言的初衷不同,對語言學習曲線的追求不同,不同程式之間的執行成本差異等。** **下面這張圖片描繪了整個程式語言的歷史。包括各種程式語言的發明人,程式語言的特點和適用領域,被什麼網站或公司使用等。** ![](https://i.imgur.com/urfL31w.jpg) 圖片來源:[The History of Programming Languages Infographic](https://www.veracode.com/blog/2013/04/the-history-of-programming-languages-infographic/) 編年史 --- 我們一個統計出來256種程式語言,當然,這麼多的語言中只有一些是常用的或實用的。 1951 – Regional Assembly Language 1952 – Autocode 1954 – IPL (LISP語言的祖先) 1955 – FLOW-MATIC (COBOL語言的祖先) 1957 – FORTRAN (第一個編譯型語言) 1957 – COMTRAN (COBOL語言的祖先) 1958 – LISP 1958 – ALGOL 58 1959 – FACT (COBOL語言的祖先) 1959 – COBOL 1959 – RPG 1962 – APL 1962 – Simula 1962 – SNOBOL 1963 – CPL (C語言的祖先) 1964 – BASIC 1964 – PL/I 1966 – JOSS 1967 – BCPL (C語言的祖先) 1968 – Logo 1969 – B (C語言的祖先) 1970 – Pascal 1970 – Forth 1972 – C 1972 – Smalltalk 1972 – Prolog 1973 – ML 1975 – Scheme 1978 – SQL 1980 – C (既有類的C語言,更名於1983年7月) 1983 – Ada 1984 – Common Lisp 1984 – MATLAB 1985 – Eiffel 1986 – Objective-C 1986 – Erlang 1987 – Perl 1988 – Tcl 1988 – Mathematica 1989 – FL 1990 – Haskell 1991 – Python 1991 – Visual Basic 1993 – Ruby 1993 – Lua 1994 – CLOS (ANSI Common Lisp的一部分) 1995 – Java 1995 – Delphi (Object Pascal) 1995 – JavaScript 1995 – PHP 1996 – WebDNA 1997 – Rebol 1999 – D 2000 – ActionScript 2001 – C# 2001 – Visual Basic .NET 2002 – F# 2003 – Groovy 2003 – Scala 2007 – Clojure 2009 – Go 2011 – Dart 從1951年2014年,人類一共發明了256種程式語言,每一種語言的出現都帶有某些新特徵。程式語言不斷的在革新,很快就會有超出這個清單的新程式語言出現 1801 – Joseph Marie Jacquard用打孔卡為一臺織布機編寫指令,在掛毯上織出了“hello, world”字樣。當時的reddit網友對這項工作的反響並不熱烈,因為它既缺少尾遞迴呼叫,又不支援併發,而且甚至都沒有注意在拼寫時恰當地區分大小寫。 > Jacquard織布機是第一臺可進行程式控制的織布機。用打孔卡進行程式設計的概念,直到電子計算機被髮明出來之後仍然被廣泛運用。 最早的Hello World程式(出自K&R C)列印的是全小寫的字串:”hello, world”。 在許多英文技術社群裡,不正確地使用大小寫發貼會被視作是小白的行為。(如把“Python”拼作“python”,把“FreeBSD”拼作“freebsd”,把“Qt”拼作“QT”) 1842 – Ada Lovelace寫了世界上第一個程式。她的努力只遇到了一點點小小的麻煩,那就是:實際上並沒有任何計算機能夠用來執行她的程式。後來的企業架構師們重新吸收了她的這個技能,用來學習如何更好地使用UML進行程式設計。 > Ada Lovelace為Charles Babbage的分析機寫了一個計算伯努利數的演算法實現,因此被後世公認為是世界上第一個程式設計師。實際上,分析機由於其設計思想過於先進,在當時根本沒有 被製造出來。(Babbage的分析機一般被認為是現代電子通用計算機的先驅) > 諷刺現在的某些“軟體架構師”頂多只會紙上談兵地畫畫UML。 1936 – Alan Turing發明了世間一切程式語言的最終形態,但很快他就被英國軍情六處“請”去當007了,以至於他根本來不及為這些語言申請專利。 > 與通用圖靈機(Universal Turing machine)等價的語言被稱為圖靈完備的(Turing > completeness),它定義了“什麼樣的語言可以被稱作是程式語言”。 > > 二戰期間Turing曾祕密地為英國軍方工作,破解德軍的Enigma密碼機,並在戰後被授予大英帝國勳章。但這項事實直到多年以後才向公眾公開 1936 – Alonzo Church同時也發明了世間一切程式語言的最終形態,甚至做得更好。但他的λ演算被絕大部分人忽視了,因為它與C語言“不夠像”。儘管存在著這樣的批評,但事實上,C在當時還沒有被髮明出來。 > Church是Turing在Princeton的博士生導師,他在λ演算方面的工作先於Turing指出了不存在一個對可判定性問題的通用解法,這後來證明和Turing針對停機問題提出的圖靈機模型是等價的。即著名的Church-Turing論題。 > > 說Church“甚至做得更好”,因為λ演算為後世所有的函式式語言提供了理論基礎。 > > 現在一種常見的關於函數語言程式設計的批評就是:“它們與C語言不夠像”。 1940年代 – 一些直接採用佈線和開關來進行程式控制的“計算機”出現了。工程師們當時這麼做,據說是為了避開“用空格還是用製表符縮排”這樣的論戰。 > 據說當時負責設計ENIAC的工程師中間曾經發生過這樣的爭論: > > 空格比製表符好。 > > 製表符比空格好。 > > 4個空格比8個空格好。 > > 什麼?用2個空格的統統燒死。 > > 關於這臺具有里程碑意義的人類史上第一臺電子計算機ENIAC上應該預裝何種編輯器,工程師們還發生過這樣的爭吵: > > Vim比Emacs好! > > Emacs比Vim好! > > 強烈推薦Sublime Text。 > > 你丫用編輯器的都是找虐,IDE才是王道。 > > 沒錯,要用就用世界上最好的公司微軟開發出來的世界上最好的IDE:Visual Studio。 > > 我早就看透了無謂的編輯器論戰什麼的了,我要告訴樓上吵架的,你們全都是傻逼! > > 最後,工程師們一致決定使用佈線和開關來為他們即將發明的計算機進行程式設計,機智地避開了所有這些無謂的爭吵,最終齊心協力創造出了人類歷史上第一臺電子計算機:ENIAC。(鼓掌) > > 兩位ENIAC程式設計師在運用敏捷開發方法進行愉快的結對程式設計。“自從拋棄伴隨我多年的Emacs和HHKB Pro、改用佈線和開關進行程式設計之後,我的左手小指麻痺奇蹟般地痊癒了。”其中一位接受採訪時如是說。另一位則表示:“新的程式設計方式讓曾經專注頸椎病20年的我得到了徹底的康復,不用再整天盯著顯示屏,身心同時得到了極大的放鬆,值得大力推廣!”) 1957 – John Backus和IBM發明了FORTRAN語言。關於IBM或FORTRAN並沒有什麼特別好笑的地方。除了,寫FORTRAN程式的時候不繫藍領帶將被編譯器視作是一個syntax error。 > 藍領帶、白襯衫、深色西裝似乎是IBM公司20世紀經典的dress code。 > > 早期FORTRAN(FORTRAN 77)對程式書寫格式的要求那是相當嚴格。(例如,蛋疼的固定格式縮排) 1958 – John McCarthy和Paul Graham發明了LISP。由於冷戰期間的戰略括號資源儲備所造成的巨大成本,LISP從未流行過。儘管欠缺足夠的流行度,LISP(現在叫做 “Lisp”,有時叫“Arc”)仍然被視作一門有影響力的語言,在關鍵的演算法思想諸如遞迴(recursion)和提升逼格 (condescension)上尤為典範。 > LISP發明的那一年Paul Graham其實還沒有出生。據說是因為某本叫做《Haste and > Waste》的偽程裝黑聖典實在太有名了,以至於許多程式設計小白們把寫這本書的傳奇人物同Lisp之間畫上了等號。 > > 提升逼格確實是一種與遞迴呼叫同樣關鍵的演算法思想。嗯,你懂的。 1959 – 在輸掉了和L. Ron Hubbard之間的一場打賭之後,Grace Hopper和其他幾個抖S發明了所謂的“面向Boilerplate的全大寫化語言(Capitalization Of Boilerplate Oriented Language,COBOL)”。多年以後,由於一些被誤導的、性別歧視主義者對Adm. Hopper關於COBOL的工作的報復,在Ruby技術會議上不時會看到一些厭女主義乃至仇視女性的材料出現。 > L. Ron Hubbard是山達基教(Scientology)的創始人,二戰期間曾與Grace > Hopper同樣供職於美國海軍。(尚不清楚這兩人之間有無其他聯絡) > > COBOL語言以程式碼極其冗長和通篇大寫字母的書寫風格而聞名。 > > Adm. Hopper:Grace Murray Hopper女士的軍銜是Rear Admiral Lower Half,即美國海軍准將。 1964 – John Kemeny和Thomas Kurtz創造了BASIC,一個為非電腦科學家設計的非結構化的程式語言。 > 1965 – Kemeny和Kurtz兩人goto到了1964。 > > 調侃BASIC語言對行號和goto的無節制濫用。 1970 – Guy Steele和Gerald Sussman創造了Scheme。他們的工作導致了一系列以《Lambda之究極(Lambda the Ultimate)……》為標題開頭的論文發表,並在《Lambda之究極廚房神器》這一篇中達到了最高潮。以這篇論文為基礎,開始了一個長年累月的、收 視率究極失敗的晚間電視購物節目。Lambda們因為其概念相對難以理解而被大眾所忽視,直到未來的某一天,Java語言終於讓它們變得有名了起來。通過 不包含它們這件事情。 1970 – Niklaus Wirth創造了Pascal,一個過程式的語言。很快就有人開始聲討Pascal,因為它使用了類似“x := x y”這樣的語法,而不是更為人熟知的類C語法“x = x y”。儘管存在著這樣的批評,而事實上當時C還沒有被髮明出來。 1972 – Dennis Ritchie發明了一把射擊時能同時向前和向後兩個方向發射子彈的絕世好槍。但他對此發明造成的致死和終身殘疾數量感到還不夠滿意,所以他又發明了C語言和Unix。 1972 – Alain Colmerauer設計了邏輯程式語言Prolog。他的目標是創造一個具有兩歲小孩智商的程式語言。為了證明他成功達到了這個目標,他展示了一個Prolog程式,它對於每條查詢都會機智地給出相同的回答:“No”。 1973 – Robin Milner創造了ML,一個建立在M&M型別理論基礎上的語言。由ML衍生而來的SML加上了一套形式語義的規範。當被要求給這個形式語義本身 書寫一套形式語義時,Milner的腦子爆掉了。其他ML家族的著名語言還包括OCaml,F#,和,Visual Basic。 1980 – Alan Kay創造了Smalltalk併發明瞭“物件導向”這個詞。當被問到它的含義時,他回答道:“Smalltalk程式本身就是物件。”當被問到物件是由 什麼組成時,他回答到:“物件。”當再一次被問到這個問題時,他說“看,它從裡到外都是物件。直到你抽出一隻烏龜。” Smalltalk的設計從很大程度上受到了Logo的影響。 1983 – 為了紀念偉大的先輩程式設計師Ada Lovelace那能夠寫出永遠也無法被執行的程式碼的彪悍技能,Jean Ichbiah和美國國防部創造了Ada語言。儘管缺乏證據顯示有任何重要的Ada程式曾經被完成過,歷史學家仍然確信Ada是個成功的公益專案,它讓數 以千計的國防承包商免於淪落為與黑幫為伍。 > Ada曾經是美國國防部指定的嵌入式計算機系統唯一開發語言,在其研發上耗資巨大。(國防承包商們於是不用靠販賣軍火給黑幫來維持生計了) > > 雖然有充分的證據顯示Ada的整型範圍溢位檢查失敗導致弄壞了歐空局的一枚Ariane 5運載火箭,不過美國國防部發言人對此表示:關我P事。 1983 – Bjarne Stroustrup把他所聽說過的一切都試圖嫁接到C上,創造出了C 。最後得到的語言是如此地複雜,以至於程式必須被送到未來去讓“天網”人工智慧 進行編譯。編譯時間難以容忍。天網開展這項服務的動機仍然不為人知,但來自未來的發言人說道:“沒什麼好擔心的,寶貝。”帶著一口奧地利腔的機械口音。有 一些來自坊間的推測,所謂的天網只不過是個自命不凡的緩衝區溢位而已。 1986 – Brad Cox和Tom Love創造了Objective-C,宣稱“該語言完美地結合了C的記憶體安全性與Smalltalk的神奇效率”。現在的歷史學家懷疑這兩人其實是誦讀障礙症患者。 > “C的記憶體安全性…” > > Smalltalk編譯出來的程式以低效緩慢著稱。 1987 – Larry Wall在電腦前打了個盹,Larry Wall的腦門子壓到了鍵盤上。醒來之後,Larry Wall深信 ,在Larry Wall的顯示器上出現的神祕字串並非是隨機的,那是某種程式語言之程式樣例的神諭。那必是上帝要他的先知,Larry Wall,去設計的。Perl語言就此誕生了。 1990 – 一個由Simon Peyton-Jones、Paul Hudak、Philip Wadler、Ashton Kutcher和善待動物組織(PETA)組成的委員會創造了Haskell,一種純函式式的、非嚴求值的語言。Haskell由於使用了Monad這種 較費解的概念來控制副作用而遭到了一些批評意見。Wadler試圖平息這些質疑,他解釋說:“一個單子(Monad)說白了不過就是自函子範疇上的一個么 半群而已,這有什麼難以理解的?” 1991 – 荷蘭程式設計師Guido van Rossum為了一次神祕的手術而進行了一次阿根廷之旅。回來後他帶著一個巨大的顱疤,發明了Python,而被數以軍團計的追隨者們加冕為“終生大獨裁 者”,並向全世界宣佈“要辦到一件事情,只可有唯一的一種方法!”。整個波蘭陷入了恐慌。 > BDFL(Benevolent Dictator for > Life):開源社群一種流行的說法,“仁慈的”終生大獨裁者。這個說法最早指的就是Guido van Rossum。 > > 希特勒在提出建立“純正的雅利安人國家”“統一的大德意志帝國”並實現了德奧合併之後,翌年便入侵了波蘭,引發了第二次世界大戰。“我一個人征服了整個歐洲!”(感覺好棒好棒的) 1995 – 在家門口附近的一個義大利飯館用餐時,Rasmus Lerdorf意識到他吃的那盤意麵正好是一個用來理解WWW全球資訊網的極好模型,而所有的Web應用都應該仿照它們的媒介那樣去做。在他的餐巾的背後,他 設計出了著名的“可程式設計超連結Pasta(Programmable Hyperlinked Pasta,PHP)”語言。PHP的文件至今仍然保留在那片餐巾上。 > PHP最顯著的特點就是:程式碼是可以直接嵌在HTML文件中的。 1995 – 松本“Mad Matz”行弘創造出了Ruby語言,用來闢謠一些意味不明的、有關澳洲將會變成一片由莫霍克族戰士和Tina Turner統治的荒漠的末世預言。該語言後來被它的真正發明者David Heinemeier Hansson重新命名為Ruby on Rails。(關於某個叫松本行弘的人發明了一種叫做Ruby的語言這件事情從未發生過,最好在這篇文章的下一個版本中刪掉。 – DHH表示) > 最早關於Ruby的國際會議不是RubyConf,而是每年在澳大利亞舉辦的OSDConf。 > > 這裡應該是在吐槽Ruby的殺手級應用Ruby on Rails實在太有名了,以至於超越了原來的Ruby語言本身。 > > Matz並沒有為“Ruby”這個名字註冊商標——本著開源的黑客精神。 > > 而DHH(RoR的作者)卻把“Ruby on > Rails”這個(包含了“Ruby”字樣的)名稱註冊成了商標,並且阻止別人未經授權使用“Rails”這個名字。 > > (雖然搶注商標對開源來說未必是一件壞事情——Python基金會今年在歐洲還捲入了一場商標之爭了不是) 1995 – Brendan Eich讀完了歷史上所有在程式語言設計中曾經出現過的錯誤,自己又發明了一些更多的錯誤,然後用它們創造出了LiveScript。之後,為了緊跟 Java語言的時髦潮流,它被重新命名為JavaScript。再然後,為了追隨一種面板病的時髦潮流,這語言又被命名為ECMAScript。 1996 – James Gosling發明了Java。Java是一個相對繁冗的、帶垃圾收集的、基於類的、靜態型別的、單分派的面嚮物件語言,擁有單實現繼承和多介面繼承。Sun不遺餘力地宣傳著Java的獨一無二不同凡響之處。 2001 – Anders Hejlsberg發明了C#。C#是一個相對繁冗的、帶垃圾收集的、基於類的、靜態型別的、單分派的面嚮物件語言,擁有單實現繼承和多介面繼承。微軟不遺餘力地宣傳著C#的獨一無二不同凡響之處。 2003 – 一個叫Martin Odersky的醉漢看見了好時瑞森花生醬杯的廣告,展示了某個人的花生醬倒入另一個人的巧克力的場景,他忽然有了個點子。他創造了Scala,一種結合 了物件導向和函數語言程式設計的語言。這同時激怒了兩個陣營的忠實信徒,他們立刻宣佈要發動聖戰燒死異教徒。 程式語言的發展歷史 === 計算機語言的發展歷程可以簡單劃分為以下幾個階段 : --- 機器語言——>組合語言——>高階計算機語言 --- * 機器語言:最初的計算機所使用的是由“0”和“1”組成的二進位制數,二進位制是計算機的語言的基礎。計算機發明之初,計算機只能被少部分人使用,人 們需要用0、1組成的指令序列交由計算機執行,對於機器語言的使用與普及都是很令人頭疼的問題。對於程式的移植能力幾乎沒有,從而時間成本,人力成本十分昂貴。但機器語言也不是沒有優勢,由於這種語言是直接對計算機硬體進行操作,所以在特定型號的計算機上面,運算效率也是很高的,機器語言的出 現對於未來的計算機語言發展起到了很好的推動作用,所以機器語言也是第一代計算機語言。 * 組合語言:組合語言是在機器語言的基礎上誕生的一門語言,用一些簡潔的英文字母、符號串來替代一個特定的指令的二進位制串,這也提高了語言的記憶性和識別性。對於程式的開發與維護起到了積極作用。組合語言同樣也是直接對硬體進行操作,這樣依然侷限了它的移植性。但是使用匯編語言針對計算機特定硬體而編制的組合語言程式,對於計算機硬體的功能和特長的發揮已有了很大進步,它精煉而質量高,所以至今仍是一種常用的程式開發語言。 * 高階計算機語言:在與計算機的不斷交流中,人們對計算機程式的移植性需求不斷提高,此時急需要一種不依賴於特定型號的計算機的語言,用這種語言編寫的程式能在在各種平臺都正常執行。從最初的語言誕生至今,已經相繼出現了幾百種語言。高階語言的發展也從最初的結構化語言發展成為面向過程語言設計和麵向物件語言設計。面向過程語言設計的代表有:C語言,Fortran,cobol,pascal,ada等等一系列語言,而面嚮物件語言設計的代表則為:java, c++,c#等。 1、第一個計算機語言:Fortran --- Fortran I誕生於1957年,由IBM設計,是世界上第一個真正的計算機語言。 Fortran I運行於IBM 704計算機上。 Fortran I支援:變數(變數名最多6個字元)、If和do語句、格式化IO。 不支援:資料型別宣告、單獨編譯子程式 Fortran II 釋出於1958年,主要對Fortran I的編譯器做了優化,並支援了單獨編譯的子程式。 Fortran IV釋出於1962年,並在1966年被標準化為Fortran 66,這也是第一個Fortran的標準化版本。 1978年的Fortran 77是非重要的標準化版本,這時的Fortran語言已經大量的引進了其他計算機語言的特點,例如字串處理、邏輯判斷、帶else子句的if語句等。 Fortran的最新標準化版本是Fortran 2008。 Fortran的設計思想基於馮諾依曼體系結構是命令式語言的鼻祖。 2、源於數學的計算機語言:Lisp --- 人工智慧語言IPL(Information Processing Language)誕生於1956年。IPL相當於一種假想的計算機的機器語言,這種計算機是以列表處理為基礎,這有別於馮諾依曼體系結構。IPL的關鍵是證明了:基於列表處理的計算機的可行性。 1958年夏,約翰.麥卡錫在IBM研究代數表示式的微分運算時,產生了一系列對語言需求,包括:用數學函式控制流程的方法(即,遞迴和條件表示式);列表的自動分配;廢棄列表的隱士回收。這些語言需求,顯然IPL不能滿足,所以需要設計新的語言。 1958年秋,麥卡錫在MIT成立了人工智慧小組,開始著手設計這種新的列表處理語言。這最終導致1960年,Lisp的誕生。 1960年的Lisp並沒有來得及設計自己的語法,就被麥卡錫的學生實現了,因為沒有語法,麥卡錫的學生就以列表格式的語法分析樹(即,S(Symbolic)表示式)作為臨時語法。 但沒有想到的是隨著Lisp語言廣泛流傳,這種語法被程式設計師迅速介紹,並發現了其獨特的魅力。 麥卡錫希望Lisp的語法是數學表示式的元語言,命名為M(Mate)表示式,類似於後面的ML語言的語法。但是這種想法遭到了當時Lisp程式設計師的反對,最後麥卡錫開了MIT,從此Lisp的語法凝固在S表示式上。 Lisp建立在列表和lambda演算和基礎上,是函數語言程式設計的鼻祖。 3、通用科學計算語言:Algol --- Algol 58年誕生於1958年,由蘇黎世會議制定。是第一個設具體機器無關的計算機語言。 隨著Fortran的誕生,其他一些語言也在開發中,這些語言的語法格式各不相同,而且和Fortran一樣,都與執行它們的具體計算機關聯(比如標示符長度、程式碼行數的限制等)。用這些語言寫的程式碼很難交流。於是Algol 58在Fortran I的基礎做了擴充套件,併兼容了當時其他語言的一些特性,成為了程式設計思想的整合。 Algol 60,發表於1960年,在Algol 58的基礎上做了重大改進:移入塊結構、 支援兩種子程式引數傳遞(按值傳遞和按名傳遞)、允許遞迴、支援本地陣列(在棧上分配陣列)。Algol 60是命令式語言的一個里程碑。 Algol 在設計之初,就定下:語法應當儘可能接近數學記法,的目標。這就使得Algol 60語法格式幾乎影響到後來所有的計算機語言,並且Algol 60是很多文獻表達演算法的唯一正式方式。 Algol 60是後來所有計算機語言語法的鼻祖,但Cobol除外。 4、通用商務語言:COBOL --- COBOL語言於1960年釋出。注意真對商務應用。語言的設計理念是:“數學程式應該用數學記法來寫,資料處理程式應該用英語語句來寫”。商務應用顯然屬於後者,所以COBOL語言看起了就像是全大寫的英語。 COBOL創造了一些新概念:巨集(DEFINE)和資料結構(記錄)。 COBOL在商務領域被廣泛的使用。 COBOL對後來的語言幾乎沒有影響,但PL/I除外。 5、跨領域語言:PL/I --- 之前的所有語言都是領域特定語言,例如:人工智慧領域的Lisp、科學計算領域的Algol 60,商務應用領域的COMBOL等。 PL/I誕生於1964年,是跨科學計算和商務應用領域的計算機語言。 PL/I是Algol 60、Fortran IV、COBOL的結合體。 6、面向物件的起源:SIMULA 67 --- 1964年,在挪威計算機中心誕生了SIMULA I,然後不斷的做改進最終於1967年,產生了SIMULA 67。 SIMULA 67是對Algol 60的擴充套件,是第一個定義類結構的語言,這也被認為是面向物件的起源。 將指令式程式設計中的資料和資料的有關函式整合在一起,就形成了面向物件程式設計中的物件,而物件的型別就是類。將指令式程式設計中主程式呼叫子程式的從屬關係,變為面向物件程式設計中物件之間互相傳送訊息的平等關係。 7、正交設計:Algol 68 --- Algol 68,發表於1968年,第一個引入正交化設計的概念,以及使用者自定義資料型別。 8、初學者的語言:BASIC --- BASIC語言誕生於1971年,設計的主要目的是:使得計算機語言可以被非理工科生使用(當時理工科學生使用的Fortran和Algol 60很難被文科生掌握)。 這樣的設計目的使得BASIC非常適合於初學者。 BASIC來自於Fortran IV,語法受到Algol 60影響。是BASIC是第一個被廣泛使用的分時處理語言。 9、學院派語言:Pascal --- Pascal語言誕生於1971年,來自於Algol 68。 Pascal重大影響來自於程式設計教學。它的出現取代了Fortran作為程式設計入門語言的地位。 Pascal在工業界也有廣泛的使用。 10、系統語言:C --- 貝爾實驗室的UNIX作業系統,最初版本使用匯編語言寫成,並1970年,在UNIX上實現的第一個高階語言叫做B語言,B的目的是:用於開發UNIX系統程式,以及新版本的UNIX作業系統。B以BCPL語言為基礎。 BCPL,誕生於1967劍橋大寫,它的祖先是1962年誕生誕生於同一所大學的CPL語言。 B和彙編一樣資料型別就是機器字,這極大的限制了B程式在不同位數的機器之間的遷移。B的這種不可一致性導致了C的產生。 C語言就是B的改進版本,同樣以BCPL基礎,誕生引入了Algol 68的特點,使得C語言稱為了一個可移植系統程式語言。 C語言語法中對操作符的大量靈活的使用,極大的印象了後來的一批程式語言。 11、邏輯語言:Prolog --- Prolog誕生於1972年,是邏輯式程式設計的鼻祖。所謂邏輯式程式設計,就是以形式邏輯的方式將計算過程傳遞給計算機。 12、極簡主義:Scheme --- Scheme作為一種Lisp方言,同樣誕生在MIT,時間是1975年。Scheme第一個引入詞法作用域,延續體,閉包等概念。並將資料和函式等同對待。 Scheme的簡約優美使它博得了計算機語言皇后的桂冠,並與另一個以優雅著稱的Pascal一起成為教學語言。 Scheme是函式式語言主要用於數學演算法教學,Pascal是命令式語言主要用於程式設計教學。 13、Algol式語法的函式式語言:ML --- ML誕生於1979年,ML開創了以Algol作語法的函式式語言的先河。 14、強型別惰性純函式式語言:Haskell --- Haskell是1990年標準化Miranda語言的結果。 Miranda誕生於1986年,部分基於ML語言。 Haskell最大的特點是惰性求值。 15、支援面向物件的函式式語言:OCaml --- Caml誕生於1996年,基於ML和Haskell。 OCaml是Caml的面向物件版本,釋出於2006年。 F#是基於OCaml的.NET平臺版本,釋出於2010年。 16、嵌入式語言:Ada --- Ada語言誕生於1980年,是嵌入式系統應用語言。 Ada 83是1983年的標準化版本。 1995年的,Ada 95標準語言在ARM中定義。 Ada的最新版本是Ada 2005。 Ada廣泛的用於商務、國防航空和交通運輸等領域。 17、純面嚮物件語言:Smalltalk --- Smalltalk語言誕生於1980年,是第一個完全支援面向物件程式設計的語言。 Smalltalk源於SIMUAL 67,完善並定義了訊息傳送,和物件的繼承關係。 在Smalltalk中,所有資料都是物件:訊息的傳送者,訊息的接受者,訊息,訊息的結果…。物件的型別是類。類中可以定義方法,屬性等。 18、命令式面嚮物件語言:C++ --- C++誕生於1983年,是在C的基礎上,以SIMUAL 67的方式對指令式程式設計的面向物件擴充套件。C++的成功在於完全相容C的情況下支援了面向物件,從而使面向物件程式設計成為了指令式程式設計的一個子類,傳統的指令式程式設計被叫做面向過程程式設計。 因為對C的完全相容,ASNI在1989年的標準化版本C 89,合併的兩種語言,叫做C/C++。 C/C++的最重要版本是1999年的C 99。幾乎吸收了當時被認為比較有效的計算機語言特性:面向過程程式設計、面向物件程式設計、泛型程式設計、自定義操作符過載等。 C/C++的最新是2011年釋出的C 11。引入的lambda表示式,垃圾回收等機制。 由於C/C++吸收了太多的語言特性,使得C/C++成為世界上最難精通的語言,沒有之一。 C/C++是目前使用人數最多的語言,和它一直競爭的是Java(具體可檢視馬海祥部落格《關於C語言、C++、Java和Python這4種程式開發語言的評價》的相關介紹)。 19、原型面嚮物件語言:Self --- Self誕生於1986年。Self源自於Smalltalk。 Self對面向物件做了深入與研究,提出了“萬物皆物件”的思想。它刪除了面向物件概念中的類的概念認為類也是一種物件;訊息仍然作為最基本操作;把物件的屬性理解為獲取或更改屬性這兩種方法,從而把屬性的概念簡化為方法;取消了變數和賦值,替代它們的是通過訊息來讀槽和寫槽。 在Self中物件建立物件的方式是自我拷貝,所以叫做原型。 Self是原型面嚮物件語言的鼻祖,就像SIMUAL 67是類面向物件語的鼻祖。 20、另一個對C進行面向物件擴充套件的語言:Objective-C --- Objective-C誕生於1983年,後來被蘋果公司選中,和C++相似,也是對C的面向物件擴充套件。所不同的是C++以SIMUAL 67的面向物件為基礎,Objective-C以Smalltalk的面向物件基礎。 Object-C一直伴隨著蘋果公司的作業系統一起發展,這兩年隨著iOS的開發被廣泛使用。 21、對Pascal進行面向物件擴充套件的語言:Delphi --- Delphi誕生於1995年,是對Pascal的面向物件擴充套件,借鑑了C/C++的經驗,但沒有像C/C++後來那樣的瘋狂變化。 22、指令碼語言:Perl --- Perl釋出於1987年。Perl起源於作業系統的控制檯(shell)的命令。使用者將完成某個工作的所有命令儲存在一個sh檔案裡,這樣只要執行這個檔案就可完成對應功能,省去每次都要輸入所有命令的麻煩。sh檔案就叫做指令碼。 指令碼只是一些命令列,可是發展到Perl時已經是一個相當成熟的語言了。 23、關聯列表函式式面向物件指令碼語言:Lua --- Lua誕生於1993年,設計目的是嵌入引用程式,成為其指令碼。Lua以其小巧性著稱。 Lua基於Self和Scheme,它是第一個以關聯列表最為主要資料的函式式語言。 24、虛擬機器面嚮物件語言:Java --- 誕生於1995年的Java 1.0,來自於Sun公司,是第一個在虛擬機器上執行的語言。 再這之前計算機語言要麼:由直譯器解釋執行原始碼(大多數命令式語言),叫做動態語言;要麼:將原始碼編譯連線成實際的計算機指令後再由計算機執行(大多數命令式語言),叫做靜態語言。 Java運行於JM(Java虛擬機器)上,JM和直譯器的區別是:JM會將Java原始碼編譯成位元組碼,然後然後再由JM解釋執行。由於編譯和執行過程是交錯的,所以從外部來看就像是JM直接執行Java原始碼一樣。當然也可以,事先將Java原始檔編譯好,這樣JM就可以直接執行了。 Java 1.0是C++的簡化版本,保留了具有資料型別和類等一小半功能,刪除了結構體,泛型程式設計等一多半的功能(具體可檢視馬海祥部落格《你知道Java內部的這些事兒嗎》的相關介紹)。 Java 5.5 支援了泛型程式設計程式設計。 最新版本是2014釋出的Java 8.0,支援了lambda表示式。 Java是面向物件程式設計使用人數最多的語言。(C/C++的大部分人之使用C部分,即面向過程變成)。 Java的強有力競爭對手是C#。 25、面向物件解釋式指令碼語言:Python --- Python誕生於1989年,作者為了打發聖誕節的無趣,決心開發一個新的指令碼解釋程式,做為 ABC語言的一種繼承。ABC是作者開發的教學語言。 Python和Perl用於相同領域,是面向過程+面嚮物件語言(具體可檢視馬海祥部落格《Python語言程式碼的效能優化方法大全》的相關介紹)。 26、純面向物件解釋式指令碼語言:Ruby --- Ruby誕生於1996年,作者基於對Perl和Python的不滿而設計,的純面向物件指令碼語言。 Ruby基本等於Smalltalk + Lisp。 27、Web伺服器指令碼語言:PHP --- PHP誕生於1994年,是Web伺服器指令碼語言。 PHP和JavaScript的語發相似,都是嵌入在HTML中,只不過一個在伺服器端,一個在瀏覽器端。 28、瀏覽器指令碼語言:JavaScript --- 1995年,網景公司發行的 Netscape Navigator 2.0,它的腳步語言就是JavaScript。 JavaScript和Java沒有任何關係,它的前身是ScriptEase。 ScriptEase的誕生於1992年原名C-minus-minus,是一個足夠強大可以替代巨集操作(macro)的指令碼語言,同時保持與 C足夠的相似性,以便開發人員能很快學會。 ScriptEase基於C和Self語言,支援面向過程和原型面向物件程式設計。 JavaScript後來由引入了Lua語言,支援以關聯列表作為資料格式的函數語言程式設計,這種關聯列表這就是著名的JSON。 最後JavaScript是一個:表面叫Java指令碼,但是和Java沒有任何關係;表面上是一個像C語言一樣的面向過程語言,但實際上是一個原型面嚮物件語言;表面上你建立了一個物件,但其實只是一個關聯列表;表面上你在定義變數和賦值,其實只是<鍵,值>對;表面上你宣告函式,其實只是<鍵,lambda表示式>對。表面上是一個指令式程式設計語言,但本質上是一個以關聯列表為資料格式的函數語言程式設計語言。 29、.NET平臺主語言:C# --- C#於2000年和.NET開發平臺一起由微軟釋出。 C#是.NET開發平臺的主語言。.NET開發平臺包括,執行IL語言的虛擬機器CLR,基於IL語言的公共類庫,用於編譯產生IL語言程式的高階語言,以及支援這些高階語言開發的編譯的基礎開發環境。 由於CLR和IL公共類庫作為Window作業系統的一部分捆綁釋出,所以IL語言程式可以再Window作業系統上直接執行,就行機器指令一樣。 CLR執行IL和JM執行Java一樣,只不過CLR將IL編譯成機器指令,然後在由計算機直接執行,而JM是將Java編譯成位元組碼,然後由直譯器解釋執行。 .NET開發平臺支援多種語言,其中C#是主語言。 C# 1.0 基於Java和C++,以Java為基礎將更多的C++加入進來,並且吸收了一些Delphi和Visual Basic的特性。 C# 2.0 引入泛型程式設計。 C# 4.0支援了lambda表示式,Linq等。 最新版本是2014釋出的C#5.0。 .NET 4.0引入了動態型別,使得.NET平臺可以嵌入動態語言,比如:Lisp、Python、 Ruby等。 30、不再基礎的BASIC:Visual Basic .NET --- Quick BASIC由美國微軟公司開發,1987年推出,它是BASIC的繼承者。 Quick BASIC是DOS下的開發語言,後來隨著Window系統的推出加入了影象化設計所以新的版本改名為:Visual Basic。Visual Basic是第一個支援視覺化介面設計的語言。 1998年釋出的Visual Basic 6.0 是一個應用非常廣泛的版本。 2001年,Visual Basic遷移到了.NET平臺上,改名Visual Basic .NET。Visual Basic .NET對BASIC語言特性進行了重大改進。從此Visual Basic .NET伴隨.NET開發平臺一起發展。 補充,R語言現在是最流行的統計計算語言,是S4語言的免費版本,S語言由貝爾實驗室創造。R語言、3M數學計算語言(Matlab、Mathematica、Maple)、組合語言都未列入名錄。 程式語言的歷史資訊圖表:Java 才是現任霸主 --- ![](https://i.imgur.com/jXYJuwW.png) 愛達·勒芙蕾絲(Ada Lovelace)是大家公認的首位電腦程式設計師,也開創了世上首上程式語言,從 1843 年至今,程式語言的發展至今已近 170 年的歷史了,在美國現今約有 120 萬以上的相關從業人員,程式也發展出不同的語言,不過根據 Veracode 的調查來看,Java 才是目前最多人使用的程式語言。 Java 與 C 語言持續熱門 --- ![](https://i.imgur.com/VasFil7.png) 從表中可以看到,從 Veracode 透過全球程式人員的統計、課程與第三方套件的資料統計數據手來分析目前市場中程式語言的熱門程度,當然,這個數值並非絕對準確,但也代表著某種趨勢。直至 2013 年 3 月為止,Java 仍是世界上最多人使用的程式語言,比例達到 18.156%,且比去年同前相比還成長了 1.05% 之多。 排行第二的則是 C 語言,與去年排行相同,比例只比 Java 略少 17.141%,與去年相比小幅成長了 0.05%。第三名則是蘋果的 Objective C 則是前十名中成長最多的,從去年的第五名一路爬到第三名,成長了 2.49%,比例為 10.230%,看來受到 iOS 裝置市場依然受重視下,Objective C 也就不斷成長,以其目前比例來說要追上前兩名恐怕還是有點困難。 第四名為 C++,與去年維持相同排名,使用比例也成長了 1.07。第五名的 C# 則是在前十名唯一下滑且仍在榜中的程式語言(有一個程式語言直接從第 8 名滑出前十名,Veracode 並未列出),下滑幅度為 1.65%。其他維持相同排名還有 PHP、(Visual)Basic 與 Perl,上升的則有 Pytohon 與 Ruby,而 Ruby 則更是排名上升最多的,由去年的 13 名躍升至第 9 名。 程式語言的歷史 === 1957 至1959 年 --- ![](https://i.imgur.com/kd0lCf8.png) FORTRAN、LISP 與 COBOL 是這時期誕生的程式語言,也是目前仍在使用的老一輩程式語言,這類的高階程式語言是為科學家、數學家與大型商業電腦所設計的,其主要的使用族群為大型超級電腦、AI 人工智慧與商業軟體。NASA 美國太空總署、信用卡與 ATM 自動櫃員機都用過這類的程式語言。 Cobol 的部分原始程式碼曾出現在電影《魔鬼終結者(Terminator)》中機械終結者的視覺螢幕中,做為其啟動使用的特效效果。 1970 年 --- ![](https://i.imgur.com/OAXtwGl.png) PASCAL 於這一年由尼克勞斯·維爾特(Niklaus Wirth)所創造出來,同樣為高階程式語言,主要是針對程式教學結構與資料結構為主要發展目的,其商業版本在 1980 年代廣泛的被採用,特別是其洐生的物件導向分支 Object Pascal 就常被用來做 Windows 的應用程式開發上。蘋果於 1983 年推出的 Lisa 個人電腦與知名的 Skype 也用了這個程式語言。 1972 年 --- ![](https://i.imgur.com/xxfpfg6.png) 著名的 C 語言是在這年誕生的,由貝爾實驗室的丹尼斯·里奇(Dennis Ritchie)以早期的 B 語言為基礎所開創出來的,是為了在早期的電腦上執行 UNIX 系統所開創出來的,並做為通用開發的低階程式語言。C 語言有著眾多分支版本,且都相當的知名且使用者多,如 C#、Java、Javascript、Perl、PHP 與 Python 等均是。其主要運用在跨平台的應用程式、系統程式、UNIX 程式與遊戲軟體的開發上,使用相當廣泛,早期 WWW 網際網路伺服器也是以 C 語言在 1973 年重新撰寫的 UNIX 上運作的。 1983 年 --- ![](https://i.imgur.com/BfQdEi8.png) C++ 早期被稱之為「C with Classes(包含型別的 C 語言)」,同樣由貝爾實驗室的比雅尼·史特勞斯特魯普(Bjarne Stroustrup)發明,其後才另命名為 C++,其「+」表示為增強之意,C++ 屬中階程式語言,加強了 C 語言中的 Classes(型別)、虛擬函式、模版等功能。它也被廣泛的使用在應用軟體、嵌入式軟體、伺服器軟體與電視遊樂器中的遊戲開發中,從 Adobe、Google Chrome、Mozilla、Microsoft Internet Explorer(IE)等,使用的都是 C++。 有趣的是,另有名為「C+」的程式語言,不過 C+ 卻與 C/C++ 無關。 1983 年 Objective-C 同樣是洐生至 C 語言的程式語言,由 Stepstone 公司的創辦人布萊德·考克斯(Brad Cox)與湯姆·勒(Tom Love)共同發明,屬於通用、高階的程式語言,其並加入了物件導向與 Smalltalk 語言的訊息傳遞風格。Objective-C 最早由蘋果公司創辦人 Steve Jobs 另創的 NeXT 公司買下授權並做為 NeXTSTP 系統的使用者界面與開發的環境的基礎。 在 NeXT 被蘋果併購後,NeXTSTEP 的架構成為 OS X 與行動裝置上的 iOS 的核心後,Objective-C 也就成了蘋果公司開發軟體的主要程式語言,iPhone/iPad 於市場熱銷下,Objective-C 的知名度與使用者也大幅增加。 1987 年 --- ![](https://i.imgur.com/Yygxgio.png) Perl 為通用型的高階程式語言,其一開始是 Unisys 的拉里·沃爾(Larry Wall)為了在 UNIX 系統上處理報表更為方便而開創的,Perl 的高性能與靈活度佳被廣為稱道,甚至有程式語言的瑞士刀之稱,其應用範圍很廣,在 CGI、資料庫軟體、系統管理、網路程式與圖形程式都適用,因此著名的電影資料庫網站 IMDB、線上購物王者亞馬遜(Amazon)與 Pirceline、Ticketmaster 都採用了 Perl。 Perl 本來打算以「Pearl」為名,是以 Larry Wall 的妻子 Gloria 來命名,在發現已有其他以 Peral 為名的程式語言後,只好更名成 Perl。當年 O’Reilly 出版社的出版的《Programming Perl》一書中封面圖片使用了一隻駱駝圖片,也讓駱駝成為 Perl 非官方的代表標誌。 1991 年 --- ![](https://i.imgur.com/zFMGZLB.png) Python 是Guido van Rossum(Guido van Rossum)於 CWI(Centrum Wiskunde & Informatica;國家數學和計算機科學研究學會)任職時為了打發時間而開發出來的,其名字則來自其喜愛的英國電視喜劇《Monty Python’s Flying Circus(蒙提·派森的飛行馬戲團)》,也是一個通用型的高階程式語言。Python 可用來支援各種不同的程式且易於使用,明確、簡單、結構又清楚的語法是其特性。 在 Web 軟體、軟體開發與資訊安全方面有諸多應用,Google、Yahoo 與線上音樂平台 Spotify 都有採用。而 Python 如同其語言名稱來自喜劇一般,Python 的練習範例中,就有許多源自 Monty Python 的惡搞,如用 Spam 火腿與雞蛋來取代傳統的 foo 與 bar。 1993 年 --- ![](https://i.imgur.com/bUol1JQ.png) 以創造人松本行弘(Yukihiro Matsumoto)的誕生石為名的 Ruby 是這幾年頗為當紅的程式語言,也是統計中成長最快的,其受 Perl、Ada、Lisp、Smalltalk 等程式語言影響很大,是為了更快效率並讓程式的編寫更為愉快而開創的。 Ruby 其通用、高階語言的特性多用於 Web 程式開發,以及近來頗知名的 Ruby on Rails 這個開源版的 Web 開發框架上。著名的 Twitter、線上串流影音服務 Hulu 與 Groupon 都有採用。Ruby 從 Perl 借用了不少東西,開發者自己也認為 Ruby 這名做為接續 Perl 之後的程式語言其實頗為恰當,甚至 Perl 之父也喜歡 Ruby,還從中借了操作符號加入 Perl 6 中。 1995 年 --- ![](https://i.imgur.com/UpslIrr.png) 與咖啡同名的 Java,其名字也真的來自咖啡,只因昇陽工程師詹姆斯·高斯林(James Gosling)覺得在開發此一程式語言時需要耗掉大量的咖啡。其實 Java 本來要命名為 Oak,只不過名稱已被先行註冊,只好更名為 Java。 Java 一開始是為了互動電視的專案而開發,是一個高階通用型的程式語言,其跨平台的特性是最大的特色,在網路程式、Web 應用軟體開發、使用者圖形界面開發等應用都有被採用。為網路而設計的 Java 目前在瀏覽器上的地位式微,不過在 Android 採用了 Java 為系統並做為應用軟體開發平台下,Java 反而成為目前最受歡迎的開發程式語言。 1995 年 PHP 的原文其實是 Personal Home Page 個人首頁,是開創者拉斯姆斯·勒多夫(Rasmus Lerdorf)為了要維護個人網頁所開發的程式集,由於可以組成動態的網頁,在釋出後經各方改寫另外更名成了現今的 Hypertext Preprocessor 超文字預處理器。 ![](https://i.imgur.com/Cg3svNV.png) PHP 為一個開源通用的語言,主要用來建構動態網頁,也是廣為各企業使用在網頁中的開源軟體,無論是 Facebook、維基百科、Digg、WordPress 與 Joomla 都採用了 PHP。各版本的 PHP 在網址後加上「?=PHPE9568F36-D428-11d2-A769-00AA001ACF42」的字串,會各自呈現不同的標誌,算是一個小小又有趣的彩蛋。 ![](https://i.imgur.com/ATcZqaQ.png) 1995 年 JavaScript 是屬於高階語言,是由網景 Netscape 的布蘭登·艾克(Brendan Eich)為了添增網頁功能而設計而發明的,可用在動態網頁中提交、確認表格資料,創造互動、動畫,或是追踪使用者行為。除了動態網頁的開發外,PDF 文件、瀏覽器與桌面小工具都可利用 JavaScript 來開發。Gmail、Adobe Photoshop 與 Mozilla Firefox 等產品中都有用到 JavaScript。 JavaScript 雖然名字中也有 Java 的名稱,但其語法結構與出身其實與 Java 一點關係都沒有,只是單純的當初想讓他外表的樣子如同 Java 一般,其原始開發時的代號名稱其實是 Mocha 及 LiveScript。 安全漏洞大不同 --- 在圖表的最後,Veracode 也列出了各程式言容易產生安全漏洞的統計,可以讓程式開者參考一下不同的開發程式產生漏洞的主因來源何在,以及幾個增加程式安全的小技巧。 ![](https://i.imgur.com/TdLEQnU.jpg) ![](https://i.imgur.com/RmB4bzV.jpg) ![](https://i.imgur.com/0GWiIhJ.jpg) [The History of Programming Languages Infographic](http://blog.newrelic.com/2013/06/03/the-history-of-programming-languages-infographic-from-veracode/)