我們都知道,編程語言是一組用來定義計算機程序的語法規則。它是一種被標準化的交流語言,用來向計算機發出指令。一種計算機語言讓程序員能夠準確地定義計算機所需要使用的數據,並精確地定義在不同情況下所應當採取的行動。儘管人們多次試圖創造一種通用的程序設計語言,卻沒有一次嘗試是成功的。之所以有那麼多種不同的編程語言存在的原因是設計程序語言的初衷不同,對語言學習曲線的追求不同,不同程序之間的運行成本差異等。
下面這張圖片描繪了整個編程語言的歷史。包括各種編程語言的發明人,編程語言的特點和適用領域,被什麼網站或公司使用等。
編程語言的歷史早於真正意義的計算機的出現。19世紀就有"可編程的"織布機和鋼琴彈奏裝置出現,它們都是領域特定語言(DSL)的樣例。
編程語言發展的編年史
我們一個統計出來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。
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程序本身就是對象。」當被問到對象是由 什麼組成時,他回答到:「對象。」當再一次被問到這個問題時,他說「看,它從裡到外都是對象。直到你抽出一隻烏龜。」
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,一種結合 了面向對象和函數式編程的語言。這同時激怒了兩個陣營的忠實信徒,他們立刻宣布要發動聖戰燒死異教徒。
學習新的編程語言的12種方法
聽說,你決定要為你的 「技能樹」 再添加一門特定的編程語言。那該怎麼辦呢?
在這篇文章中,作者提出了 12 項關於學習技術的建議。記住每個人學習的方式都不一樣。其中一些可能對你十分有用,而其他的則可能無法滿足你的需求。如果你開始擔心一個策略,請嘗試另一個策略並看看它哪裡適合你。
1. 將其與類似的語言進行比較。當你首次觀看有關該語言的第一個教程或閱讀代碼時,請嘗試猜測該語言的每個部分將會做什麼,並檢查你的判斷是否正確。
如果記筆記可以幫助你整合信息,請拿起一張紙並記下三個列表:
看起來很熟悉的東西,並且做了預期中的事
看起來很熟悉的東西,但做了意料之外的事
看起來完全是新的東西
例如,如果我用來自 Python 和 C 背景的 Rust 代碼進行此練習,那麼在第一個列表中,我會放上用於表示範圍的花括弧,!(看起來像是布爾類型的 非,但實際上是 Rust 中的宏定義)則放在第二個列表,類型簽名語法(type signature syntax)放在第三個列表。
如果你保留著初始列表的副本,一旦你更熟練,可使用它通過語言反思你的進展,並提醒自己在嘗試向其他人講授該語言時,有哪些看起來不熟悉的概念。
2. 閱讀語言的官方文檔。如果希望在使用之前吸收大量信息,從閱讀語言的參考資料中可能會受益。不用擔心它們會對你催眠,參考文獻通常是用於查找使用,而不是用來記憶。
3. 使用互聯網搜索。搜索網路是一個很好的方式,可提供有關特定錯誤和一般最佳做法的信息。當收到錯誤信息時,應搜索信息中看起來是錯誤的獨一無二的部分,但不是代碼唯一的部分。例如,如果錯誤提示 "Error on line 53: Invalid argument exception(錯誤在第 53 行:無效的參數異常)",以語言名稱和字元串 「Invalid argument exception」 這樣的組合搜索,以找到最佳的結果。記住要將錯誤信息中的所有引用內容都包含在內。
還可以在網路中搜索有關解決語言中特定問題的最佳做法的博文。評估搜索結果中顯示的博客帖子的質量和決定認真採用他們的建議時,請查看作者的公共代碼組合以及發布日期。
4. 與社區接觸。雖然博客和新聞文章具有大量有用的信息,但是你嘗試編寫的特定代碼片段總會有些微妙之處。不要害怕在郵件列表中發帖,或加入 IRC 和 Slack 頻道以尋求幫助。
要提出有幫助的回復的問題,請確保在正確的地方提問。許多語言都有 「初學者」 郵件列表或聊天頻道,專門針對可能會頻繁詢問的問題而建立。當提出問題時,請務必先總結準備做什麼、已做過的東西以及發生的情況。盡量為專家提供足夠的上下文來了解問題,但不需要無關緊要的細節。提出問題后,請務必堅持一段時間來聽取建議或會回答你的疑問可能產生的後續問題。
5. 編寫玩具程序。一次練習一個新的概念,很少有任務可打敗只使用某個概念的玩具程序。你可以將重點放在儘可能讓你的代碼清潔和慣用性上。如果你將解決 Project Euler 或 Rosetta Code puzzle 作為玩具程序,則可以將你的解決方案與其他使用相同語言編寫的解決方案進行比較。
6. 使用該語言編寫 「生產就緒(Production-Ready)」 的代碼。玩具程序是一個很好的第一步,但在更逼真的的環境中使用一門語言可幫助探索其現實使用中的優勢和挑戰。考慮將一個熟悉的、相對較小的、經過良好測試的程序移植到新的語言,以探索其在現實使用的應用。
7. 閱讀一本關於這門語言的書籍。如果有好幾本有用的書,比較它們的評論,並考慮哪位作者的背景和自己的最相似。現在有很多電子書可以免費在線閱讀。
在購買有關該語言的書籍之前,請先查看書籍出版的日期以及其示例所涵蓋的語言版本。如果使用的是較舊的書籍,請務必使用其所使用的語言版本的示例。還要在網上調查一下,以了解自出版以來語言發生了怎樣的變化。
8. 觀看講座和課程。如果你學習的語言在在線課堂中有講授,那麼視頻應該是公開的。除了學術講座之外,還可以考慮尋找錄製講座、會議談話和有關該語言的博客。當在看電視時,談談你的新語言是一個將學習融入日常生活很好的方式。
9. 閱讀示例代碼。大多數關於編程語言的書籍都會包含代碼片段。你也可以在博客和 Rosetta Code 上找到示例代碼。運行示例代碼、修改它們,並嘗試預測修改後會發生那些情況。
10. 閱讀生產代碼。查找有關該語言所有類型和大小的項目的一種方法是在 GitHub 上搜索它。按最受歡迎或最具影響力進行排序,你的熱門搜索將包括最受歡迎的開源工具。如果想要了解開源項目的設計,可通過郵件列表或 IRC 來與社區進行互動。你甚至可能會發現一些 bug。
11. 尋找好的工具。當使用新的語言時,可向其更有經驗的用戶請教,詢問他們的開發環境。你可能會發現,一個特定的文本編輯器或 IDE 對於新語言的支持比你習慣通常使用的要好。調查在新語言生態系統中管理依賴關係、格式化、模糊化和單元測試代碼的選項。
12. 保持你的熱情。入門新的語言很容易,但變得真正精通它通常是一個需要多年的旅程。慶祝一路上你的成功,並與追隨你腳步的學習者分享你所學到的知識,保持著學習編程的興趣。
C2如何加入學會
註冊學會會員:
個人會員:
(c2_china),回復「個人會員」獲取入會申請表,按要求填寫申請表即可,如有問題,可在公眾號內進行留言。通過學會審核後方可在線進行支付寶繳納會費。
單位會員:
(c2_china),回復「單位會員」獲取入會申請表,按要求填寫申請表即可,如有問題,可在公眾號內進行留言。通過學會審核後方可繳納會費。
學會近期活動
1. CICC企業會員交流會
會議時間:(具體時間詳見後續通知)
2.2017首屆全國兵棋推演大賽
2017年6月
長按下方學會二維碼,關注學會微信
感謝關注