【编程语言】Java夯实基础(一):Java的起源与发展
Java的起源與發展
- 前言
- 一、發展早期
- 二、版本歷史
- 三、版本迭代
- 總結
前言
1990年代初,任職于Sun微系統的詹姆斯·高斯林等人開發了Java語言的雛形Oak,當時的目標是開發一款應用在家用電器等小型系統上的編程語言。由于這些智能化家電的市場需求沒有預期的高,Sun公司便放棄了這項計劃。隨著1990年代互聯網的發展,Sun公司看見Oak在互聯網上應用的前景,于是決定改造Oak,之后在1995年5月以Java為名稱正式發布這款編程語言。Java伴隨著互聯網的迅猛發展而發展,逐漸成為重要的網絡編程語言。
一、發展早期
這款語言最初只是Sun公司在1990年12月開始研究的一個內部項目。Sun公司的一個叫做帕特里克·諾頓的工程師被公司自己開發的C++和C語言編譯器搞得焦頭爛額,因為其中的API極其難用。帕特里克決定改用NeXT,同時他也得到了進入公司的“Stealth計劃”項目的機會。
“Stealth計劃”后來改名為“Green計劃”,詹姆斯·高斯林和麥克·舍林丹(Mike Sheridan)也加入了帕特里克的工作小組。他們和其他幾個工程師一起在加利福尼亞州門羅帕克市沙丘路的一個小工作室里面研究開發新技術,瞄準下一代智能家電的程序設計,Sun公司預料未來科技將在家用電器領域大顯身手。團隊最初考慮使用C++語言,但是很多成員包括Sun公司的首席科學家比爾·喬伊,發現C++和可用的API在某些方面存在很大問題。
工作小組使用的是嵌入式系統,可以用的資源極其有限。很多成員發現C++太復雜以至很多開發者經常錯誤使用。他們發現C++缺少垃圾回收系統,還有可移植的安全性、分布程序設計、和多線程功能。最后,他們想要一種易于移植到各種設備上的平臺。
根據可用的資金,喬伊決定開發一種集C語言和Mesa語言于一成的新語言,在一份報告上,喬伊把它叫做“未來”,他提議Sun公司的工程師應該在C++的基礎上,開發一種面向對象的環境。最初,高斯林試圖修改和擴展C++的功能,他自己稱這種新語言為C++ ++ --[來源請求],但是后來他放棄了。他將要創造出一種全新的語言,被他命名為“Oak”(橡樹),以他的辦公室外的橡樹命名。
就像很多開發新技術的秘密工程一樣,工作小組沒日沒夜地工作到了1993年的夏天,他們能夠演示新平臺的一部分了,包括Green操作系統,Oak的程序設計語言,類庫及其硬件。最初的嘗試是面向一種類PDA設備,被命名為Star7,這種設備有鮮艷的圖形界面和被稱為“Duke”的智能代理來幫助用戶。1992年12月3日,這臺設備進行了展示。
同年11月,Green計劃被轉化成了“FirstPerson有限公司”,它是一個Sun公司的全資子公司,團隊也被重新安排到了帕洛阿爾托。FirstPerson團隊對建造一種高度交互的設備感興趣,當時代華納發布了一個關于電視機頂盒的征求提議書時,FirstPerson改變了他們的目標,作為對征求意見書的響應,提出了一個機頂盒平臺的提議。但是有線電視業界覺得FirstPerson的平臺給予用戶過多的控制權,因此FirstPerson的投標敗給了SGI。與3DO公司的另外一筆關于機頂盒的交易也沒有成功,由于他們的平臺不能在電視工業產生任何效益,公司被并回Sun公司。
后來由于商標搜索顯示Oak已被一家顯卡制造商注冊。于是Oak被改名為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 月 | 2008 年 10 月 | 2013 年 2 月 |
| J2SE 5.0 | 2004 年 9 月 | 2009 年 11 月 | 2015 年 4 月 |
| Java SE 6 | 2006 年 12 月 | 2013 年 4 月 | 2018 年 12 月 |
| Java SE 7 | 2011 年 7 月 | 2015 年 4 月 | 2022 年 7 月 |
| Java SE 8 (LTS) | 2014 年 3 月 | Oracle 于 2019 年 1 月停止更新(商用) Oracle 于 2030 年 12 月停止更新(非商用) AdoptOpenJDK 于 2026 年 5 月或之后停止更新 Amazon Corretto 于 2026 年 5 月或之后停止更新 | 2030 年 12 月 |
| Java SE 9 | 2017 年 9 月 | OpenJDK 于 2018 年 3 月停止更新 | 不適用 |
| Java SE 10 | 2018 年 3 月 | OpenJDK 于 2018 年 9 月停止更新 | 不適用 |
| Java SE 11 (LTS) | 2018 年 9 月 | AdoptOpenJDK 于 2024 年 10 月或之后停止更新 Amazon Corretto 于 2027 年 9 月或之后停止更新 | 2026 年 9 月 |
| Java SE 12 | 2019 年 3 月 | OpenJDK 于 2019 年 9 月停止更新 | 不適用 |
| Java SE 13 | 2019 年 9 月 | OpenJDK 于 2020 年 3 月停止更新 | 不適用 |
| Java SE 14 | 2020 年 3 月 | OpenJDK 于 2020 年 9 月停止更新 | 不適用 |
| Java SE 15 | 2020 年 9 月 | OpenJDK 于 2021 年 3 月停止更新 | 不適用 |
| Java SE 16 | 2021 年 3 月 | OpenJDK 于 2021 年 9 月停止更新 | 不適用 |
| Java SE 17 (LTS) | 2021 年 9 月 | 待定 | 待定 |
三、版本迭代
JDK Alpha 和 Beta:第一個1995年發布的alpha和beta Java公開版本,API和ABI非常不穩定。 支持Java Web瀏覽器被取名為WebRunner。
JDK 1.0:第一個版本于1996年1月23日發布,叫做為Oak。而真正第一個穩定的版本JDK 1.0.2,被稱作Java 1。
JDK 1.1:1997年2月19日發布。新增了如下內容:
- AWT事件模型大規模重新編制
- 加入了內部類別
- JavaBeans
- JDBC
- RMI
- 能夠支持自理的反射能力,在運行時不可能有修改。
- 針對 Microsoft Windows 平臺上運作的版本,附帶由Symantec為JavaSoft生產的JIT編譯器
- 支持國際化和Unicode,該功能源自Taligent
J2SE 1.2:1998年12月8日發布,代號為Playground(競技場)。 該版本到J2SE 5.0為止的后續版本被更名為Java 2,而版本名稱“J2SE”(Java 2平臺,標準版)取代JDK以區別J2EE(Java 2平臺,企業版) 和J2ME(Java 2 Platform,Micro Edition)基礎平臺。這是Java的一個非常重要的版本,它將Java平臺的大小增加至原先的三倍,在59個程序包中達到了1520個類。主要增加包括:
- strictfp 關鍵字
- 主類別中集成了Swing圖像化API
- 首次為Sun提供的JVM配備JIT編譯器
- Java plug-in(即 Java Applet)
- Java IDL,一個與CORBA互通的接口描述語言實現
- Java集合框架
J2SE 1.3:2000年5月8日,工程代號為Kestrel(美洲紅隼)的JDK 1.3發布,這個版本中最著名的改變包括:
- 包含了HotSpot JVM(HotSpot JVM第一次被發布是在1999年4月,名為J2SE 1.2 JVM)
- 為了支持與CORBA的選擇兼容性而修改了RMI
- Java命名和目錄接口(Java Naming and Directory Interface,縮寫JNDI)包含在主程序庫中(先前為擴展組件的形式)
- Java Platform Debugger Architecture (JPDA)
- JavaSound
- 用于實現動態代理的類
J2SE 1.4:2002年2月13日,JDK 1.4發布,工程代號為Merlin(灰背隼)。JDK 1.4同樣發布了很多新的技術特性,如正則表達式、異常鏈、NIO、日志類、XML解析器和XSLT轉換器等。Java 1.4開放支源和安全性更新于2008年10月終止。Oracle客戶的付費的安全性更新也在2013年2月結束。
J2SE 5.0:代號為Tiger(老虎)。這個在2004年9月30日發布的版本原本以1.5編號,也就是仍然使用內部版本編號。這個數字被改變是為了“更好地反映成熟度、穩定性、可擴展性和 J2SE 的安全水準”。這個版本是在JSR 176底下被開發。Tiger增加了若干個重要的新語言功能:
- 泛型(Generics): 為集合提供編譯期間 (靜態) 類型安全,且不須為大多數類型轉換 (類型轉換) (規范在 JSR 14)
- 元數據(Metadata): 也稱作注解。讓語言結構(像是類別和方法)能夠用額外的資料標記,可以由元數據意識工具處理(規范在 JSR 175)
- 自動封裝與解封裝: 在基本的資料類型(如 int)和基本的的外覆類別 (如 Integer) 之間能夠自動轉換 (規范在 JSR 201)
- 枚舉(Enumerations): 以 enum 關鍵字創造出一種類型安全,有排序值的清單(如Day.MONDAY、 Day.TUESDAY 等);以前這只能透過非類型安全的恒定整數或自行撰寫的類別來達成 (類型安全的枚舉模式) (規范在JSR 201)
- 可變參數函數(Varargs):方法的最后一個參數現在可以用一個類型名稱加上三個點宣告(如:void drawtext(String… lines));在調用代碼中,類型中參數里任何的數字可以被使用,而它們再放在一個數組來傳遞給方法,或是其它的調用代碼可以傳遞那個類型的數組
- 強化 for each 循環:for 循環的語法被用特別的語法擴展了,適用于數組或 Iterable,用于迭代每個成員,如基本的 Collection 類別 (規范在 JSR 201(頁面存檔備份,存于互聯網檔案館))
改進多線程 Java 程序的運行語義;新的 Java 存儲器模型改善了復雜性、 有效性和以前的規格性能 - 靜態導入
Java SE 6:代號為Mustang(野馬)。版本發布于2006年12月11日,Sun把原本的名稱“J2SE”改為“Java SE”,然后再從版本號中去掉“.0”,而開發者內部編號仍然是1.6.0。這個版本是根據JSR 270(頁面存檔備份,存于互聯網檔案館)開發的。本版本包含的主要更改:
- 支持舊的Win9x版本下降;非正式地,Java 6 Update 7是Java的最后一個顯示為在這些版本的Windows上工作的版本。 這被認為是因為在Update 10版本中的主要更改。
- 腳本語言支持(Scripting Language Support)(JSR 223):用于與腳本語言緊密集成的通用API,以及內置的Mozilla JavaScript Rhino集成。
- 核心平臺和Swing性能顯著的改進。
- 透過JAX-WS改善的網絡服務支持(JSR 224).
- 支持JDBC 4.0 (JSR 221).
- Java編譯器API (JSR 199):允許Java程序以寫程序的方式選擇和調用Java編譯器的API。
- 將JAXB升級到版本2.0:包括StAX解析器的集成。
- 支持pluggable annotations (JSR 269).
- 改善許多GUI,像是SwingWorker在API中的集成,表格排序和篩選,以及真正的Swing雙緩沖(消除模糊區域效果)。
- 包含JVM改善:同步和編譯器性能優化,新算法和對現有垃圾收集算法的升級以及應用程序引導性能。
Java SE 7:代號為Dolphin(海豚),是一個重大的更新,在 2011年7月7日亮相,并在2011年7月28日開放給開發者使用。發展時期被分類成十三個重要階段,最后一個階段在2011年6月6日完成。在 Java 7 中新增的功能包括:
- JVM本身對動態語言的支持:新的invokedynamic字節碼指令(JSR-292(頁面存檔備份,存于互聯網檔案館)),與多語言虛擬機(Multi Language Virtual Machine)原型
- 64位指針壓縮(Java 6 中可以使用 XX:+UseCompressedOops 開啟)
- 一些語言方面的小改變(在Coin項目下的一個小群體)
- JSR 166下的并發實用工具
- 新的文件 I/O 程序庫 (JSR 203 定義) 增加多重文件的支持、文件原始資料和符號鏈接。新的包為:java.nio.file、java.nio.file.attribute和java.nio.file.spi
- 使用 Timsort 來為集合與數組排序,取代歸并排序
- 對橢圓曲線加密算法增加標準庫級別的支持
- 一個給Java 2D的XRender傳遞途徑,改進了現代GPUs特有的功能的處理
- 用于圖形功能的新平臺API(最初在版本6u10中的實現為不支持的API)
- 增強了對新網絡通信協議(包括SCTP和Sockets Direct Protocol)的標準庫級別的支持
- 更新對XML和Unicode的支持,以符合最新標準
- Java部署規則集
Java SE 8:Java 8 于2014年3月18日發布,包含了一些原本被項目在 Java 7卻延遲的功能。這些功能改進在 JDK Enhancement Proposals (JEPs) 的指導下得到了集成:
- JSR 335,JEP 126:Lambda項目中提供的語言級匿名函數支持(官方稱為 lambda 表達式,非官方亦稱閉包);添加默認方法(虛擬擴展組件方法),以允許在不破壞兼容性的情況下向現有接口中新增方法。Java社區中曾經有過針對是否要加入 lambda 表達式支持的辯論。稍后Sun公司宣布 lambda 表達式將會包含在Java中,并請社區協助改善該特性。支持lambda表達式使得針對流中元素的函數式操作成為可能,由此可以實現由 MapReduce 啟發的函數式集合操作。默認方法允許API作者添加新的方法到現有接口上,而不會破壞舊的代碼中。默認方法還使得多重繼承的行為 (不是狀態)成為可能,但默認方法的設計意圖并非在此。
- JSR 223,JEP 174:Nashorn項目,一個 JavaScript 運行時,它允許開發人員在應用程序中嵌入 JavaScript 代碼
- JSR 308,JEP 104:在 Java 類型上的注解
- 無符號整數算術
- JSR 337,JEP 120:重復注解
- JSR 310,JEP 150:日期和時間 API,基于Joda-Time日期時間處理庫的實現。
- JEP 178:靜態鏈接 JNI 程序庫
- JEP 153:執行 JavaFX 應用程序(直接執行 JavaFX 的應用程序的 JAR 包)
- JEP 122:移除了虛擬機內存管理中的永久世代
Java 8 不再支持 Windows XP,但JDK 8 第 25 版更新仍然可以在 Windows XP安裝和運行。先前JDK 8的更新版本可以在XP中運行,但必須通過強制解壓安裝程序來進行安裝。
Java SE 9:在2011年的JavaOne中,Oracle討論了一些他們希望在2016年于Java 9中發布的功能。Java 9 應當對千兆級堆擁有更好的支持,同時能夠更好地集成本機代碼,且擁有新的垃圾收集器G1和能夠自我調節的JVM。2016年初,Java 9 的發布被重新定為2017年3月;2017年3月時,發布日期又被拖延至2017年7月;后來又因Java執行委員會對Jigsaw項目實現的分歧而最終定為2017年9月21日,在此期間Oracle回應了部分疑問,并對一些重要的技術問題進行了修正。在2017年6月的最后幾天,JCP對擬議的模塊系統方案達成了共識。
- JSR 376:在Jigsaw項目中將JDK模塊化
- JEP 222:jshell:Java Shell(一個 Java 交互式頂層構件)
- JEP 295:AOT編譯(通過 Graal VM 實現)
- JEP 268:XML Catalogs
- JEP 266:更多的并發更新。[243]包含響應式流的Java實現,及其部分替代品java.util.concurrent.Flow。
- JEP 193:變量句柄:定義一個標準方法來調用java.util.concurrent.atomic和sun.misc.Unsafe操作的等價物。
- JEP 282:jlink:Java鏈接器。該工具可以為模塊生成一個包含了其所有依賴項的自定義運行時映像,同時允許生成一個包括運行它的JVM的可執行文件。
- JavaDB被移出JDK
- JEP 263:高DPI圖像:自動縮放與尺寸自適應。
Java SE 10:OpenJDK 10于2018年3月20日發布。此次更新包含以下12個新特性:
- JEP 286:局部變量類型推斷
- JEP 317:實驗性的基于Java的JIT編譯器。這是 Linux x64 下 Graal 動態編譯器的集成。
- JEP 310:應用程序類級別數據共享
- JEP 322:基于時間的版本命名
- JEP 307:適用于G1的多線程完全垃圾回收
- JEP 304:垃圾回收器接口
- JEP 314:更多的Unicode語言標簽擴展
- JEP 319:內置根證書
- JEP 312:線程本地握手
- JEP 316:在可選的內存設備上申請堆內存空間
- JEP 313:刪除本地代碼頭文件生成器javah
- JEP 296:將所有JDK分支集成到同一個版本庫中
Java SE 11:JDK 11于2018年9月25日發布。Java 11 包含如下更新:
- JEP 181:針對嵌套成員的訪問控制
- JEP 309:動態類文件常量
- JEP 315:利用 Aarch64 的特有架構改進其上的性能
- JEP 318:Epsilon:無操作垃圾收集器
- JEP 320:移除 Java EE 和 CORBA 模塊
- JEP 321:HTTP Client
- JEP 323:lambda參數的局部變量語法
- JEP 324:支持 Curve25519 和 Curve 448 密鑰
- JEP 327:Unicode 10
- JEP 328:添加Java飛行記錄器(JFR),其用于創建性能分析記錄
- JEP 329:ChaCha20 和 Poly1305 加密算法
- JEP 330:運行單文件源碼程序
- JEP 331:低開銷堆分析
- JEP 332:支持 TLS 1.3
- JEP 333:添加ZGC(一個可擴展的低延遲垃圾收集器)
- JEP 335:棄用 Nashorn JavaScript 引擎
- JEP 336:棄用 Pack200 相關的工具及 API
Java SE 12:JDK 12于2019年3月19日發布。該版本包含較多新特性,例如:
- JEP 189:Shenandoah:一個實驗性的低延遲垃圾收集器
- JEP 230:細粒度性能評審包
- JEP 325:Switch 表達式(預覽階段)
- JEP 334:JVM Constants API
- JEP 340:僅保留一個 AArch64 平臺的移植
- JEP 341:默認類數據共享歸檔
- JEP 344:針對G1,提供可中止的混合垃圾收集
- JEP 346:針對G1,及時釋放已申請但未使用的內存
Java SE 13:JDK 13于2019年9月17日發布。該版本包含以下新特性以及很多的強化和很多的漏洞修補。
- JEP-350: 動態 CDS 歸檔
- JEP-351: ZGC: 取消提交未使用存儲器
- JEP-353: 重新實現舊版 Socket API
- JEP-354: Switch 表達式(預覽階段)
- JEP-355: 文本框(預覽階段)
Java SE 14:JDK 14發布于2020年3月17日。Java 14 包含了下方列出的新功能,以及“數百個小改進和數千個漏洞修復”。
- JEP-305:使用 instanceof 的模式匹配(預覽)
- JEP-343:打包工具(孵化中)
- JEP-345:在 G1 中,對不均勻的內存訪問(NUMA)情況下的內存申請優化
- JEP-349:JFR Event Streaming
- JEP-352:使字節緩沖區能夠映射到非易失性存儲器上
- JEP-358:有幫助的 NullPointerExceptions
- JEP-359:記錄類(預覽)
- JEP-361:Switch 表達式(標準)
- JEP-362:棄用 Solaris 和 SPARC 平臺上的移植版本
- JEP-363:移除 Concurrent Mark Sweep (CMS) 垃圾收集器
- JEP-364:適用于 macOS 的 ZGC
- JEP-365:適用于 Windows 的 ZGC
- JEP-366:棄用 ParallelScavenge + SerialOld 的垃圾收集器組合
- JEP-367:移除 Pack200 相關的工具及 API
- JEP-368:文本塊(第二預覽版本)
- JEP-370:外部內存訪問 API(孵化中)
Java SE 15:JDK 15發布于2020年9月15號,包含了下列新特性:
- JEP-339:Edwards-Curve 數據簽名算法(EdDSA)
- JEP-360:封閉類(預覽特性)
- JEP-371:隱藏類
- JEP-372:移除了 Nashorn JavaScript 腳本引擎、APIs,以及 jjs 工具
- JEP-373:重新實現了老的 DatagramSocket API 接口
- JEP-374:禁用和廢除偏向鎖
- JEP-375:模式匹配(第二次預覽)
- JEP-377:ZGC:一個可伸縮、低延遲的垃圾回收器
- JEP-378:文本塊,是一個多行字符串,它可以避免使用大多數轉義符號,自動以可預測的方式格式化字符串,并讓開發人員在需要時可以控制格式。
- JEP-379:Shenandoah:一個低停頓時間的垃圾回收器
- JEP-381:移除了 Solaris 和 SPARC 端口
- JEP-383:外部內存訪問 API(二次孵化)
- JEP-384:記錄類(第二次預覽)
- JEP-385:廢除 RMI 激活,以便在將來進行刪除
Java SE 16:JDK 16發布于2021年3月17號,包含了下列新特性:
- JEP-338:Vector API(孵化中)
- JEP-347:啟用了新的C++特性
- JEP-357:從 Mercurial 遷移到 Git
- JEP-369:遷移到GitHub
- JEP-376:ZGC垃圾收集器
- JEP-380:Unix域套接字通道
- JEP-386:在x64和AArch64體系結構上,將JDK移植到Alpine Linux以及其它使用musl C庫的Linxu發行版上。
- JEP-387:Elastic Metaspace
- JEP-388:將 JDK 移植到 Windows / AArch64平臺。
- JEP-389:外部鏈接器API(孵化中)
- JEP-390:Warnings for Value-Based Classes
- JEP-392:打包工具
- JEP-393:外部內存訪問 API (第三次孵化)
- JEP-394:instanceof的模式匹配
- JEP-395:記錄類
- JEP-396:默認情況下嚴格封裝JDK
- JEP-397:密封類,被final修飾的類,密封類不能被繼承,防止了惡意的派生。
總結
了解了Java的發展歷史,想必你一定會對這個當下非常熱門的語言產生了濃厚的興趣。相信我,Java并不難學,而且學好Java不僅能為我們裝備一款強有力的武器,而且還能找到一份薪資不低的工作,何樂而不為呢?接下來,讓我們一起走進Java的探索之旅!
上一節:Java夯實基礎系列文章目錄
下一節:開發環境配置
總結
以上是生活随笔為你收集整理的【编程语言】Java夯实基础(一):Java的起源与发展的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MAX31856中文文档
- 下一篇: .NetCore框架Surging系列(