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公司的“横插一足”而在移动程序开发领域占领了制高点。当今的计算机世界正处于“云”的时代,而从处理器的角度看也正处于多核时代。谁能够更好地把握住这些时代标签,谁就会在发展上更具优势。当然,这里说的“把握住”是需要有真功夫的。只喊不练不起任何作用,而且还会遭人唾弃。第二个规律是能够解决问题的语言就是好语言。对于任何场景都是如此。我相信每个技术团队都会在选择编程语言时进行一番权衡。哪种编程语言能更快更好地解决问题(这也涉及到开发和维护成本),它就肯定会胜出。从这方面看,编程语言并没有好坏之分。它们都必有独特的优势和擅长做的事情,否则就根本不会诞生出来了。而问题的解决能力几乎是发展趋势的唯一评判标准。“多快好省”就是选择编程语言的要诀。这也会从侧面预示一个编程语言的发展趋势。说了这么多,我另一个想要表达的意思是:对于它们的未来,我无法预知:)。
受访嘉宾介绍
郝林,软件工程师,从事软件开发工作9年有余。既搞过企业级软件项目,也堆过互联网软件系统。近期在使用和推广Go语言,著有“图灵原创”图书《Go并发编程实战》,以及在线免费教程《Go语言第一课》和《Go命令教程》 。