「如何实现流动式软件发布」线上课堂开课啦,快来报名参与课堂抽奖吧~ 了解详情
写点什么

Java 20 年:转角遇到 Go

2015 年 5 月 24 日

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 命令教程》 。

2015 年 5 月 24 日 23:0214616
用户头像
郭蕾 关注我视频号:极客时间小盖

发布了 218 篇内容, 共 117.3 次阅读, 收获喜欢 146 次。

关注

评论

发布
暂无评论
发现更多内容

注册中心Eureka源码解析

李浩宇/Alex

星环科技作为信通院隐私计算联盟成员亮相2020数据资产管理大会

星环科技

大数据

浅谈优秀工程师的成长因素

数据社

程序员 七日更

bit位操作及其算法应用

Skysper

算法 位运算

区块链发展的3个必经阶段究竟是什么

CECBC区块链专委会

去中心化

面试被问:JDBC底层是如何连接数据库的?

田维常

JDBC

亚马逊 CTO 预测 2021 将改变世界的八大技术趋势:云加速向边缘推进

亚马逊云科技 (Amazon Web Services)

云计算 AWS

【mybatis-plus】什么是乐观锁?如何实现“乐观锁”

Java架构师迁哥

第十周课后练习

陈浩

极客大学架构师训练营

Presto入门

HQ数字卡

presto 七日更

北漂七年Java开发的一路辛酸史:面试腾讯、阿里、美团、字节后的一点心得

Java架构之路

Java 程序员 架构 面试 编程语言

微服务网关的技术架构

积极&丧

大厂offer直通车:并发编程28题+JVM21题+Redis 16题+Java集合22题

Java架构之路

Java 程序员 架构 面试 编程语言

京东技术解密

田维常

京东

第五周学习心得

cc

金融知识图谱的构建与应用

DataFunTalk

AI 知识图谱

如何使用数据仓库?

数据社

数据仓库 七日更

TypeScript | 第六章:理解声明合并,以及编写声明文件

梁龙先森

typescript 前端 七日更

Spring源码高级笔记之——Spring AOP应用

Java架构师迁哥

一个月吃透这份阿里高级专家的《Java500道面试手册》成功拿下了腾讯offer!

Java架构之路

Java 程序员 架构 面试 编程语言

2021年阿里、腾讯、百度、华为、京东、美团和滴滴最新Java面试题汇集!

Java架构之路

Java 程序员 架构 面试 编程语言

第五周命题作业

cc

第五周作业

胡益

“区块链+”产业生态雏形已现 安全监管逐步完善

CECBC区块链专委会

区块链 区块链生态

华为大佬亲自手码Dubbo服务暴露源码解析!这次够清楚了吧

比伯

Java 编程 架构 程序人生 计算机

科技抗疫,少年可期,为这群有AI的天使开发者疯狂打call

华为云开发者社区

人工智能 华为云 modelarts 医疗AI 对象存储服务OBS

久等了,Rancher 2.5中文文档新鲜出炉

RancherLabs

容器 k8s

史上最全1000道Java高频面试题:集合、IO流、多线程、网络、算法、Git、设计模式、springboot

Java架构之路

Java 程序员 架构 面试 编程语言

职责链模式

soolaugust

设计模式 七日更 职责链模式

第十周学习总结

陈浩

极客大学架构师训练营

分布式缓存架构设计和一致性HASH

我们新四军不拿群众一针一线

Java 20年:转角遇到Go-InfoQ