附录C 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生态系统的核心啊。
“我真正关心的是Java虚拟机的概念,因为是它把所有的东西都联系在了一起;是它造就了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.length
fun <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上的语言”:
丰富多彩的JVM生态
一个完整的语言有:
前端、优化、后端、runtime、库
JVM生态体系,把后面四个都给包办了。
jvm(Java虚拟机),是用C写的,跟操作系统打交道C/C++目前看来,是好的选择。虚拟机就是java与操作系统的中间层。
库/API就基本是java自身封装实现。
从最初的Jython和JRuby,到Scala,Clojure都是在JVM上实现的语言。为什么它们选择JVM?
跨平台
你的语言编译器后端只需要输出 JVM 字节码就可以。跨平台需要极大的工作量(这个轮子,造起来有点耗时耗力)
JIT (Just-In-Time 即时编译)性能
JIT 可以在运行中记录程序运行的特征,并在其基础上做大量的优化(Java 企业级应用的优秀性能很大程度上是由此而来)。 JIT 自从 HotSpot JVM 随 Java 1.2 发布以来,JVM JIT 的性能不断提高,是无可争议的成功产品。把 JVM 作为目标平台意味着大量的性能优化工作可以「外包」给 JVM 来做,大大缩减了 Guest 语言的开发预算。
JVM 作为一个成熟的高层运行环境,为 Guest 语言提供了很多运行时所需要的服务,比如内存管理(有业界领先的垃圾回收等),很大程度上避免了额外的独立开发。
社区庞大且成熟
JVM 有多个独立实现,也有若干厂商会持续推进,资料完备,社区巨大。
Java 社区有大量成熟的库,一般来说,运行在 JVM 上的其它语言都会设计一个专用的「桥」来帮助直接使用 Java 的库。
Java 有成熟的开发工具和环境。
题外话
另外一个趋势是把 Javascript 成为新的目标平台。很多主流语言都已经出现了编译器可以翻译成 Javascript,这也是得益于近年来 Javascript 虚拟机性能的显著提升。
List-of-languages-that-compile-to-JS:
https://github.com/jashkenas/coffeescript/wiki/List-of-languages-that-compile-to-JS
下一代普遍可接受语言(next mass-appeal language)
下一代普遍可接受语言(next mass-appeal language)中,人的因素应该起到重要作用。
- 新的程序设计语言中的代码片段应该具备一个典型程序员所希望的适度复杂性。程序员会去期望在每天的工作中使用的语言。
- 中级程序员认可。所谓中级程序员是指那些普遍对博客、微博或者新语言不感兴趣的人。
- 程序员可以不用别人的帮助或者接受培训,就能对新的程序设计语言中的代码片段的功能进行合理的准确的推测。
NBJL可以走多远就目前来看是难以下定论的,但是我相信这是一个比较实际的问题。我们所需要的新的程序设计语言能够不需要大规模的培训,程序员们可以快速上手。
在其功能方面,注诸如如下条目:
- 类C的语法(很好用也很熟悉)
- 静态类型(动态类型过于松散并且性能有限)
- 遵循面向对象程序设计(Object Oriented Programming,OOP)思想,并且包括函数式语言的元素(纯函数式言非主流编程语言)
- 易于反射获得(从而避免静态类型限制)
- 属性(getter和setter实在是太让人讨厌了)
- 闭包
- Null判断(提供一个判断变量能否为null的方式)
- 并发(好过原始线程和共享可变状态(shared mutable state))
- 模块化(需要考虑更大的单元)
- 工具(希望新语言能够对于工具开发有所帮助)
- 可扩展性(语言的设计具备很好的可扩展性,以支持其上的二次开发,而不需要去修改语言本身的设计)
...
当然还有其他一些可以讨论的主题-语言设计其实堪比艺术品设计,有太多角度可以观察了。
参考资料
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.jianshu.com/p/ece917620dfd
网友评论