附錄C Java編程簡(jiǎn)史
從GOTO到OOP
在20世紀(jì)60年代,軟件曾出現(xiàn)過嚴(yán)重危機(jī),由軟件錯(cuò)誤而引起的信息丟失、系統(tǒng)報(bào)廢事件屢有發(fā)生。為此,1968年,荷蘭E.W.Dijkstra提出了程序設(shè)計(jì)中常用的GOTO語(yǔ)句的三大危害:
破壞了程序的靜動(dòng)一致性;
程序不易測(cè)試;
限制了代碼優(yōu)化。
此舉引起了軟件界長(zhǎng)達(dá)數(shù)年的論戰(zhàn),并由此產(chǎn)生了結(jié)構(gòu)化程序設(shè)計(jì)方法,同時(shí)誕生了基于這一設(shè)計(jì)方法的程序設(shè)計(jì)語(yǔ)言Pascal。
由瑞士Niklaus Wirth開發(fā)的Pascal,具備優(yōu)秀的數(shù)據(jù)結(jié)構(gòu)和控制結(jié)構(gòu),為程序員提供了極大的方便性與靈活性,大受歡迎。筆者中學(xué)時(shí)候,第一門啟蒙語(yǔ)言就是Pascal。至今還清晰記得那臺(tái)式屏幕上藍(lán)色的Turbo Pascal界面,閃爍著白色的代碼的場(chǎng)景。
結(jié)構(gòu)化程序設(shè)計(jì)思想采用了模塊分解與功能抽象和自頂向下、分而治之的方法,從而有效地將一個(gè)較復(fù)雜的程序系統(tǒng)設(shè)計(jì)任務(wù)分解成許多易于控制和處理的子程序,便于開發(fā)和維護(hù)。因此,結(jié)構(gòu)化方法迅速走紅,并在整個(gè)20世紀(jì)70年代的軟件開發(fā)中占絕對(duì)統(tǒng)治地位。
但是,到了70年代末期,隨著計(jì)算機(jī)科學(xué)的發(fā)展和應(yīng)用領(lǐng)域的不斷擴(kuò)大,對(duì)計(jì)算機(jī)技術(shù)的要求越來(lái)越高。結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言和結(jié)構(gòu)化分析與設(shè)計(jì)已無(wú)法滿足用戶需求的變化,于是面向?qū)ο缶幊蹋∣OP)技術(shù)隨之而來(lái)。 面向?qū)ο蟪绦蛟O(shè)計(jì)在未來(lái)的軟件開發(fā)領(lǐng)域引起了大的變革,極大地提高了軟件開發(fā)的效率。
Java簡(jiǎn)史
Java語(yǔ)言由當(dāng)時(shí)在Sun Microsystems上班的詹姆斯·高斯林(James Gosling)等人于1990年代初開發(fā)。
Java伴隨著互聯(lián)網(wǎng)的迅猛發(fā)展而發(fā)展,逐漸成為最重要的網(wǎng)絡(luò)編程語(yǔ)言之一。下圖是來(lái)自TIOBE編程語(yǔ)言社區(qū)的語(yǔ)言排行(TOP20, 2017.3)和占比趨勢(shì)(2002- )[1]:
下面是一張反應(yīng)Java發(fā)展簡(jiǎn)史的表格:
時(shí)間 | 版本 | 特征備注 |
---|---|---|
1991.4 | Oak(Java前身) | Oak當(dāng)時(shí)在消費(fèi)品市場(chǎng)上并不算成功,但隨著1995年互聯(lián)網(wǎng)潮流的興起,Oak迅速找到了最適合自己發(fā)展的市場(chǎng)定位并蛻變成為Java語(yǔ)言。 |
1995.5.23 | Java 1.0 | Oak語(yǔ)言改名為Java,正式發(fā)布Java 1.0版本。Java語(yǔ)言第一次提出了“Write Once,Run Anywhere”的口號(hào)。 |
1996.1.23 | JDK 1.0 | Java語(yǔ)言有了第一個(gè)正式版本的運(yùn)行環(huán)境。JDK 1.0提供了一個(gè)純解釋執(zhí)行的Java虛擬機(jī)實(shí)現(xiàn)(Sun Classic VM)。JDK 1.0版本的代表技術(shù)包括:Java虛擬機(jī)、Applet、AWT等。 |
1996.4 | / | 10個(gè)最主要的操作系統(tǒng)供應(yīng)商申明將在其產(chǎn)品中嵌入Java技術(shù)。同年9月,已有大約8.3萬(wàn)個(gè)網(wǎng)頁(yè)應(yīng)用了Java技術(shù)來(lái)制作。在1996年5月底,Sun公司于美國(guó)舊金山舉行了首屆JavaOne大會(huì),從此JavaOne成為全世界數(shù)百萬(wàn)Java語(yǔ)言開發(fā)者每年一度的技術(shù)盛會(huì)。 |
1997.2.19 | JDK 1.1 | JAR文件格式、JDBC、JavaBeans、RMI。Java語(yǔ)法也有了一定的發(fā)展,如內(nèi)部類(Inner Class)和反射(Reflection)都是在這個(gè)時(shí)候出現(xiàn)的。從1.1.4之后,每個(gè)JDK版本都有一個(gè)自己的名字(工程代號(hào)),分別為: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(競(jìng)技場(chǎng)),Java技術(shù)體系拆分為3個(gè)方向: 面向桌面應(yīng)用開發(fā)的J2SE(Java 2 Platform, Standard Edition)、面向企業(yè)級(jí)開發(fā)的J2EE(Java 2 Platform, Enterprise Edition)和面向手機(jī)等移動(dòng)終端開發(fā)的J2ME(Java 2 Platform, Micro Edition)。在這個(gè)版本中出現(xiàn)的代表性技術(shù)非常多,如EJB、Java Plug-in、Java IDL、Swing等,并且這個(gè)版本中Java虛擬機(jī)第一次內(nèi)置了JIT(Just In Time)編譯器(JDK 1.2中曾并存過3個(gè)虛擬機(jī),Classic VM、HotSpot VM和Exact VM,其中Exact VM只在Solaris平臺(tái)出現(xiàn)過;后面兩個(gè)虛擬機(jī)都是內(nèi)置JIT編譯器的,而之前版本所帶的Classic VM只能以外掛的形式使用JIT編譯器)。在語(yǔ)言和API級(jí)別上,Java添加了strictfp關(guān)鍵字與現(xiàn)在Java編碼之中極為常用的一系列Collections集合類。在1999年3月和7月,分別有JDK 1.2.1和JDK 1.2.2兩個(gè)小版本發(fā)布。 |
1999.4.27 | JDK 1.2 | HotSpot虛擬機(jī)伴隨JDK 1.2發(fā)布。HotSpot最初由一家名為“Longview Technologies”的小公司開發(fā),因?yàn)镠otSpot的優(yōu)異表現(xiàn),這家公司在1997年被Sun公司收購(gòu)。HotSpot虛擬機(jī)后來(lái)成為JDK 1.3及之后所有版本的Sun JDK的默認(rèn)虛擬機(jī)。 |
2000.5.8 | JDK 1.3 | Kestrel(美洲紅隼)。新增了數(shù)學(xué)運(yùn)算類庫(kù)和新的Timer API,JNDI服務(wù),新的Java 2D API,JavaSound類庫(kù)等。修正版本JDK 1.3.1,工程代號(hào)為L(zhǎng)adybird(瓢蟲),于2001年5月17日發(fā)布。自從JDK 1.3開始,Sun維持了一個(gè)習(xí)慣:大約每隔兩年發(fā)布一個(gè)JDK的主版本,以動(dòng)物命名,期間發(fā)布的各個(gè)修正版本則以昆蟲作為工程名稱。 |
2002.2.13 | JDK 1.4 | Merlin(灰背隼)。JDK 1.4是Java真正走向成熟的一個(gè)版本。新的技術(shù)特性:正則表達(dá)式、異常鏈、NIO、日志類、XML解析器和XSLT轉(zhuǎn)換器等。2002年9月16日發(fā)布的工程代號(hào)為Grasshopper(蚱蜢)的JDK 1.4.1。2003年6月26日發(fā)布的工程代號(hào)為Mantis(螳螂)的JDK 1.4.2。 |
2004.9.30 | JDK 1.5 | Tiger(老虎)。從JDK 1.2以來(lái),Java在語(yǔ)法層面上的變換一直很小,而JDK 1.5在Java語(yǔ)法易用性上做出了非常大的改進(jìn): 自動(dòng)裝箱、泛型、動(dòng)態(tài)注解、枚舉、可變長(zhǎng)參數(shù)、遍歷循環(huán)(foreach循環(huán))等語(yǔ)法特性都是在JDK 1.5中加入的。在虛擬機(jī)和API層面上,這個(gè)版本改進(jìn)了Java的內(nèi)存模型(Java Memory Model,JMM)、提供了java.util.concurrent并發(fā)包等。 |
2006.12.11 | JDK 1.6 | Mustang(野馬)。在這個(gè)版本中,啟用Java SE 6、Java EE 6、Java ME 6的命名方式。JDK 1.6的改進(jìn)包括:提供動(dòng)態(tài)語(yǔ)言支持(通過內(nèi)置Mozilla Java Rhino引擎實(shí)現(xiàn))、提供編譯API和微型HTTP服務(wù)器API等。同時(shí),這個(gè)版本對(duì)Java虛擬機(jī)內(nèi)部做了大量改進(jìn),包括鎖與同步、垃圾收集、類加載等方面的算法都有相當(dāng)多的改動(dòng)。 |
2006.11.13 | / | JavaOne大會(huì)上,Sun公司宣布最終會(huì)將Java開源,并在隨后的一年多時(shí)間內(nèi),陸續(xù)將JDK的各個(gè)部分在GPL v2協(xié)議下公開了源碼,并建立了OpenJDK組織對(duì)這些源碼進(jìn)行獨(dú)立管理。除了極少量的產(chǎn)權(quán)代碼(Encumbered Code,這部分代碼大多是Sun本身也無(wú)權(quán)限進(jìn)行開源處理的)外,OpenJDK幾乎包括了Sun JDK的全部代碼。 |
2009.2.19 | JDK 1.7 M1 | Dolphin(海豚)。完成第一個(gè)里程碑版本。根據(jù)JDK 1.7的功能規(guī)劃,一共設(shè)置了10個(gè)里程碑。從JDK 1.7最開始的功能規(guī)劃來(lái)看,它本應(yīng)是一個(gè)包含許多重要改進(jìn)的JDK版本,其中的Lambda項(xiàng)目(Lambda表達(dá)式、函數(shù)式編程)、Jigsaw項(xiàng)目(虛擬機(jī)模塊化支持)、動(dòng)態(tài)語(yǔ)言支持、GarbageFirst收集器和Coin項(xiàng)目(語(yǔ)言細(xì)節(jié)進(jìn)化)等子項(xiàng)目對(duì)于Java業(yè)界都會(huì)產(chǎn)生深遠(yuǎn)的影響。在JDK 1.7開發(fā)期間,Oracle收購(gòu)Sun,裁剪了JDK 1.7預(yù)定目標(biāo),以便保證JDK 1.7的正式版能夠于2011年7月28日準(zhǔn)時(shí)發(fā)布。其中Lambda項(xiàng)目、Jigsaw項(xiàng)目和Coin項(xiàng)目的部分改進(jìn)延遲到JDK 1.8之中。最終,JDK 1.7的主要改進(jìn)包括:提供新的G1收集器(G1在發(fā)布時(shí)依然處于Experimental狀態(tài),直至2012年4月的Update 4中才正式“轉(zhuǎn)正”)、加強(qiáng)對(duì)非Java語(yǔ)言的調(diào)用支持(JSR-292,這項(xiàng)特性到目前為止依然沒有完全實(shí)現(xiàn)定型)、升級(jí)類加載架構(gòu)等。 |
2011.7.28 | JDK 7 | 一些語(yǔ)法特性增強(qiáng),java.nio.file新API,JDBC 4.1,新增API:并發(fā)工具、Networking、Multithreaded Custom Class Loaders、Security 、Internationalization ,JVM的一些特性增強(qiáng)等。 |
2014.3.18 | JDK 8 | Lambda表達(dá)式(函數(shù)式編程支持),接口默認(rèn)方法,新的java.util.stream包以及 Date-Time API,Compact Profiles,安全性更新:加密體系架構(gòu)、限制doPrivileged、SSL/TLS Server Name Indication (SNI) Extension以及增強(qiáng)密鑰庫(kù),新的JavaScript引擎Nashorn 等。[2] |
JVM上的語(yǔ)言家族
大部分人大談特談JAVA語(yǔ)言,這對(duì)于我來(lái)說(shuō)也許聽起來(lái)很奇怪,但是我無(wú)法不去在意。JVM才是Java生態(tài)系統(tǒng)的核心啊。
“我真正關(guān)心的是Java虛擬機(jī)的概念,因?yàn)槭撬阉械臇|西都聯(lián)系在了一起;是它造就了Java語(yǔ)言;是它使得事物能在所有的異構(gòu)平臺(tái)上得到運(yùn)行;也還是它使得所有類型的語(yǔ)言能夠共存。”
(James Gosling, Java編程語(yǔ)言的創(chuàng)造者 (2011, TheServerSide))
JVM最初是為了支持java編程語(yǔ)言。然而,隨著時(shí)間的流逝,越來(lái)越多的語(yǔ)言被改編或設(shè)計(jì)運(yùn)行在JVM上。除了java語(yǔ)言,比較知名的JVM上的編程語(yǔ)言還有:
Groovy
“Groovy有超過Java將能夠提供的甜點(diǎn),例如它具有輕易地在宿主程序中嵌入并編譯,以提供定制業(yè)務(wù)規(guī)則的能力,還有它如何為領(lǐng)域特定語(yǔ)言(Domain-Specific Language)提供優(yōu)雅,簡(jiǎn)潔并且可讀性好的語(yǔ)法的能力.” ( Guillaume Laforge, Groovy的項(xiàng)目帶頭人)
動(dòng)態(tài)類型和腳本語(yǔ)言(盡管一開始是一種動(dòng)態(tài)語(yǔ)言,但在其 2012年的2.0發(fā)行版中也開始加入編譯時(shí)的靜態(tài)類型檢查了),Groovy的閉包(Closure)是很好的。Groovy使得運(yùn)行時(shí)的元編程、編譯時(shí)的元編程、動(dòng)態(tài)類型以及靜態(tài)類型容易處理。
關(guān)鍵詞: DSL,Grails,Gradle
Scala
“意在使其端正,而不塞入太多的語(yǔ)言特性到其里面,我在Scala上專注于使它變得更加的簡(jiǎn)單.那是人們常常有的一種誤解,他們認(rèn)為Scala是一種帶有許許多多特性的宏大語(yǔ)言.盡管這通常不是真的.它實(shí)際上是一個(gè)相當(dāng)小的語(yǔ)言——當(dāng)Java8面世之時(shí)它將比Java更加的小巧。” (Martin Odersky, Scala 創(chuàng)始人)
使用類型推斷混合了面向?qū)ο缶幊蹋∣OP)和函數(shù)式編程(FP)的一種靜態(tài)類型編程語(yǔ)言。這意味著Scala程序能夠被編寫成許多完全不同的風(fēng)格——純函數(shù)式風(fēng)格的,不純函數(shù)式的,或混合式風(fēng)格。
關(guān)鍵詞:FP,類型系統(tǒng)
Kotlin
“我們認(rèn)為Kotlin的定位是一種現(xiàn)代化工業(yè)語(yǔ)言:它專注于代碼重用和可讀性的彈性抽象,以及面向早期錯(cuò)誤偵測(cè),和明確捕獲維護(hù)與清理的意圖,這些問題的靜態(tài)類型安全性。Kotlin最重要的使用場(chǎng)景之一是對(duì)于一個(gè)龐大的Java代碼庫(kù),其開發(fā)者需要一個(gè)更棒的語(yǔ)言:你能夠?qū)ava和Kotlin自由混合,遷移可以是漸進(jìn)式的,不需要一下子對(duì)整個(gè)代碼庫(kù)進(jìn)行改變。” (Andrey Breslav, Kotlin創(chuàng)始人)
靜態(tài)類型的語(yǔ)言, 由IntelliJ IDEA團(tuán)隊(duì)JetBrains開發(fā)。
使用Kotin可以寫出一些非常優(yōu)雅的代碼。舉個(gè)復(fù)合函數(shù)的例子[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.length
fun <A, B, C> compose(f: (B) -> C, g: (A) -> B): (A) -> C {
return { x -> f(g(x)) }
}
關(guān)鍵詞:IDEA,優(yōu)雅
Clojure
“我著手創(chuàng)建一種語(yǔ)言,意在應(yīng)對(duì)我在使用Java和C#編寫的一些類型的應(yīng)用程序——像廣播自動(dòng)化、調(diào)度以及選舉系統(tǒng)之類那些東西——它們?cè)S多都需要解決的并發(fā)問題.我發(fā)現(xiàn)只用面向?qū)ο缶幊毯陀媚切┱Z(yǔ)言的并發(fā)方法,對(duì)于處理這些類型的問題并不怎么夠好——它們太難了。我是List的擁護(hù)者,還有其它的函數(shù)式語(yǔ)言,而我想要做的就是解決那些問題,創(chuàng)造一種立足于實(shí)際的語(yǔ)言,再也不用拿Java來(lái)編程了.” (Rich Hickey, Clojure創(chuàng)始人在2009年InfoQ訪談)
動(dòng)態(tài)類型語(yǔ)言,Lisp方言。Clojure是一種非常類似于Lisp和Scheme的函數(shù)式編程語(yǔ)言.函數(shù)式范式同那些習(xí)慣于Java的面向?qū)ο蠓绞讲⑶伊?xí)慣于其副作用的方式非常不同。
關(guān)鍵詞: Lisp,F(xiàn)P
JVM語(yǔ)言時(shí)間軸概覽[5]:
用哪種 JVM 語(yǔ)言?
使用哪種語(yǔ)言,完全依賴程序員的性情了。但是在項(xiàng)目,工作中“應(yīng)該使用”哪種語(yǔ)言,往往會(huì)有諸多限制。
RebelLabs《Java工具和技術(shù)概覽2014》[4]的報(bào)告上“要去學(xué)習(xí)的下一個(gè)JVM語(yǔ)言”:
RebelLabs《Java工具和技術(shù)概覽2016》[4]的報(bào)告上的“你最常使用的JVM上的語(yǔ)言”:
豐富多彩的JVM生態(tài)
一個(gè)完整的語(yǔ)言有:
前端、優(yōu)化、后端、runtime、庫(kù)
JVM生態(tài)體系,把后面四個(gè)都給包辦了。
jvm(Java虛擬機(jī)),是用C寫的,跟操作系統(tǒng)打交道C/C++目前看來(lái),是好的選擇。虛擬機(jī)就是java與操作系統(tǒng)的中間層。
庫(kù)/API就基本是java自身封裝實(shí)現(xiàn)。
從最初的Jython和JRuby,到Scala,Clojure都是在JVM上實(shí)現(xiàn)的語(yǔ)言。為什么它們選擇JVM?
跨平臺(tái)
你的語(yǔ)言編譯器后端只需要輸出 JVM 字節(jié)碼就可以。跨平臺(tái)需要極大的工作量(這個(gè)輪子,造起來(lái)有點(diǎn)耗時(shí)耗力)
JIT (Just-In-Time 即時(shí)編譯)性能
JIT 可以在運(yùn)行中記錄程序運(yùn)行的特征,并在其基礎(chǔ)上做大量的優(yōu)化(Java 企業(yè)級(jí)應(yīng)用的優(yōu)秀性能很大程度上是由此而來(lái))。 JIT 自從 HotSpot JVM 隨 Java 1.2 發(fā)布以來(lái),JVM JIT 的性能不斷提高,是無(wú)可爭(zhēng)議的成功產(chǎn)品。把 JVM 作為目標(biāo)平臺(tái)意味著大量的性能優(yōu)化工作可以「外包」給 JVM 來(lái)做,大大縮減了 Guest 語(yǔ)言的開發(fā)預(yù)算。
JVM 作為一個(gè)成熟的高層運(yùn)行環(huán)境,為 Guest 語(yǔ)言提供了很多運(yùn)行時(shí)所需要的服務(wù),比如內(nèi)存管理(有業(yè)界領(lǐng)先的垃圾回收等),很大程度上避免了額外的獨(dú)立開發(fā)。
社區(qū)龐大且成熟
JVM 有多個(gè)獨(dú)立實(shí)現(xiàn),也有若干廠商會(huì)持續(xù)推進(jìn),資料完備,社區(qū)巨大。
Java 社區(qū)有大量成熟的庫(kù),一般來(lái)說(shuō),運(yùn)行在 JVM 上的其它語(yǔ)言都會(huì)設(shè)計(jì)一個(gè)專用的「橋」來(lái)幫助直接使用 Java 的庫(kù)。
Java 有成熟的開發(fā)工具和環(huán)境。
題外話
另外一個(gè)趨勢(shì)是把 Javascript 成為新的目標(biāo)平臺(tái)。很多主流語(yǔ)言都已經(jīng)出現(xiàn)了編譯器可以翻譯成 Javascript,這也是得益于近年來(lái) Javascript 虛擬機(jī)性能的顯著提升。
List-of-languages-that-compile-to-JS:
https://github.com/jashkenas/coffeescript/wiki/List-of-languages-that-compile-to-JS
下一代普遍可接受語(yǔ)言(next mass-appeal language)
下一代普遍可接受語(yǔ)言(next mass-appeal language)中,人的因素應(yīng)該起到重要作用。
- 新的程序設(shè)計(jì)語(yǔ)言中的代碼片段應(yīng)該具備一個(gè)典型程序員所希望的適度復(fù)雜性。程序員會(huì)去期望在每天的工作中使用的語(yǔ)言。
- 中級(jí)程序員認(rèn)可。所謂中級(jí)程序員是指那些普遍對(duì)博客、微博或者新語(yǔ)言不感興趣的人。
- 程序員可以不用別人的幫助或者接受培訓(xùn),就能對(duì)新的程序設(shè)計(jì)語(yǔ)言中的代碼片段的功能進(jìn)行合理的準(zhǔn)確的推測(cè)。
NBJL可以走多遠(yuǎn)就目前來(lái)看是難以下定論的,但是我相信這是一個(gè)比較實(shí)際的問題。我們所需要的新的程序設(shè)計(jì)語(yǔ)言能夠不需要大規(guī)模的培訓(xùn),程序員們可以快速上手。
在其功能方面,注諸如如下條目:
- 類C的語(yǔ)法(很好用也很熟悉)
- 靜態(tài)類型(動(dòng)態(tài)類型過于松散并且性能有限)
- 遵循面向?qū)ο蟪绦蛟O(shè)計(jì)(Object Oriented Programming,OOP)思想,并且包括函數(shù)式語(yǔ)言的元素(純函數(shù)式言非主流編程語(yǔ)言)
- 易于反射獲得(從而避免靜態(tài)類型限制)
- 屬性(getter和setter實(shí)在是太讓人討厭了)
- 閉包
- Null判斷(提供一個(gè)判斷變量能否為null的方式)
- 并發(fā)(好過原始線程和共享可變狀態(tài)(shared mutable state))
- 模塊化(需要考慮更大的單元)
- 工具(希望新語(yǔ)言能夠?qū)τ诠ぞ唛_發(fā)有所幫助)
- 可擴(kuò)展性(語(yǔ)言的設(shè)計(jì)具備很好的可擴(kuò)展性,以支持其上的二次開發(fā),而不需要去修改語(yǔ)言本身的設(shè)計(jì))
...
當(dāng)然還有其他一些可以討論的主題-語(yǔ)言設(shè)計(jì)其實(shí)堪比藝術(shù)品設(shè)計(jì),有太多角度可以觀察了。
參考資料
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
7.http://www.lxweimin.com/p/ece917620dfd