Java 20年:转角遇到Go

1995年,横空出世的Java语言以其颠覆式的特性迅速得到了开发者的关注。跨平台、垃圾回收面向对象,这在当时都是难以想象的事情,而Java却完美地在一门语言中实现了这一特性。能够说,Java将编程语言设计带领到一个新的高度。20年后的今天,当年的那些新特性已经再也不是什么新鲜词。同时,又会有一些新的语言宣称本身有一些颠覆性的特性,其中Go语言就是新语言的一个表明,它部署简单、并发性好,在语言设计上确实优于Java。为了了解Java和Go语言的发展示状与趋势,InfoQ采访了Go语言大牛郝林。php

  InfoQ:今年的5月23日是Java的第20岁生日,转眼间,Java已经走过了20年,版本号也已经更新到Java 8。你怎么看Java这门语言?在这20年里,有哪些对你印象比较深入的Java事件?html

郝林:我以为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语言?app

郝林:这就是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命令教程》 。

相关文章
相关标签/搜索