Java 20 年:转角遇到 Go
1995 年,横空出世的 Java 语言以其颠覆式的特性迅速获得了开发者的关注。跨平台、垃圾回收、面向对象,这在当时都是不可思议的事情,而 Java 却完美地在一门语言中实现了这一特性。可以说,Java 将编程语言设计带领到一个新的高度。20 年后的今天,当年的那些新特性已经不再是什么新鲜词。同时,又会有一些新的语言宣称自己有一些颠覆性的特性,其中 Go 语言就是新语言的一个代表,它部署简单、并发性好,在语言设计上确实优于Java。为了了解Java 和Go 语言的发展现状与趋势,InfoQ 采访了 Go 语言大牛郝林。
InfoQ:今年的 5 月 23 日是Java 的第 20 岁生日,转眼间,Java 已经走过了 20 年,版本号也已经更新到 Java 8。你怎么看 Java 这门语言?在这 20 年里,有哪些对你印象比较深刻的 Java 事件?
郝林:我觉得 Java 语言一路走来赚足了眼球也惹来了众多非议。就拿它随着 Sun 公司的 没落被流转到Oracle 公司来说吧。我记得当时有一大批Java 程序员在网上扬言要摒弃Java 语言,并 且一部分人真的这么做了。但事实证明,Oracle 更好地发展了 Java。我认为从Java 7 开始这门语言 相当于迎来了第二春,在发展上增速了不少,各种新鲜特性和类库层出不穷。Java 8 给我印象最深刻 的就是对 Lambda 表达式的支持。这使得 Java 真正地对函数式编程提供了支持。这是质的改变。也 终将使Java 语言走得更远。
InfoQ:从版本迭代的角度看,你认为 Java 的发展经历了哪几个阶段?
郝林:我是从 Java 1.3 的末期开始接触它的。所以在我看来 Java 1.3 之前就属于萌芽期吧 (虽然那时它已被广泛使用了)。从 1.4 开始,Java 语言有了很多改观,比如 NIO、更多的垃圾回收器、性能上的提升、Java EE 规范的逐步简化,等等。所以我认为从此 Java 进入了第一个高速发展期(也许有上一个但我没赶上)。到了Java 6 的时候,发展速度其实已经减缓不少了。这也可能是由于 Java 正处于被交接阶段的缘故。不过,我不得不说, Oracle 的调整动作很快,在几乎没有什么断档的情况下,Java 的发展又开始“跑”起来了。这也是我在前一个回答中说的“第二春”。
InfoQ:JVM 的普及促使相关周边语言不断涌现,你怎么看这些 JVM 语言?
郝林:这就是 Java 真正牛的地方。它不单单是一门语言,更是一个平台。到目前为止, JVM 语言已经有很多了,但是发展最好的是 Scala。它解决了一些 Java 在程序开发方面的问题。但是,我认为它的方向有所偏颇。我觉得“简化”往往比“丰富”来得更直接,效果也会更好。相比之下,Clojure 语言就做得很好。但是由于它是一个 Lisp 语言的方言,编码方式和思维方式与 Java 的面向对象思想相去甚远,所以仅仅被一小部分 Java 程序员接受。总之,JVM 语言让Java 更加流行了。它们虽不完美,但却功不可没。
InfoQ:很多人都在唱衰 Java,您能结合 Java 的发展现状和趋势谈谈 Java 的前景吗?
郝林:任何一个流行的技术都会有人唱衰,更何况 Java 已经发展了 20 年了,中间又经历 了种种坎坷。我觉得Java 9 又会是一个里程碑式的版本。我很期待。我认为在我可预见的未来Java 不会没落。实际上,Java 语言在企业级软件领域的霸主地位是不可动摇的。在互联网软件领域,它虽然受到了各种开发成本更低的语言(比如 Ruby 和 Python)的不断侵蚀,但是仍然占有一席之地。这正说明了 Java 生命力的顽强。不过,相比于 Java 语言, 我更看好Java 作为一个平台的前景。
InfoQ:你什么时候开始接触 Go 语言的?相比于 Java 语言,它有哪些优势?
郝林:我接触 Go 语言实际上并不算早,大约在 2013 年的上半年。那时候 Go 语言的版本 是 1.0,1.1 版本正处于开发期。Go 语言给我的第一印象就是支持多种编程范式、提供了给力的程序构建和发布工具,以及在并发编程方面的极度简化。在当时,我认为 Java 语言的不足恰恰就包括了这几个方面。所以我义无返顾的开始学习并使用 Go 语言。事实证明,Go 语言虽属于新兴语言,但它却是一种革新。另外,与Java 语言一样,Go 语言的向后兼容做的很好。并且,为了以防万一,它提供了一个命令用于自动地把旧版本的 Go 语言程序源码调整为当前版本的源码。诸如此类的“便捷大法”还有很多。许多在Java 世界中只能依靠额外的类库或工具才能完成的事情,在 Go 语言看来却是手到擒来。当然,这种实实在在的优势也有诞生时间不同的缘故。正是由于 Java 已经历经了太多,所以在很多方面都很难改变。我觉得这是所有编程语言都应该正视的问题。显然,Go 语言的创造者们已经意识到了这一点。
InfoQ:出色的并发性能是 Go 语言区别于其他语言的一大特色。相比于 Java 的并发编程,它有哪些显著性的优势?
郝林:说到并发,Go 语言给人们的第一印象就是便捷。在这便捷之下,Go 语言权衡了各 方面利弊,做了大量的工作,使得我们用极低的开发成本就可以编写出拥有超高运行性能的Go 语言并发程序。其中最大的亮点就是,Go 语言把“激活”需要并发执行的代码块的操作内置了。我们仅通过一个关键字“go”就可以轻易地完成这项操作。 还记得我们在 Java 中为此需要编写的代码是多么的冗长吗?侵入式的接口实现声明和类继承声明、复杂的匿名内部类,以及困难重重的线程间协调和调度。这些都是不可忽视的程序开发维护成本。我们在编写和修改这样的并发程序时都要保持头脑和思路的绝对清晰,否则就会埋下祸根,搞出不易察觉和定位的 Bug。另一方面,如果透过表象看本质的话,我们就可以看到 Go 语言为了程序员的方便而做的大量的工作。 笼统地讲,Go 语言把对内核线程的使用和调度操作都内置到其运行时系统中了。但是, 它远远要比一个线程池复杂得多。Java 线程与内核线程之间关系是 1:1 的。而 Go 语言的Goroutine(可以看做是 Go 语言中执行并发代码块的实体)与内核线程之间的关系是 M:N 的。这让我们可以使用成千上万个 Goroutine 去执行并发代码块而仅仅耗费极少的内核线程。关于Go 并发编程更详细的介绍,大家可以参看我著的“图灵原创”图书《Go 并发编程实战》。
InfoQ:Java 和 Go 语言的使用场景是不是不一样?
郝林:Java 语言与 Go 语言在使用场景方面其实有很多相似之处。例如,它们都适用于服 务端程序的构建,并且可以很容易地编写出页面模板文件。又例如,它们在桌面软件方面都比较捉襟见肘。有意思的是,就本身而言,Go 语言在适用领域的优势更强,而在不适用领域的劣势也更加明显。优势方面我就不再赘述了,下面说说劣势。比如,用 Java 编写桌面程序起码还有Swing 和JavaFX 可选,但是Go 语言官方至今还没有一个成熟的解决方案。当然,这仍旧与诞生时间有关。另外,我们还可以用Java 语言编写Android 应用程序。Go 语言目前虽然已经涉足,但还不完美。不过我在这里爆料一下,我很期待能用Go 语言编写 iOS 应用程序。实际上,Go 语言在这方面已经有所进展了。总之,两种语言在适用领域方面有所重叠但又有些不同。在很多情况下,我们可以混用这两种语言。
InfoQ:现在的开发语言特别多,Java、Go、PHP、Rust、Python 等,你认为未来语言的发展趋势是怎么样的?
郝林:的确,现在的编程语言层出不穷、多如牛毛。但是编程语言的兴衰是有规律可循 的。第一个规律是顺应时代的语言才能有更好的发展。正如 Objective-C 因 iPhone 和 iPad 的诞生而变得火热至极那样。而 Java 也因 Google 公司的“横插一足”而在移动程序开发领域占领了制高点。当今的计算机世界正处于“云”的时代,而从处理器的角度看也正处于多核时代。谁能够更好地把握住这些时代标签,谁就会在发展上更具优势。当然,这里说的“把握住”是需要有真功夫的。只喊不练不起任何作用,而且还会遭人唾弃。第二个规律是能够解决问题的语言就是好语言。对于任何场景都是如此。我相信每个技术团队都会在选择编程语言时进行一番权衡。哪种编程语言能更快更好地解决问题(这也涉及到开发和维护成本),它就肯定会胜出。从这方面看,编程语言并没有好坏之分。它们都必有独特的优势和擅长做的事情,否则就根本不会诞生出来了。而问题的解决能力几乎是发展趋势的唯一评判标准。“多快好省”就是选择编程语言的要诀。这也会从侧面预示一个编程语言的发展趋势。说了这么多,我另一个想要表达的意思是:对于它们的未来,我无法预知。