當今世界,Java、Python、C++等編程語言橫行於互聯網,各界程序員日夜奔忙,爲改變世界的程序夢拼搏奮鬥。這些高級語言現在如此之地位,不得不讓咱們驚歎。java
自1946年2月14日世界上首款計算機問世,第一代計算機語言「機器語言」便誕生了,當時的「機器語言」使用的是最原始的穿孔卡片,這種卡片上使用的語言只有那些真正的專家才能理解,這種「機器語言」是否容易理解看那個年代專家的禿頂就知道了。「機器語言」本質上是計算機能識別的惟一語言,而人類卻很難理解,豈一個「難」字了得。後來那些語言大師們爲了能讓人們更容易理解,因而便有了第二代的「彙編語言」,相比機器語言,彙編語言仍是有所改良的,儘管它仍是太複雜,人們在使用時很容易出錯誤,但畢竟許多數碼已經開始用字母來代替,這也算一大進步了。簡單的「0、1」數碼誰也很差理解,但字母是人們可以閱讀和拼寫的。雖然第二代計算機語言仍然是「面向機器」的語言,但它已註定成爲機器語言向更高級語言進化的橋樑。當計算機語言發展到第三代時,就進入了「面向人類」的語言階段。你能夠閱讀、並直接用人類的語言來輸入。對咱們漢語來講,目前還不能用中文漢字來輸入指令,這主要是由於中文的輸入尚未一個很是好的手段。第三代語言被人們稱之爲「高級語言」。高級語言是一種接近於人們使用習慣的程序設計語言。它容許用英文寫計算程序,程序中所使用的運算符號和運算式子,都和咱們平常用的數學式子差很少。高級語言容易學習,通用性強,書寫出的程序比較短,便於推廣和交流,是很理想的一種程序設計語言。關於這些簡單基礎常識,能夠看看《Java匹馬行天下之學編程的起點——走進編程的殿堂》,對於各大高級語言,不要問它強不強,先看歷史長不長。我是一名Java程序員,我來談談Java的故事。程序員
Java是SUN公司推出的一種計算機語言,先說說Java這個名字的來歷吧。Java名稱來源於太平洋一個名叫Java的小島,該島出產一種味道很是美妙的咖啡。當地人很是喜歡咖啡,Java的發明者Gosling在這個小島上受到了當地人「特殊」的照顧,讓他如癡如醉般喜歡上了咖啡的美味。Gosling認爲他發明的計算機語言是很是好的東西,起初他把他發明的語言起名爲「OaK」,可是SUN公司的人發現已經存在一門叫作OaK的計算機語言了,而如今嘗着如此美味的咖啡,從咖啡的靈感中索性起名爲「Java」,流傳至今。說實際的吧,SUN公司於1995年正式推出新一代面向對象的程序設計語言Java。看到面向對象,咱們知道面嚮對象語言(OOP, Object-Oriented Programming)是一類以對象做爲基本程序結構單位的程序設計語言。Java 是面向對象編程中的一種表明性語言,但除了Java,還有C++等編程語言也是面向對象編程的表明,咱們研究Java的發展歷史,確定擺脫不了它的「競爭對手」C++,而C++又擺脫不了C語言,索性把它們三個放一塊兒描述。先看下面這張描述C、C++、Java的時間歷程圖:數據庫
單從時間上看,1973年C語言問世,而後在C的基礎上,1983年C++問世,C++問世的時候已經在C語言的基礎上添加了面向對象的思想,而Java是在1995年纔出世的,單從C++和Java所共有的「面向對象」這個思想上,咱們也會相信它們之間確定有故事,咱們先去探索它們之間的故事吧。
自1973年C語言問世後,在以後的很長一段時間,不少程序員都在用C語言,C語言很受程序員的歡迎,由於它給當時的程序員們編程提供了極好的便利,C語言貼近硬件、運行極快、效率極高,這些便利條件,讓當時的程序員們用C語言開發了不少系統級軟件、編譯器、數據庫、操做系統、網絡系統等。但世間萬物有利必有弊,C語言的弊端就在於指針和內存管理。雖然指針無比強大,能直接操做內存,可是沒有給工具作越界的檢查,致使不少新手程序員輕易犯錯。至於內存管理,更是讓人無語,本身分配的空間,必須本身去釋放。C語言最讓人頭疼的是前面這些問題在編譯器發現不了,只有在程序運行時纔會忽然暴露,這總會讓程序員猝不及防,手忙腳亂,老是昏天黑地地去調試。你想啊,程序員們大量的時間和寶貴的精力都浪費在當心翼翼的處理指針和內存分配上,程序員怎能忍受。還有一點,C語言所謂的可移植性欺騙了好多程序員,它宣稱在一個機器上寫的程序,只要在另一個機器上編譯就能夠了,但實際上不是這樣,C語言要求程序員們要用標準的C函數庫。其次,若是遇到了一些針對特定平臺的調用,須要對每一個平臺都得寫一份,若是有一點點的小錯誤,就會致使編譯失敗。這些算是C語言的一些弊端吧。編程
到了1983年,貝爾實驗室推出了一門新的編程語言C++,添加了面向對象的功能,兼容C,有靜態類型檢查,性能也很好。 其實最先,C++ 相對於C語言的基礎上就添加了面向對象和模塊的思想,這也能夠理解成 C++ 中兩個加號的來歷。然而,C++ 在面向對象上作的並非太好,好比 C++ 支持多繼承,多繼承會引起不肯定性。安全
再如,C++ 還支持指針,指針直接對內存底層操做,雖然效率高,危險係數卻很是高。例如,一個簡單的病毒程序就能夠靠指針完成:你經過一個程序的中給指針隨機賦值,可以獲取到訪問不屬於本程序執行空間的其餘空間的權限,那麼這也就是一個計算機病毒。(固然,真正的病毒不可能那麼簡單,但這是基本特性)。因此後來的 Java 在 C++ 的基礎上移除了指針,增長了引用,提升了安全性。網絡
說穿了,C++只不過是C語言的升級版,但C語言中存在的弊端在C++中依舊存在,直到後來,1995年,Java被SUN公司正式推出,Java的一些特性很受程序員們的歡迎,好比再也沒有C語言那樣的指針,不再用考慮內存管理,並且還有真正的可移植性,編寫一次,處處運行,爲了實現跨平臺,Java中在操做系統和應用程序之間增長了一個抽象層叫Java虛擬機。用Java寫的程序都跑在虛擬機上,除非個別狀況,都不用看到操做系統。編程語言
剛纔提到了一個專業術語叫跨平臺,我來解釋一下:跨平臺概念是軟件開發中一個重要的概念,是指即不依賴於操做系統,也不信賴硬件環境。在一個操做系統下開發的應用,放到另外一個操做系統下依然能夠運行。
Java的跨平臺是相對於其餘編程語言而言的,經過Java語言編寫的應用程序在不一樣的系統平臺上均可以運行。通常的高級語言若是要在不一樣的平臺上運行,至少須要編譯成不一樣的目標代碼。好比在前文中提到的C語言,在Windows系統上編譯的C語言程序,在Linux系統上是不能運行的,而Java語言在不一樣平臺上運行時不須要從新編譯。
Java跨平臺的原理:java的跨平臺是經過Java虛擬機(JVM)來實現的。
Java源程序想象成咱們的C源程序,Java源程序(.java)編譯後生成的字節碼(.class)就至關於C源程序編譯後的二進制可執行文件。JVM虛擬機至關於計算機系統(操做系統+硬件環境),Java解釋器至關於CPU。ide
.exe文件直接在Windows操做系統下運行,在CPU上運行的是機器碼(.exe文件)函數
.class字節碼文件是運行在JVM虛擬機下的,在Java解釋器上運行的是Java字節碼文件。
Java解釋器至關於運行Java字節碼的CPU,但該CPU不是經過硬件實現的,而是用軟件實現的。Java解釋器實際上就是特定的平臺下的一個應用程序。只要實現了特定平臺下的解釋器程序,Java字節碼就能經過解釋器程序在該平臺下運行,這是Java跨平臺的根本。固然,並非在全部的平臺下都有相應的Java解釋器程序,這也是Java並不能在全部的平臺下都能運行的緣由,它只能在已實現了Java解釋器程序的平臺下運行。工具
還有,在C++ 中,假如你寫一樣一個程序,在 Java 裏面會報錯,而在 C++ 語言裏面是不會報錯的。爲何?
由於 C/C++ 語言設計的思想是:你想怎麼寫程序就怎麼寫,只要你的這種寫法錯得不是很離譜,就認爲你這麼寫有特殊的含義,能夠經過。但 Java 不行:只要你這麼寫有歧義,或者說這樣寫不太好,那麼它都會報錯。
好比 C++ 中你能夠將一個浮點型數據賦給一個整型變量,編譯時只會警告,由於會丟失精度,可是在 Java 中這樣寫就會報錯,它在語法上就禁止你這樣寫。這就是不一樣的語言對一樣一個問題有不一樣的理解和處理方式。
因爲 C++ 中大大小小的問題會致使不安全性,因此就在 C++ 的基礎上,取其精華,去其糟粕,便造成了早期的 Java 語言。直到如今,Java 又多了不少新的特性,好比說集合,反射,泛型,Lambda 表達式等等。
正由於從C語言到C++,最後再到Java 的發展歷史,使得 Java 在必定程度上繼承了多數C語言的語法,但又有必定的改變,而這些改變就是不少程序員喜歡Java的緣由。
以上就是C語言、C++和Java之間的故事,要相信萬物一切皆有因果,學習要求因求果。