一張圖概括程式語言發展史

一張圖概括程式語言發展史

一張圖

程式語言是一組用來定義計算機程式的語法規則。它是一種被標準化的交流語言,用來向計算機發出指令。一種計算機語言讓程式設計師能夠準確地定義計算機所需要使用的資料,並精確地定義在不同情況下所應當採取的行動。儘管人們多次試圖創造一種通用的程式設計語言,卻沒有一次嘗試是成功的。之所以有那麼多種不同的程式語言存在的原因是設計程式語言的初衷不同,對語言學習曲線的追求不同,不同程式之間的執行成本差異等。

下面這張圖片描繪了整個程式語言的歷史。包括各種程式語言的發明人,程式語言的特點和適用領域,被什麼網站或公司使用等。

lang-history

編年史

我們一個統計出來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,一種結合 了物件導向和函數語言程式設計的語言。這同時激怒了兩個陣營的忠實信徒,他們立刻宣佈要發動聖戰燒死異教徒。


  • 轉載自微信公眾號 STEAM解密