天天看點

【西行】Java 程式設計語言簡單介紹

  • J3 - 白起
  • Java(Java發展史 # 筆記)

1、Java 發展史

Java 語言的誕生并不是精心策劃、制作,最後産生出來的,因為當時的開發者并沒有想創造出世界上

如此偉大的程式設計語言之一。

時間讓我們回到 1990 年年末,當時并不是網際網路發展的浪潮(全世界都是如此),各大公司争相推崇的是電器領域,那時候的生活我想還是基本的生活設施較為重要(如電視機,微波爐,電話)。

在各大公司中,Sun 就不得不說了(創造 Java 的公司),Sun 公司預料嵌入式系統将在未來智能電器領域大顯身手,于是公司成立了一個由 James Gosling 上司的 “Green 計劃”,為智能家電編寫一個通用控制系統。

由于智能家電等裝置的處理能力和記憶體都很有限,是以程式設計語言必須非常小且能夠生産非常緊湊的代碼。另外,由于不同的廠商選擇不同中央處理器(CPU),是以這種語言的關鍵不是任何特定體系結構捆綁在一起,也正是有這些局限性的要求進而促使開發團隊要設計一個高效可移植性的語言 Gosling 把它稱為 “Oak”。

到了 1992 年夏天,Green 計劃已經完成了新平台的部分功能,包括 GReen作業系統、Oak 的程式設計語言、類庫等。同年 11 月,Green 計劃被轉化成 “FirstPerson 有限公司” ,一個 Sun 公司的全資子公司。

1992 年的時候 Green 項目釋出了它的第一個産品,稱之為 “*7” 。這個産品是具有非常智能的遠端控制,但很遺憾,Sun 公司對這個産品并不感興趣。後來直到 1994 年上半年也沒有一個買家對其産生的産品有興趣這也導緻了 “FirstPerson 公司” 公司解散的命運。

而就在 1994 年的夏天在 Sun 公司以外,Internet 的網際網路正在逐漸發展壯大。

Gosling 在第一時間,意識到這是一個機會,于是對 Oak 進行了小規模的改造,到了 1994 年秋,小組中的 Patrick Naughton 和 Jonathan Payne 完成了第一個 Java語言的網頁浏覽器:WebRunner。Sun公司高層在觀看了浏覽器的示範之後,對其給予了高度的評價,而當時 Oak 這個商标已經被人注冊了,是以隻能将 Oak 更名為 Java。

有了産品那自然是要讓跟多的人知道它的強大,是以 Sun 公司在 1995 年年初釋出了 Java語言,并直接把 Java 放到了網際網路上,免費給大家使用。更瘋狂的是連源碼也不保密,一起放到了網際網路上向所有人公開。

幾個月後,讓所有人都大吃一驚的事情發生了:​Java 稱為了網際網路上最熱門的寶貝​。其 Java 語言的下載下傳量竟然高達 10 萬多次(想想那時候就有 10 萬+)。然後,網際網路上立即就有了數不清的 Java 小程式,掩飾着各種小動畫、小遊戲等。

此時,Java 語言終于是揚眉吐氣,成為了一種廣為人知的程式設計語言。

1995 年,Sun 雖然推出了 Java,但這隻是一種語言,如果想要開發更為複雜的程式,那必須有一個強大的開發類庫。是以,Sun 公司在 1996 年年初釋出了 JDK 1.0 。這個版本包括兩個部分:

  • 運作環境(JRE)
  • 開發環境(JDK)

運作環境包括核心 API 、內建 API、使用者界面 API、釋出計劃、Java虛拟機(JVM)五個部分;

開發環境包括編譯 Java 程式的編譯器(既 javac 指令)。

1997 年 2 月 18 日 Sun 釋出了 JDK1.1 。JDK1.1 增加了 JIT(即時編譯)編譯器,通過該功能讓 JDK 在效率上有較大提升。

但是一直以來,Java 都沒有準确的找到自己的一個準确定位,也沒有找到它必須存在的理由,因為在 1996 年 Flash 面世了,這是一種更加簡單的動畫設計軟體:使用 Flash 幾乎無需任何程式設計知識,就可以做出豐富多彩的動畫。随後 Flash 增加了 ActionScipt 程式設計腳本,Flash 逐漸蠶食了 Java在網頁上的應用。

直到 1998 年 12 月,Sun 釋出了 Java 曆史上最重要的 JDK 版本:JDK1.2,伴随JDK1.2 同時釋出的還有 JSP/Servlet、EJB 等規範,并将 Java 分成了 J2EE、J2SE 和 J2ME 三個版本。

  • J2ME:主要用于控制移動裝置和資訊家電等有限存儲的裝置。
  • J2SE:整個 Java 技術的核心和基礎,它是 J2ME 和 J2EE 程式設計的基礎。
  • J2EE:Java技術中應用最廣泛的部分,J2EE 提供了企業應用開發的完整解決方案。

三個版本推出後,标志着 Java 已經吹響了向企業、桌面和移動 3 個領域進軍的号角,Java 已經進入了 Java2 時代,這個時期也是 Java 飛速發展的時期。

2002 年 2 月,Sun 釋出了 JDK 曆史上最為成熟的版本:JDK1.4。此時由于 Compaq、Fujitsu、SAS、Symbian、IBM 等公司的參與,使 JDK1.4 稱為發展版本最快的一個 JDK 版本。到 JDK1.4 為止,我們已經可以使用 Java 實作大多數的應用了。

與此同時,Java 語言在企業應用領域的發放異彩,湧現了大量基于 Java 語言開發的架構:Struts、WebWork、Hibernate、Spring 等;大量的企業應用伺服器也開始湧現:WebLogic、WebSphere、JBoss等,這些都标志着 Java 語言的飛速發展時期。

2004 年 9 月, Sun 釋出了萬衆期待的 JDK1.5,同時,Sun 将 JDK1.5 改名為 JavaSE5.0,J2EE、J2ME也相應改名為 JavaEE 和 JavaME 。

2006 年 12 月,Sun 公司釋出了 JDK 1.6(也被稱為 JavaSE 6)。往後 Sun 公司一直維持着大約 2 年釋出一個新版本的習慣。

但在 2009 年 4 月 20 日,Oracle 宣布将以每股 9.5 美元的價格收購 Sun,該交易的總價值約為 74 億美元。而 Oracle 通過收購 Sun 獲得了兩項軟體資産:Java 和 Solaris(稱比 Linux 更穩定的作業系統)。

于是曾經代表了一個時代的公司:Sun 終于是落幕了,“江湖” 再也不顯 Sun 身影。

雖然 Sun 不在了,不過 Java 的大旗依然“獵獵”作響。2007 年 11 月,Google 宣布推出一款基于 Linux 平台的開源手機作業系統:Android。Android 的出現順應了即将出現的移動網際網路潮流,而且 Android 系統的使用者體驗非常好,是以訊處稱為了手機作業系統的中間力量。Android 使用 Java 語言來開發應用程式,這也給了 Java 語言一個全新的機會。過去的歲月中,Java 語言作為服務端程式設計語言,已經取得了極大的成功;而 Android 平台的流行,則讓 Java 語言獲得了在用戶端程式上大展拳腳的機會。

2011 年 7 月 28 日,Oracle 公司終于“如約”釋出了 JavaSE 7 —這次版本更新經過了将近 5 年時間。Java SE 7 也是 Oracle 釋出的第一個 Java 版本,雖然并未完全滿足所有人的期望,不過它的釋出,意味着 Java 能繼續在它的賽道上繼續馳騁。

​Java 版本釋出時間表:​

版本 釋出時間
JDK Beta 1995 年
JDK 1.0 1996 年 1 月
JDK 1.1 1997 年 2 月
J2SE 1.2 1998 年 12 月
J2SE 1.3 2000 年 5 月
J2SE 1.4 2002 年 2 月
J2SE 5.0 2004 年 9 月
Java SE 6 2006 年 12 月
Java SE 7 2011 年 7 月
Java SE 8(LTS) 2014 年 3 月
Java SE 9 2017 年 9 月
Java SE 10 2018 年 3 月
Java SE 11(LTS) 2018 年 9 月
Java SE 12 2019 年 3 月
Java SE 13 2019 年 9 月
Java SE 14 2020 年 3 月
Java SE 15 2020 年 9 月

注:LTS 表示的是長期穩定支援版本。

2、Java 程式運作機制

Java 語言是一種特殊的進階語言,它既具有解釋型語言的特征,也具有編譯型語言的特征,因為 Java 程式要經過先編譯,後解釋兩個步驟。

2.1 進階語言的運作機制

計算機的語言按照程式的執行方式可以分為編譯型和解釋型兩種。

​編譯型​語言是指通過專門的編譯器,針對特定平台(作業系統)将某種進階語言源代碼一次性“翻譯”成可以被該平台執行的機器碼,并包裝成能被該平台識别執行程式的格式,這個轉換過程稱為​編譯​。編譯生成的可執行程式可以脫離開發環境,在特定的平台上獨立運作。

編譯型語言的運作效率較高,但它是被編譯成特定平台的機器碼,是以通常無法移植到其他平台上運作。現有的 C、C++、FORTRAN、Psscal 等進階語言都屬于編譯型語言。

​解釋型​語言是指使用專門的​解釋器​對源程式逐行解釋成特定平台的機器碼并立即執行的語言。解釋型語言通常不會進行整體性的編譯和連結處理,解釋型語言相當于把編譯型語言中的編譯和解釋過程混合到了一起同時完成。

可以認為:沒錯執行解釋型語言的程式都需要進行一次編譯,是以解釋型語言的程式運作效率通常較低,而且不能脫離解釋器獨立運作。但解釋型語言有一個優勢:跨平台比較容易,隻需要提供特定平台的解釋器即可,每個特定平台上的解釋器負責将源程式解釋稱特定平台的機器指令即可。

解釋型語言可以友善的實作源程式級的移植,但這些是以犧牲程式執行效率為代價。現有的 Ruby、Python 等語言都屬于解釋型語言。

2.2 Java程式的運作機制和 JVM

Java 語言比較特殊,由 Java 語言編寫的程式需喲經過編譯步驟,但這個編譯步驟并不會生成特定平台的機器碼,而是一種與平台無關的位元組碼(也就是 *.class 檔案)。并且,這種位元組碼不是可執行的,必須使用 Java 解釋器來解釋執行。是以,我們可以認為:Java 語言即時編譯型語言,也是解釋型語言。或者說,Java 語言既不是存粹的編譯型語言,也不是存粹的解釋型語言。Java 程式的執行必須經過先編譯,後解釋兩個步驟,如圖。

【西行】Java 程式設計語言簡單介紹

Java 語言負責解釋執行位元組碼檔案的是 Java 虛拟機,既 JVM(Java Virtual Machine)。

JVM 是可以運作 Java 位元組碼檔案的虛拟計算機,所有平台上的 JVM 向編譯器提供相同的程式設計接口,而編譯器隻需要面向虛拟機,生成虛拟機能了解的代碼,然後由虛拟機來解釋執行。

當使用功能 Java 編譯器編譯 Java 程式時,生成的是與平台無關的位元組碼,這些位元組碼不面向任何具體平台,隻面向 JVM 。不同平台上的 JVM 都是不同的,但它們都提供了相同的接口。JVM 是 Java 程式跨平台的關鍵部分,隻要為不同平台時間了相應的虛拟機,編譯後的 Java 位元組碼就可以在該平台上運作。

顯然,相同的位元組碼程式需要在不同的平台上運作,這幾乎是“不可能的”,隻有通過中間轉換器才可以實作,JVM 就是這個轉換器。

JVM 是一個抽象的計算機,和實際的計算機一樣,它具有指令集并使用不同的存儲區域。它負責執行指令,還要管理資料、記憶體和寄存器。

3、Java 語言的特性

從 Java 語言的設計者編寫的“白皮書”中可以簡要概括 Java 語言的 11 大特性,如下:

  1. 簡單性
  2. 面向對象
  3. 分布式
  4. 健壯性
  5. 安全性
  6. 體系結構中立
  7. 可移植性
  8. 解釋型
  9. 高性能
  10. 多線程
  11. 動态性

3.1 簡單性

在設計 Java 的時候,盡管人們發現 C++ 不太适用,但還是盡可能的接近它,以便系統更易于了解。Java 剔除了 C++ 中許多很少使用、難以了解、易混淆的特性。是以 Java 文法也可以說是一個​純淨版​ C++ 文法。

Java 文法沒有檔案頭、指針運算(指針文法)、結構、聯合、操作符重載、虛基類等。

3.2 面向對象

簡單地講,面向對象設計是一種程式設計技術。它将重點放在資料(既對象)和對象的接口上。

用木匠打個比方,一個“面向對象的”木匠始終關注的是所制作的椅子,第二位才是所使用的工具;一個“非面向對象的”木匠首先考慮的是所用的工具。

Java 語言在設計時面向對象技術已經相當成熟。Java 的面向對象特性與 C++ 旗鼓相當,Java 與 C++ 的主要不同點在于多重繼承,在 Java 中,取而代之的是更簡單的接口概念。

3.3 分布式

Java 有一個豐富的例程庫,用于處理像 HTTP 和 FTP 之類的 TCP/IP協定。Java 應用程式能夠通過 URL 打開和通路網絡上的對象,其便捷程度就好像通路本地檔案一樣。

3.4 健壯性

Java 的設計目标之一在于使得 Java 編寫的程式具有多方面可靠性。

Java 投入了大量的精力進行早期的問題檢測、後期動态的(運作時)檢測,并消除了容易出錯的情況等。

Java 和 C++ 最大的不同在于 Java 采用的指針模型可以消除重寫記憶體和損壞資料的可能。

3.5 安全性

Java 适用于網絡 / 分布式環境,為了達到這個目的,在安全方面也是投入了很大精力。

使用 Java 可以建構防病毒、防篡改的系統。

Java 的設計能夠防範攻擊包括:

  • 運作時堆棧溢出。如蠕蟲和病毒常用的攻擊手段。
  • 破壞自己的程序空間之外的記憶體
  • 未經授權讀寫檔案

3.6 體系結構中立

編譯器生成一個體系結構中立的目标檔案格式,這是一種編譯過的代碼, 隻要有 Java 運作時系統, 這些編譯後的代碼可以在許多處理器上運作。

Java 編譯器通過生成與特定的計算機體系結構無關的位元組碼指令來實作這一特性。 精心設計的位元組碼不僅可以很容易地在任何機器上解釋執行,而且還可以動态地翻譯成本地機器代碼。

3.7 可移植性

與 C 和 C++ 不同,Java 規範中沒有“ 依賴具體實作” 的地方。基本教據類型的大小以及有關運算都做了明确的說明。

例如,Java 中的 int 永遠是 32 位的整數,而在 C/C++ 中,int可能是 16 位整數、32 位整數,也可能是編譯器提供商指定的大小。

在 Java 中,資料類型具有固定大小,這消除了代碼移植時令人頭痛的主要問題。二進制資料以固定的格式進行存儲和傳輸,消除了位元組順序的困擾。字元串是用标準的 Unicode 格式存儲。

3.8 解釋型

Java 解釋器可以在任何移植了解釋器的機器上執行 Java 位元組碼。

3.9 高性能

盡管對解釋後的位元組碼性能已經比較滿意,但在有些場合下還是需要更加高效的性能。位元組碼可以(在運作時刻)動态地翻譯成對應運作這個應用的特定 CPU 的機器碼。

3.10 多線程

多線程可以帶來更好的互動響應和實時行為。

Java 在當時很超前。它是第一個支援并發程式設計的主流語言。那時,多核處理器是非常神秘的,而 Web 程式設計才剛剛起步,處理器要花很長時間等待伺服器響應,需要并發程式設計來確定使用者界面不會“凍住”。

而并發程式設計并非易事,不過 Java 在這方面表現出色,可以很好的管理這個工作。

3.11 動态性

從各種角度看,Java 與 C 或 C++ 相比更加具有動态性。它能夠适應不斷發展的環境。庫中可以自由的添加新方法和執行個體變量,而對用戶端卻沒有任何影響。在 Java 中找出運作時類型資訊十分簡單。

​好了,今天的内容到這裡就結束了,關注我,我們下期見​

​查閱或參考資料:​

《瘋狂 Java 講義》

《Java 核心技術卷第 10 版》

  • 由于部落客才疏學淺,難免會有纰漏,假如你發現了錯誤或偏見的地方,還望留言給我指出來,我會對其加以修正。
  • 如果你覺得文章還不錯,你的轉發、分享、點贊、留言就是對我最大的鼓勵。
  • 感謝您的閱讀,十分歡迎并感謝您的關注。

​^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^​

​個人站點:J3

​掘金:J3-白起​

​知乎:J3-白起​

​這是一個技術一般,但熱衷于分享;經驗尚淺,但臉皮夠厚;明明年輕有顔值,但非要靠才華吃飯的程式員。​