《Spring Boot极简教程》附录4 Java编程简史
附錄4 Java編程簡史
從GOTO到OOP
在20世紀60年代,軟件曾出現過嚴重危機,由軟件錯誤而引起的信息丟失、系統報廢事件屢有發生。為此,1968年,荷蘭E.W.Dijkstra提出了程序設計中常用的GOTO語句的三大危害:
破壞了程序的靜動一致性;
程序不易測試;
限制了代碼優化。
此舉引起了軟件界長達數年的論戰,并由此產生了結構化程序設計方法,同時誕生了基于這一設計方法的程序設計語言Pascal。
由瑞士Niklaus Wirth開發的Pascal,具備優秀的數據結構和控制結構,為程序員提供了極大的方便性與靈活性,大受歡迎。筆者中學時候,第一門啟蒙語言就是Pascal。至今還清晰記得那臺式屏幕上藍色的Turbo Pascal界面,閃爍著白色的代碼的場景。
結構化程序設計思想采用了模塊分解與功能抽象和自頂向下、分而治之的方法,從而有效地將一個較復雜的程序系統設計任務分解成許多易于控制和處理的子程序,便于開發和維護。因此,結構化方法迅速走紅,并在整個20世紀70年代的軟件開發中占絕對統治地位。
但是,到了70年代末期,隨著計算機科學的發展和應用領域的不斷擴大,對計算機技術的要求越來越高。結構化程序設計語言和結構化分析與設計已無法滿足用戶需求的變化,于是面向對象編程(OOP)技術隨之而來。 面向對象程序設計在未來的軟件開發領域引起了大的變革,極大地提高了軟件開發的效率。
Java簡史
Java語言由當時在Sun Microsystems上班的詹姆斯·高斯林(James Gosling)等人于1990年代初開發。
Java伴隨著互聯網的迅猛發展而發展,逐漸成為最重要的網絡編程語言之一。下圖是來自TIOBE編程語言社區的語言排行(TOP20, 2017.3)和占比趨勢(2002- )[1]:
下面是一張反應Java發展簡史的表格:
| 1991.4 | Oak(Java前身) | Oak當時在消費品市場上并不算成功,但隨著1995年互聯網潮流的興起,Oak迅速找到了最適合自己發展的市場定位并蛻變成為Java語言。 |
| 1995.5.23 | Java 1.0 | Oak語言改名為Java,正式發布Java 1.0版本。Java語言第一次提出了“Write Once,Run Anywhere”的口號。 |
| 1996.1.23 | JDK 1.0 | Java語言有了第一個正式版本的運行環境。JDK 1.0提供了一個純解釋執行的Java虛擬機實現(Sun Classic VM)。JDK 1.0版本的代表技術包括:Java虛擬機、Applet、AWT等。 |
| 1996.4 | / | 10個最主要的操作系統供應商申明將在其產品中嵌入Java技術。同年9月,已有大約8.3萬個網頁應用了Java技術來制作。在1996年5月底,Sun公司于美國舊金山舉行了首屆JavaOne大會,從此JavaOne成為全世界數百萬Java語言開發者每年一度的技術盛會。 |
| 1997.2.19 | JDK 1.1 | JAR文件格式、JDBC、JavaBeans、RMI。Java語法也有了一定的發展,如內部類(Inner Class)和反射(Reflection)都是在這個時候出現的。從1.1.4之后,每個JDK版本都有一個自己的名字(工程代號),分別為:JDK 1.1.4 - Sparkler(寶石)、JDK 1.1.5 - Pumpkin(南瓜)、JDK 1.1.6 - Abigail(阿比蓋爾,女子名)、JDK 1.1.7 - Brutus(布魯圖,古羅馬政治家和將軍)和JDK 1.1.8 – Chelsea(切爾西,城市名)。 |
| 1998.12.4 | JDK 1.2 | Playground(競技場),Java技術體系拆分為3個方向: 面向桌面應用開發的J2SE(Java 2 Platform, Standard Edition)、面向企業級開發的J2EE(Java 2 Platform, Enterprise Edition)和面向手機等移動終端開發的J2ME(Java 2 Platform, Micro Edition)。在這個版本中出現的代表性技術非常多,如EJB、Java Plug-in、Java IDL、Swing等,并且這個版本中Java虛擬機第一次內置了JIT(Just In Time)編譯器(JDK 1.2中曾并存過3個虛擬機,Classic VM、HotSpot VM和Exact VM,其中Exact VM只在Solaris平臺出現過;后面兩個虛擬機都是內置JIT編譯器的,而之前版本所帶的Classic VM只能以外掛的形式使用JIT編譯器)。在語言和API級別上,Java添加了strictfp關鍵字與現在Java編碼之中極為常用的一系列Collections集合類。在1999年3月和7月,分別有JDK 1.2.1和JDK 1.2.2兩個小版本發布。 |
| 1999.4.27 | JDK 1.2 | HotSpot虛擬機伴隨JDK 1.2發布。HotSpot最初由一家名為“Longview Technologies”的小公司開發,因為HotSpot的優異表現,這家公司在1997年被Sun公司收購。HotSpot虛擬機后來成為JDK 1.3及之后所有版本的Sun JDK的默認虛擬機。 |
| 2000.5.8 | JDK 1.3 | Kestrel(美洲紅隼)。新增了數學運算類庫和新的Timer API,JNDI服務,新的Java 2D API,JavaSound類庫等。修正版本JDK 1.3.1,工程代號為Ladybird(瓢蟲),于2001年5月17日發布。自從JDK 1.3開始,Sun維持了一個習慣:大約每隔兩年發布一個JDK的主版本,以動物命名,期間發布的各個修正版本則以昆蟲作為工程名稱。 |
| 2002.2.13 | JDK 1.4 | Merlin(灰背隼)。JDK 1.4是Java真正走向成熟的一個版本。新的技術特性:正則表達式、異常鏈、NIO、日志類、XML解析器和XSLT轉換器等。2002年9月16日發布的工程代號為Grasshopper(蚱蜢)的JDK 1.4.1。2003年6月26日發布的工程代號為Mantis(螳螂)的JDK 1.4.2。 |
| 2004.9.30 | JDK 1.5 | Tiger(老虎)。從JDK 1.2以來,Java在語法層面上的變換一直很小,而JDK 1.5在Java語法易用性上做出了非常大的改進: 自動裝箱、泛型、動態注解、枚舉、可變長參數、遍歷循環(foreach循環)等語法特性都是在JDK 1.5中加入的。在虛擬機和API層面上,這個版本改進了Java的內存模型(Java Memory Model,JMM)、提供了java.util.concurrent并發包等。 |
| 2006.12.11 | JDK 1.6 | Mustang(野馬)。在這個版本中,啟用Java SE 6、Java EE 6、Java ME 6的命名方式。JDK 1.6的改進包括:提供動態語言支持(通過內置Mozilla Java Rhino引擎實現)、提供編譯API和微型HTTP服務器API等。同時,這個版本對Java虛擬機內部做了大量改進,包括鎖與同步、垃圾收集、類加載等方面的算法都有相當多的改動。 |
| 2006.11.13 | / | JavaOne大會上,Sun公司宣布最終會將Java開源,并在隨后的一年多時間內,陸續將JDK的各個部分在GPL v2協議下公開了源碼,并建立了OpenJDK組織對這些源碼進行獨立管理。除了極少量的產權代碼(Encumbered Code,這部分代碼大多是Sun本身也無權限進行開源處理的)外,OpenJDK幾乎包括了Sun JDK的全部代碼。 |
| 2009.2.19 | JDK 1.7 M1 | Dolphin(海豚)。完成第一個里程碑版本。根據JDK 1.7的功能規劃,一共設置了10個里程碑。從JDK 1.7最開始的功能規劃來看,它本應是一個包含許多重要改進的JDK版本,其中的Lambda項目(Lambda表達式、函數式編程)、Jigsaw項目(虛擬機模塊化支持)、動態語言支持、GarbageFirst收集器和Coin項目(語言細節進化)等子項目對于Java業界都會產生深遠的影響。在JDK 1.7開發期間,Oracle收購Sun,裁剪了JDK 1.7預定目標,以便保證JDK 1.7的正式版能夠于2011年7月28日準時發布。其中Lambda項目、Jigsaw項目和Coin項目的部分改進延遲到JDK 1.8之中。最終,JDK 1.7的主要改進包括:提供新的G1收集器(G1在發布時依然處于Experimental狀態,直至2012年4月的Update 4中才正式“轉正”)、加強對非Java語言的調用支持(JSR-292,這項特性到目前為止依然沒有完全實現定型)、升級類加載架構等。 |
| 2011.7.28 | JDK 7 | 一些語法特性增強,java.nio.file新API,JDBC 4.1,新增API:并發工具、Networking、Multithreaded Custom Class Loaders、Security 、Internationalization ,JVM的一些特性增強等。 |
| 2014.3.18 | JDK 8 | Lambda表達式(函數式編程支持),接口默認方法,新的java.util.stream包以及 Date-Time API,Compact Profiles,安全性更新:加密體系架構、限制doPrivileged、SSL/TLS Server Name Indication (SNI) Extension以及增強密鑰庫,新的JavaScript引擎Nashorn 等。[2] |
JVM上的語言家族
大部分人大談特談JAVA語言,這對于我來說也許聽起來很奇怪,但是我無法不去在意。JVM才是Java生態系統的核心啊。(James Gosling, Java編程語言的創造者 (2011, TheServerSide))
JVM最初是為了支持java編程語言。然而,隨著時間的流逝,越來越多的語言被改編或設計運行在JVM上。除了java語言,比較知名的JVM上的編程語言還有:
Groovy
“Groovy有超過Java將能夠提供的甜點,例如它具有輕易地在宿主程序中嵌入并編譯,以提供定制業務規則的能力,還有它如何為領域特定語言(Domain-Specific Language)提供優雅,簡潔并且可讀性好的語法的能力.” ( Guillaume Laforge, Groovy的項目帶頭人)
動態類型和腳本語言(盡管一開始是一種動態語言,但在其 2012年的2.0發行版中也開始加入編譯時的靜態類型檢查了),Groovy的閉包(Closure)是很好的。Groovy使得運行時的元編程、編譯時的元編程、動態類型以及靜態類型容易處理。
關鍵詞: DSL,Grails,Gradle
Scala
“意在使其端正,而不塞入太多的語言特性到其里面,我在Scala上專注于使它變得更加的簡單.那是人們常常有的一種誤解,他們認為Scala是一種帶有許許多多特性的宏大語言.盡管這通常不是真的.它實際上是一個相當小的語言——當Java8面世之時它將比Java更加的小巧。” (Martin Odersky, Scala 創始人)
使用類型推斷混合了面向對象編程(OOP)和函數式編程(FP)的一種靜態類型編程語言。這意味著Scala程序能夠被編寫成許多完全不同的風格——純函數式風格的,不純函數式的,或混合式風格。
關鍵詞:FP,類型系統
Kotlin
“我們認為Kotlin的定位是一種現代化工業語言:它專注于代碼重用和可讀性的彈性抽象,以及面向早期錯誤偵測,和明確捕獲維護與清理的意圖,這些問題的靜態類型安全性。Kotlin最重要的使用場景之一是對于一個龐大的Java代碼庫,其開發者需要一個更棒的語言:你能夠將Java和Kotlin自由混合,遷移可以是漸進式的,不需要一下子對整個代碼庫進行改變。” (Andrey Breslav, Kotlin創始人)
靜態類型的語言, 由IntelliJ IDEA團隊JetBrains開發。
使用Kotin可以寫出一些非常優雅的代碼。舉個復合函數的例子[6]:
/*** The composition function return a composition of two functions passed to it:* compose(f, g) = f(g(*)).* Now, you can apply it to callable references.*/fun main(args: Array<String>) {val oddLength = compose(::isOdd, ::length)val strings = listOf("a", "ab", "abc")println(strings.filter(oddLength)) }fun isOdd(x: Int) = x % 2 != 0 fun length(s: String) = s.lengthfun <A, B, C> compose(f: (B) -> C, g: (A) -> B): (A) -> C {return { x -> f(g(x)) } }關鍵詞:IDEA,優雅
Clojure
“我著手創建一種語言,意在應對我在使用Java和C#編寫的一些類型的應用程序——像廣播自動化、調度以及選舉系統之類那些東西——它們許多都需要解決的并發問題.我發現只用面向對象編程和用那些語言的并發方法,對于處理這些類型的問題并不怎么夠好——它們太難了。我是List的擁護者,還有其它的函數式語言,而我想要做的就是解決那些問題,創造一種立足于實際的語言,再也不用拿Java來編程了.” (Rich Hickey, Clojure創始人在2009年InfoQ訪談)
動態類型語言,Lisp方言。Clojure是一種非常類似于Lisp和Scheme的函數式編程語言.函數式范式同那些習慣于Java的面向對象方式并且習慣于其副作用的方式非常不同。
關鍵詞: Lisp,FP
JVM語言時間軸概覽[5]:
用哪種 JVM 語言?
使用哪種語言,完全依賴程序員的性情了。但是在項目,工作中“應該使用”哪種語言,往往會有諸多限制。
RebelLabs《Java工具和技術概覽2014》[4]的報告上“要去學習的下一個JVM語言”:
RebelLabs《Java工具和技術概覽2016》[4]的報告上的“你最常使用的JVM上的語言”:
以上僅供參考。
參考資料
1.https://www.tiobe.com/tiobe-index/
2.https://blogs.oracle.com/thejavatutorials/entry/jdk_8_is_released
3.https://en.wikipedia.org/wiki/List_of_JVM_languages
4.https://zeroturnaround.com/rebellabs/java-tools-and-technologies-landscape-2016/
5.http://www.oschina.net/translate/the-adventurous-developers-guide-to-jvm-languages
6.http://try.kotlinlang.org/#/Examples/Callable%20references/Composition%20of%20functions/Composition%20of%20functions.kt
總結
以上是生活随笔為你收集整理的《Spring Boot极简教程》附录4 Java编程简史的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 即使是一个技术人员,也需要知道沟通的重要
- 下一篇: ThinkPHP的易忽视点小结