一、編程語言哪家強,先看歷史長不長
當今世界,Java、Python、C++等編程語言橫行于互聯網,各界程序員日夜奔忙,為改變世界的程序夢拼搏奮斗。這些高級語言如今如此之地位,不得不讓我們驚嘆。
自1946年2月14日世界上首款計算機問世,第一代計算機語言“機器語言”便誕生了,當時的“機器語言”使用的是原始的穿孔卡片,這種卡片上使用的語言只有那些真正的專家才能理解,這種“機器語言”是否容易理解看那個年代專家的禿頂就知道了。
“機器語言”本質上是計算機能識別的唯一語言,而人類卻很難理解,豈一個“難”字了得。后來那些語言大師們為了能讓人們更容易理解,于是便有了第二代的“匯編語言”,相比機器語言,匯編語言還是有所改良的,盡管它還是太復雜,人們在使用時很容易出錯誤,但畢竟許多數碼已經開始用字母來代替,這也算一大進步了。簡單的“0、1”數碼誰也不好理解,但字母是人們能夠閱讀和拼寫的。雖然第二代計算機語言仍然是“面向機器”的語言,但它已注定成為機器語言向更高級語言進化的橋梁。
當計算機語言發展到第三代時,就進入了“面向人類”的語言階段。你可以閱讀、并直接用人類的語言來輸入。對我們漢語來說,目前還不能用中文漢字來輸入指令,這主要是因為中文的輸入還沒有一個非常好的手段。第三代語言被人們稱之為“高級語言”。高級語言是一種接近于人們使用習慣的程序設計語言。它允許用英文寫計算程序,程序中所使用的運算符號和運算式子,都和我們日常用的數學式子差不多。高級語言容易學習,通用性強,書寫出的程序比較短,便于推廣和交流,是很理想的一種程序設計語言。
二、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語言,索性把它們三個放一起描述。
單從時間上看,1973年C語言問世,然后在C的基礎上,1983年C++問世,C++問世的時候已經在C語言的基礎上添加了面向對象的思想,而Java是在1995年才出世的,單從C++和Java所共有的“面向對象”這個思想上,我們也會相信它們之間肯定有故事,我們先去探索它們之間的故事吧。
三、C、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。
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之間的故事,要相信萬物一切皆有因果,學習要求因求果。