目錄程序員
最先的程序設計都是採用機器語言來編寫的,直接使用二進制碼來表示機器可以識別和執行的指令和數 據。簡單來講,就是直接編寫 0 和 1 的序列來表明程序語言。例如:使用 0000 表明 加載(LOAD),0001 表明 存儲(STORE)等。算法
機器語言由機器直接執行,速度快,但一個很明顯的缺點就是:寫起來實在是太困難了,一旦你發現本身寫錯了,改起來更蛋疼!這樣直接致使程序編寫效率十分低下,編寫程序花費的時間每每是實際運行時間的幾十倍或幾百倍。數據庫
有一個關於機器語言和比爾蓋茨的笑話,是說比爾蓋茨拿着繡花針在一張光盤上戳,把 Windows 給戳出 來了!但若是真的讓你去戳,不要說 Windows,連一個簡單的「Hello world」都要讓人戳到眼睛冒煙!編程
因爲機器語言實在是太難編寫了,因而就發展出了彙編語言。彙編語言亦稱符號語言,用助記符代替機器 指令的操做碼,用地址符號(Symbol)或標號(Label)代替指令或操做數的地址,。彙編語言因爲是採用 了助記符號來編寫程序,比用機器語言的二進制代碼編程要方便些,在必定程度上簡化了編程過程。例如 使用 LOAD 來代替 0000,使用 STORE 來代替 0001。小程序
即便彙編語言相比機器語言提高了可讀性,但其本質上仍是一種面向機器的語言,編寫一樣困難,也很容 易出錯。相信不少計算機畢業的學生至今都對學校的彙編課程中的練習程序心有餘悸。安全
面向機器的語言一般狀況下被認爲是一種「低級語言」,爲了解決面向機器的語言存在的問題,計算機科 學的前輩們又建立了面向過程的語言。面向過程的語言被認爲是一種「高級語言」,相比面向機器的語言 來講,面向過程的語言已經再也不關注機器自己的操做指令、存儲等方面,而是關注如何一步一步的解決具體的問題,即:解決問題的過程,這應該也是面向過程說法的來由。網絡
相比面向機器的思想來講,面向過程是一次思想上的飛躍,將程序員從複雜的機器操做和運行的細節中解 放出來,轉而關注具體須要解決的問題;面向過程的語言也再也不須要和具體的機器綁定,從而具有了移植 性和通用性;面向過程的語言自己也更加容易編寫和維護。這些因素疊加起來,大大減輕了程序員的負擔, 提高了程序員的工做效率,從而促進了軟件行業的快速發展。框架
典型的面向過程的語言有:COBOL、FORTRAN、BASIC、C 語言等。dom
根本緣由就是一些面向過程語言中的goto語句致使的麪條式代碼,極大的限制了程序的規模。結構化程序設計(英語:Structured programming),一種編程範型。它採用子程序(函數就是一種子程序)、代碼區塊、for循環以及while循環等結構,來替換傳統的goto。但願藉此來改善計算機程序的明晰性、質量以及開發時間,而且避免寫出麪條式代碼。編程語言
隨着計算機硬件的飛速發展,以及應用複雜度愈來愈高,軟件規模愈來愈大,原有的程序開發方式已經越 來越不能知足需求了。1960 年代中期開始爆發了第一次軟件危機,典型表現有軟件質量低下、項目沒法 如期完成、項目嚴重超支等,由於軟件而致使的重大事故時有發生。例如 1963 年美國 (http://en。wikipedia。org/wiki/Mariner_1) 的水手一號火箭發射失敗事故,就是由於一行 FORTRAN 代碼 錯誤致使的。
軟件危機最典型的例子莫過於 IBM 的 System/360 的操做系統開發。佛瑞德·布魯克斯(Frederick P。 Brooks, Jr。)做爲項目主管,率領 2000 多個程序員夜以繼日的工做,共計花費了 5000 人一年的工做量,寫出將 近 100 萬行的源碼,總共投入 5 億美圓,是美國的「曼哈頓」原子彈計劃投入的 1/4。儘管投入如此巨大, 但項目進度卻一再延遲,軟件質量也得不到保障。布魯克斯後來基於這個項目經驗而總結的《人月神話》 一書,成了史上最暢銷的軟件工程書籍。
爲了解決問題,在 196八、1969 年連續召開兩次著名的 NATO 會議,會議正式創造了「軟件危機」一詞, 並提出了針對性的解決方法「軟件工程」。雖然「軟件工程」提出以後也曾被視爲軟件領域的銀彈,但後 來事實證實,軟件工程一樣沒法解決軟件危機。
差很少同一時間,「結構化程序設計」做爲另一種解決軟件危機的方案被提出來了。 Edsger Dijkstra 於 1968 發表了著名的《GOTO 有害論》的論文,引發了長達數年的論戰,並由此產生告終構化程序設計方 法。同時,第一個結構化的程序語言 Pascal 也在此時誕生,並迅速流行起來。
結構化程序設計的主要特色是拋棄 goto 語句,採起「自頂向下、逐步細化、模塊化」的指導思想。結構 化程序設計本質上仍是一種面向過程的設計思想,但經過「自頂向下、逐步細化、模塊化」的方法,將軟 件的複雜度控制在必定範圍內,從而從總體上下降了軟件開發的複雜度。結構化程序方法成爲了 1970 年 代軟件開發的潮流。
科學研究證實,人腦存在人類短時間記憶通常一次只能記住 5-9 個事物,這就是著名的 7+- 2 原理。結構化 程序設計是面向過程設計思想的一個改進,使得軟件開發更加符合人類思惟的 7+-2 特色。
結構化編程的風靡在必定程度上緩解了軟件危機,然而好景不長,隨着硬件的快速發展,業務需求愈來愈複雜,以及編程應用領域愈來愈普遍,第二次軟件危機很快就到來了。
第二次軟件危機的根本緣由仍是在於軟件生產力遠遠跟不上硬件和業務的發展,相比第一次軟件危機主要 體如今「複雜性」,第二次軟件危機主要體如今「可擴展性」、「可維護性」上面。傳統的面向過程(包括 結構化程序設計)方法已經愈來愈不能適應快速多變的業務需求了,軟件領域迫切但願找到新的銀彈來解 決軟件危機,在這種背景下,面向對象的思想開始流行起來。
面向對象的思想並非在第二次軟件危機後纔出現的,早在 1967 年的 Simula 語言中就開始提出來了,但 第二次軟件危機促進了面向對象的發展。 面向對象真正開始流行是在 1980s 年代,主要得益於 C++的功 勞,後來的 Java、C#把面向對象推向了新的高峯。到如今爲止,面向對象已經成爲了主流的開發思想。
雖然面向對象開始也被當作解決軟件危機的銀彈,但事實證實,和軟件工程同樣,面向對象也不是銀彈, 而只是一種新的軟件方法而已。
雖然面向對象並非解決軟件危機的銀彈,但和麪向過程相比,面向對象的思想更加貼近人類思惟的特色, 更加脫離機器思惟,是一次軟件設計思想上的飛躍。
圖:霍列瑞斯式的打孔機(pantograph),用於1890年的人口普查。
第一個編程語言比現代的計算機還早誕生。首先,這種語言是種編碼(en:code)。
於1801年發明的提花織布機(或稱甲卡提花織布機),運用打孔卡上的坑洞來表明縫紉織布機的手臂動做,以便自動化產生裝飾的圖案。
愛達·勒芙蕾絲在1842年至1843年間花費了九個月,將意大利數學家Luigi Menabrea關於查爾斯·巴貝奇新發表機器分析機的回憶錄翻譯完成。她於那篇文章後面附加了一個用分析機計算伯努利數方法的細節,被部分歷史學家認爲是世界上第一個電腦程序。
Herman Hollerith在觀察列車長對乘客票根在特定位置打洞的方式後,意識到他能夠把信息編碼記載到打孔卡上,隨後根據這項發現使用打孔卡來編碼並紀錄1890年的人口統計數據。
第一個計算機代碼是針對他們的應用面設計的。在20世紀的前十年主要是用十進制來算數,後來人們發現不僅是用文字,也能夠用數字來表現邏輯。舉例來講,阿隆佐·邱奇曾以公式化(formulaic)的方式表達λ演算。圖靈機是一種紙帶標記(tape-marking)機器(就像電話公司用的那種)操做方法抽象化後的集合。圖靈機這種經過有限數字(finite number)呈現機器的方式,奠基了程序如同馮·諾伊曼結構計算機中的數據同樣地存儲的基礎。但不一樣於λ演算,圖靈機的代碼並無辦法成爲高級編程語言的基石,這是是由於它主要的用途是分析算法的複雜度。
就像許多歷史上的"第一次"同樣,第一個現代編程語言也很難界定。最一開始是由於硬件限制而限定了語言,打孔卡容許80行(column)的長度,但某幾行必須用來記錄卡片的順序。FORTRAN則歸入了一些與英文字詞相同的關鍵字,像是"IF"、"GOTO"(原字詞爲go to),以及"CONTINUE"。以後採用磁鼓(magnetic drum)做爲存儲器使用,也表明計算機程序也必須插入(interleave)到磁鼓的轉動(rotation)中。和現今比較起來,這也讓編程語言必須更加依賴硬件(hardware-dependent)。
對部分的人認爲必須在"編程語言"的狀態確立以前,根據能力(power)以及可讀性(human-readability)的程度來決定歷史上第一個編程語言是什麼語言。提花織布機和查爾斯·巴貝奇所製做的差分機(en:Difference Engine)都具有在大量限制下,簡單描述機器應運行行爲的語言。也有種並不是設計給人類運用的受限特定領域語言(en:domain-specific language),是將打孔卡運用到自動演奏鋼琴(en:player piano)上。
最先被確認的現代化、電力引導(electrically powered)的計算機約在1940年代被創造出來。程序員在有限的速度及存儲器容量限制之下,撰寫人工調整(hand tuned)過的彙編語言程序。並且很快就發現到使用匯編語言的這種撰寫方式須要花費大量的腦力(intellectual effort)並且很容易出錯(error-prone)。
康拉德·楚澤於1948年發表了他所設計的Plankalkül編程語言的論文[1]。可是在他有生之年卻未能將該語言實現,而他本來的貢獻也被其餘的發展所孤立。
在這段期間被開發出來的重要語言包括有:
有三個現代編程語言於1950年代被設計出來,這三者所派生的語言直到今日仍舊普遍地被採用:
另外一個1950年代晚期的里程碑是由美國與歐洲計算機學者針對"算法的新語言"所組成的委員會出版的ALGOL 60報告(名稱取自"ALGOrithmic Language"(算法語言))。這份報告強化了當時許多關於計算的想法,並提出了兩個語言上的創新功能:
另外一個創新則是關於語言的描述方式:
一種名爲巴科斯-諾爾範式 (BNF)的數學化精確符號被用於描述語言的語法。以後的編程語言幾乎所有都採用相似BNF的方式來描述程序語法中上下文無關的部分。
Algol 60對以後語言的設計上帶來了特殊的影響,部分的語言很快的就被普遍採用。後續爲了開發Algol的擴充子集合,設計了一個名爲Burroughs(en:Burroughs large systems)的大型系統。
延續Algol的關鍵構想所產生的成果就是ALGOL 68:
Algol 68一些較少被使用到的語言功能(如同步與並行區塊)、語法快捷方式的複雜系統,以及類型自動強制轉換(coercions),使得實現者興趣缺缺,也讓Algol 68得到了很難用(diffcult)的名聲。尼克勞斯·維爾特就乾脆離開該設計委員會,另外再開發出更簡單的Pascal語言。
在這段期間被開發出來的重要語言包括有:
1960年代晚期至1970年代晚期的期間中,編程語言的發展也有了重大的成果。大多數如今所使用的主要語言範式都是在這段期間中發明的:
這些語言都各自演展出本身的家族分支,現今多數現代編程語言的祖先均可以追溯他們其中至少一個以上。
在1960年代以及1970年代中結構化程序設計的優勢也帶來許多的爭議,特別是在程序開發的過程當中徹底不使用GOTO。這項爭議跟語言自己的設計很是有關係:某些語言並無包含GOTO,這也強迫程序員必須結構化地編寫程序。儘管這個爭議在當時吵翻了天,但幾乎全部的程序員都贊成就算語言自己有提供GOTO的功能,在除了少數罕見的狀況下去使用GOTO是種不良的程序風格。結果是以後世代的編程語言設計者發覺到結構化編程語言的爭議實在既乏味又使人眼花撩亂。
在這段期間被開發出來的重要語言包括有:
1980年代的編程語言與以前相較顯得更爲強大。C++合併了面向對象以及系統程序設計。美國政府標準化一種名爲Ada的系統編程語言並提供給國防承包商使用。日本以及其餘地方運用了大量的資金對採用邏輯編程語言結構的第五代語言進行研究。函數編程語言社區則把焦點轉移到標準化ML及Lisp身上。這些活動都不是在開發新的範式,而是在將上個世代發明的構想進一步發揚光大。
然而,在語言設計上有個重大的新趨勢,就是研究運用模塊或大型組織化的程序單元來進行大型系統的開發。Modula、Ada,以及ML都在1980年代發展出值得注意的模塊化系統。模塊化系統常拘泥於採用泛型程序設計結構:泛型存在(generics being)、本質(essence),參數化模塊(parameterized modules)。(參閱多態)
儘管沒有出現新的主要編程語言範式,許多研究人員仍就擴充以前語言的構想並將它們運用到新的內容上。舉例來講,Argus以及Emerald系統的語言配合面嚮對象語言運用到分佈式系統上。
1980年代的編程語言實現狀況也有所進展。計算機系統結構中RISC的進展假定硬件應當爲編譯器設計,而非身爲人類的彙編語言程序員。藉由中央處理器速度增快的幫助,編譯技術也愈來愈積極,RISC的進展對高級語言編譯技術帶來不小的關注。
語言技術持續這些發展並邁入了1990年代。
在這段期間被開發出來的重要語言包括有:
1990年代未見到有什麼重大的創新,大多都是之前構想的重組或變化。這段期間主要在推進的哲學是提高程序員的生產力。許多"快速應用程序開發" (RAD) 語言也應運而生,這些語言大多都有相應的集成開發環境、垃圾回收等機制,且大可能是先前語言的派生語言。這類型的語言也大可能是面向對象的編程語言,包含有Object Pascal、Visual Basic,以及C#。Java則是更加保守的語言,也具有垃圾回收機制。與其餘相似語言相比,也受到更多的觀注。新的腳本語言則比RAD語言更新更好。這種語言並不是直接從其餘語言派生,並且新的語法更加開放地(liberal)與功能契合。雖然腳本語言比RAD語言來的更有生產力,但大多會有由於小程序較爲簡單,可是大型程序則難以使用腳本語言撰寫並維護的顧慮。儘管如此,腳本語言仍是網絡層面的應用上大放異彩。
在這段期間被開發出來的重要語言包括有:
編程語言持續在學術及企業兩個層面中發展進化,目前的一些趨勢包含有:
在這段期間被開發出來的重要語言包括有:
參考資料:https://zh。wikipedia。org/zh-cn/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80%E6%AD%B7%E5%8F%B2