在咱們學習了多年面向對象的思想以後,回過頭來,看看面向對象是如何發展起來的,應該是一個很是有意思的事情。編程
面向對象(Object Oriented)編程技術最早被普遍使用的語言是C++,Bjarne Stroustrup寫的《The Design and Evolution of C++》(中文名: C++語言的設計和演化)中,詳細地描述瞭如何將C語言轉變成支持對象編程的C++語言。但是要真正瞭解面向對象的起源,還得往前追溯。架構
我常常問一個傻問題,那個時代,若是不出現面向對象技術,是否是會出現其餘技術?但回顧一下歷史,你或許會認爲,這是一個必然趨勢。只是有可能名稱有所變化而已。編程語言
面向對象技術的提出,最先是在編程語言Simula中提出的。其做者是Ole-Johan Dahl and Kristen Nygaard。Simula語言是兩個語言的統稱: SimulaI 和Simula 67(Simula 67 是在1967年發佈的)。Simula語言是公認的最先的面嚮對象語言,雖然他的實現並非很完整。但這是語言發展史上的一個重要的里程碑。ide
Kristen Nygaard在編寫一個計算機模擬系統的時候,感受到他必須找到一個更好的方式來描述和操做系統。後來Ole-Johan Dahl也加入了這個工做中來。在1962年,Kristen Nygaard在訪問Univac的時候,對當時的Uniac的系統架構師Robert Bemer第一次提出了Simula中的想法,並在Robert Bemer邀請參加的第二屆IFIP上,發表了《SIMULA -- An Extension of ALGOL to the Description of Discrete-Event Networks》。函數
在1966年,Dahl 和Nygaard 發表了關於在Simula中提出類(Class)和子類(SubClass)的概念。這些概念後來被應用到Simula 67中。1967年6月的一個會議上,Dahl建議對Type和Class概念進行明肯定義,這引起了一次認真嚴謹的討論,爲語言的標準化奠基了基礎。並在1968年2月份成立SIMULA Standards Group (SSG)來進行標準化工做。學習
雖然Simlua是第一個實現的面嚮對象語言,但並非第一個完整實現的,這點通常公認爲Smalltalk語言。Smalltalk雖然並無被普遍使用,但它對面向對象技術的推廣起了很是大的做用。lua
Smalltalk是一個支持面向對象、動態類型、類型反射的程序語言。是Alan Kay at Xerox Palo Alto Research Center (PARC)中發明的。Alan Kay設計的系統, Dan Ingalls實現的系統。實現的版本有不少,都是在20世紀的70年代。第一個版本是Smalltalk-71。Alan Kay在設計的時候,借用了Simula的message passing思想。操作系統
在Smalltak-76的版本中,加入了inheritance。在Smalltak-80中增長了meteclasses。這實現了一個思想:一切皆對象。Smalltak-80做爲第一個給PARC外界使用的版本。而現今流行的版本,也大可能是這個版本的後續版本。設計
在面嚮對象語言中,C++是第一個被普遍使用的面嚮對象語言。C++是一個從C語言演化過來的支持面向對象編程的程序語言。Bells實驗室的Strustrup在1979年開始了這個跨時代的工做。對象
剛開始的版本叫:C with Classes。1983年10月份的時候正式命名爲C++。1990年5月,Borland C++發佈了第一個版本,同年6月和11月,Templates和Exceptions被接受。1992年3月,MircorSoft C++發佈了第一個版本。
相比於Simula和Smalltalk,C++的成功,從必定意義上說歸結於標準組織的創建和Borland公司和MicroSoft公司普遍推廣。成就了C++在面向對象編程語言中的重要位置。
在C++以後,影響巨大的就是Java和C#語言了。這兩個語言都引入了虛擬機的概念。另外一方面,也是更純粹的面嚮對象語言。由於在C++語言中,沒有類,也是能夠編程的。而在Java和C#中是不能夠的。
另外,Java和C#中都支持豐富的MetaClasses,這使得一切皆對象的概念支持的愈加深入。不過Java中的基礎類型在這方面的並無作到,也是一大遺憾。雖然如此,Java仍然是一個一直在學習的語言。
在面向對象發展到現今,又出現了一些重大的變革。這就是動態語言的出現。他們也都是支持面向對象技術的。最典型的動態語言有JavaScript, Python, Ruby等等。
他們一個重大的變化就是,將類的信息改變爲動態的。並提出Ducking Type的概念。這在很大程度上,提高了編程的生產力。
詳細的資料能夠參考Python和Ruby的介紹。
爲何是面嚮對象語言而不是其餘語言?這個問題有點愚蠢,可是縱觀面向對象的發展史,其實不難發現這是軟件工程發展的必然結果。在此以前,軟件工程遇到了不少問題。
從以上緣由看,必須出現一個新的複用技術,而這個技術必須比原來的函數級別要大。這就很天然地會將函數和其餘什麼的東西組合在一塊兒,進行統一封裝。
所以,面向對象的出現是必然的,若是讓這段歷史重來的話,最多隻是名稱的變化而已。
面向對象發展是從Simula開始的,Smalltalk第一個作了相對完整的實現,而C++第一個被普遍使用的面嚮對象語言。
面向對象技術的出現是歷史發展的必然,而他在將來還會繼續發展。