自 2001 年起,TIOBE 程式語言排行榜的三甲位置一直被 Java、C 與 C++ 長期佔據。那麼這一節就跟大家簡單說一說 Java 和 C/C++ 之間的關係和發展歷程。
大家知道,程式語言的發展,其實是經過了三個比較大的階段階段,那就是
組合語言 –> 程序導向語言 ->物件導向語言。
組合語言由於其難度太大,需要記憶的語句命令過多,但是其對計算機底層的控制和操作能力還是很強大的,由於學習成本太大,效率較低,已經不作為現在計算機系的重點教學了。
C語言可以作為程序導向語言的一種代表,算是一種比較純正的程序導向語言了。而程序導向的語言也稱為結構化程式設計語言,是高階語言的一種。在程序導向程式設計中,問題被看作一系列需要完成的任務,函數則用於完成這些任務,解決問題的焦點集中於函數。所以說C語言
的基本單位也是函數。
其概念最早由 E.W.Dijikstra 在 1965 年提出,它的主要觀點是採用自頂向下、逐步求精的程式設計方法,使用三種基本控制結構構造程式,即任何程式都可由順序、選擇(if-else,switch-default)、迴圈(for,while,do-while)三種基本控制結構構造。
像C語言這種的程序導向語言的最大的優勢就是適合模組化設計。一個程式可以分解為多個函數,通過函數呼叫過程,使得可以用一條函數呼叫語句實現函數所完成的複雜運算過程。這種方法使得可以將一個複雜問題的解決過程分解為較為簡單的幾個子問題的解決過程。
首先通過編寫函數用語句描述解決每一個子問題的解決過程的步驟,然後可以用一條函數凋用語句描述解決某個予問題的過程的步驟,最後在一個主程式中用多條函數呼叫語句描述解決分解為多個子問題的複雜問題的解決過程的步驟。
但是當我們在做研發系統諸如此類的問題時,開始肯定不清楚這個系統完工後的架構是怎麼樣的,所以說,利用模組化設計的語言,就很難對開發出來的系統進行調整(或者工作量會很大)。在此類諸多問題的壓力下,物件導向語言便體現出了其獨一無二的優勢。
物件導向語言,OOP(Object-Oriented Programming),是一類以物件作為基本程式結構單位的程式設計語言。Java 便就是物件導向程式設計中的的一種代表性語言。
C 語言 |
19 世紀 70 年代初問世,1978 年美國電話電報公司(AT&T)貝爾實驗室正式發布C語言。 |
C++ |
在 C 基礎上,1983 年貝爾實驗室推出了 C++。 |
Java |
由 Sun 公司於 1995 年 5 月推出。 |
其實最早,C++ 相對於C語言的基礎上就新增了物件導向和模組的思想,這也可以理解成 C++ 中兩個加號的來歷。
然而,C++ 在物件導向上做的並不是太好,比如說 C++ 支援多繼承,多繼承會引發不確定性。C++ 同時支援指標,指標直接對記憶體底層操作,雖然效率高,危險係數卻非常高,比如,一個簡單的病毒程式就可以靠指標完成:你通過一個程式的中給指標隨機賦值,能夠獲取到存取不屬於本程式執行空間的其他空間的許可權,那麼這也就是一個計算機病毒。
當然,真正的病毒不可能那麼簡單,但這是基本特性,所以 Java 在 C++ 的基礎上移除了指標,增加了參照,提高了安全性。
Java 是由 C++發展而來的,保留了 C++ 的大部分內容,其程式設計方式類似於 C++。但 Java 的句法更清晰、規模更小、更易學。Sun 公司曾對多種程式設計語言進行分析研究,取其精華去其糟粕,最終推出了 Java。Java 從根本上解決了 C++ 的固有缺陷,形成了新一代物件導向的程式設計語言。
Java 和 C/C++ 的相似之處多於不同之處,有 C 基礎的讀者,學習 Java 會更容易。相較而言,Java 的程式設計環境更為簡單。
在 C++ 中,假如你寫同樣一個程式,在 Java 裡面會報錯,而在 C++ 語言裡面是不會報錯的。為什麼?因為 C/C++ 語言設計的思想是:你想怎麼寫程式就怎麼寫,只要你的這種寫法錯得不是很離譜,就認為你這麼寫有特殊的含義,可以通過。但 Java 不行:只要你這麼寫有歧義,或者說這樣寫不太好,那麼它都會報錯。
比如 C++ 中你可以將一個浮點型資料賦給一個整型變數,編譯時只會警告,因為會丟失精度,但是在 Java 中這樣寫就會報錯,它在語法上就禁止你這樣寫。這就是不同的語言對同樣一個問題有不同的理解和處理方式。
由於 C++ 中大大小小的問題會導致不安全性,所以就在 C++ 的基礎上,取其精華,去其糟粕,便形成了早期的 Java 語言。直到現在,Java 又多了很多新的特性,比如說集合,反射,泛型,Lambda 表示式等等。所以,正因為 C -> C++ -> Java 的發展歷史,所以導致了 Java 在一定程度上繼承了多數C語言的語法,但又有一定的改變。
以下是我們整理的 Java 和 C/C++ 的 10 條不同之處。
-
C++ 支援指標,而 Java 沒有指標的概念。
-
C++ 支援多繼承,而 Java 不支援多重繼承,但允許一個類實現多個介面。
-
Java 是完全物件導向的語言,並且還取消了 C/C++ 中的結構和聯合,使編譯程式更加簡潔
-
Java 自動進行無用記憶體回收操作,不再需要程式設計師進行手動刪除,而 C++ 中必須由程式釋放記憶體資源,這就增加了程式設計師的負擔。
-
Java 不支援操作符過載,操作符過載則被認為是 C++ 的突出特徵。
-
Java 允許預處理,但不支援前處理器功能,所以為了實現預處理,它提供了引入語句(import),但它與 C++ 前處理器的功能類似。
-
Java 不支援預設引數函數,而 C++ 支援 。
-
C 和 C++ 不支援字串變數,在 C 和 C++ 程式中使用“Null”終止符代表字串的結束。在 Java 中字串是用類物件(String 和 StringBuffer)來實現的
-
goto 語句是 C 和 C++ 的“遺物”,Java 不提供 goto 語句,雖然 Java 指定 goto 作為關鍵字,但不支援它的使用,這使程式更簡潔易讀。
-
Java 不支援 C++ 中的自動強制型別轉換,如果需要,必須由程式顯式進行強制型別轉換。