13426109659
webmaster@21cto.com

Java 语言架构师 Brian Goetz 谈 Java 如何发展

编程语言 0 37 1天前
精选图片:Java 语言架构师 Brian Goetz 谈 Java 如何发展

导读:Java似乎在寻求变革,这和它在Oracle的团队人员有关系。

Java 架构师布莱恩·戈茨(Brian Goetz)分享了他对更具“可增长性”编程语言的长期愿景,引入了“见证人”的概念来实现更强大的新功能。

这源于他近日在 JVM 峰会上发表了一场演讲,展望了 Java 的未来

Goetz 讨论的不是我们现在拥有的 Java,而是一组假设的“功能集合,这些功能的设计目的不是用来编写更好的程序,而是作为一种使语言更具成长性和可扩展性的机制”。

简言之,Goetz 解释了他如何看待 Java 语言的发展。

“我花了很多时间研究其他语言的做法,”戈茨说,“我们觉得现在已经到了一定阶段,对于如何实现这一目标已经有了相当清晰的想法。”

在 Reddit 上,Goetz 将他的演讲描述为“可能的方向声明”。目前还没有正式的 Java 增强提案,而且“这实际上是我们第一次详细讨论这个问题,但总得有个着手点。”

但这是一个令人着迷和兴奋的机会,不仅可以看到编程语言如何变化,还可以了解促使这些决策的深思熟虑的哲学。

“可增长”语言的哲学


在演讲伊始,Goetz 就强调他并非在谈论“我们计划立即实现的功能”。相反,他着眼于长远发展,着眼于“更具激励性的示例”。Goetz 将他的演讲题目定为“发展 Java 语言”,这其中有着感动至深的原因。Goetz 说还记得 Sun Microsystems 计算机科学家盖伊·斯蒂尔(Guy Steele)在 1998 年发表的一篇著名论文(包括演讲),题为“发展一门语言”。

戈茨表示,斯蒂尔“呼吁语言设计者将可增长性视为编程语言设计的核心”。

虽然许多语言允许用户通过用户创建的库来扩展“词汇表”,但 Steele 强烈指出,如果这些新词汇表与语言自身的基本“原语”不同,扩展起来就会更加困难。

Goetz 说:“从很多方面来看,这篇论文可以说是 Valhalla 项目的发令枪。”这个称为Valhalla 的项目,是一个 OpenJDK 项目,于 2014 年启动,旨在孵化新的 Java 语言特性,由 Goetz 领导。

因此,Goetz 想要描述的不仅仅是一个 Java 新功能,更是一种语言演进哲学,即在添加新Java 功能时优先考虑可扩展性,以及实现这一目标的机制。“有人会说这太过头了,”Goetz 的幻灯片上有一个要点写道。“有人会说这还不够。”

“这就是我们知道我们……正处于中间的原因。”

引入“见证人”:Java 的新概念


那么新想法是什么呢?Java 的方法定义接口被称为“行为蓝图”。

Goetz 建议现在“我们想要做接口能做的所有事情——获取一组命名的行为,并将它们分组到一个命名包中,你可以声明这个类型符合这个包,或者这组类型符合这个包(并且允许编译器进行类型检查)。”

所以,有了一个关键的区别——Java 语言设计团队希望它关注的是类型,而不是类型的实例。

图片

“我们希望将这种行为转移到第三方见证对象上,”他的一张幻灯片如此解释道。

所提出的是一个简单、直接的关键词——证人文字(以及“传唤”证人的能力,Goetz 说,“仅仅通过说出证人类型”)。

所以…

public static final Comparator  COMPARATOR=

将变成……

public static final witness Comparator COMPARATOR =

戈茨随后向听众详细阐述道:“我们可以通过在 Java 语言中添加相对较少的内容来为 Java 添加类型类——一种发布证人的机制和一种查找证人的机制——我们可以利用现有的语言结构,如接口、字段和方法。”

为什么不直接定义包含所有所需方法的接口,然后让类实现该接口呢?Goetz 说,事实证明,这种抽象方式并不总是有用的,语言设计者面临着许多棘手的极端情况和“陷阱”。

戈茨在下一张幻灯片中解释说,这“确实是使用了错误的工具”。

“我们需要一些与接口类似但不完全相同的东西。” Haskell 语言有类型类它“抽象类型,而不是类型的行为”),而 C# 和 Kotlin“都在对此进行各自的探索”。C# 社区提出了类似的东西,称为形状和扩展

“所有这些都围绕着同一个难题展开。那就是:如何抽象类型的行为,而不将其作为类型定义的一部分?”

增长机会:潜在的 Java 新特性


戈茨说,这个想法经过多次迭代,但“我们已经将其提炼成比我们之前的一些想法更适合 Java 的东西。”

其中一张幻灯片上还写道:“这关乎语言的成长。”Goetz 看到了“可成长性”的巨大潜力——并提出了几个新的潜在功能:

  • 新的数字类,但“具有原语的运行时行为”——例如 16 位浮点数。
  • 数学运算符。Goetz表示,使用标准加号来表示 Float16 变量“会非常好”,而不是使用单独的方法。其他语言也尝试过这种所谓的“运算符重载”——根据所涉及的变量类型,将符号与多个操作关联起来。Goetz 表示,这“有点像语言雷区……许多语言都因运算符重载而引发了各种各样的灾难。”
  • 集合表达式“用于构建类似序列的结构”,类似于C# 中提供的功能。“这处于‘为什么不’的规范层面。但这似乎是一条可行的途径,而 Java 7 时代的提案并不是一条可行的途径。”
  • 创建表达式。如今创建数组时,其元素的默认值始终为“null”或零。如果有一个见证者可以指示何时存在(以及不存在)有效的“空”值,会怎么样?Goetz 表示,在 Valhalla 项目中,在初始化数组时添加有效性检查“是我们一直不太确定的一个功能”,因为他们不想将其添加到 Java 的虚拟机 (VM) 中。但“这是一种将该功能保留在语言中的方法,但允许给定的类根据其是否完成了一些额外的工作来参与该功能。所以这意味着我们可以将这种行为放在正确的位置,这感觉很好。”


多用途语言的新增功能并非史无前例。Goetz 之前曾介绍过两个“旨在通过库扩展的语言特性的显著示例”—— foreach循环和try 。开发人员只需实现Iterable类即可使用foreach特性。(Goetz 表示,JDK 的开发人员随后“改造了一堆类来实现 iterable”——其他 Java 开发人员也这么做了。)但最重要的是,它“看起来像是内置的”。

Goetz 很高兴Java没有将该功能限制在少数几个显而易见的用例上(比如listmapset)。“我很高兴有人站出来说:‘不,不,除了这几个神奇的类之外,其他类也应该能够参与其中,这真的很重要。’”

戈茨说他想延续这一传统。

Java 未来发展路线图


在演讲将结束时,戈茨表示,它不仅展示了证人的想法,还概述了“我们将如何将其用于困扰我们很长时间的四个潜在功能”。

展望未来,Goetz 认为见证“能够让你设计出更好的功能、更丰富的功能、用户可以做更多事情的功能,最终也许我们将来就不必设计那么多的语言功能了。……希望从长远来看,我们能够利用这些来构建更丰富的通用库和条件行为以及诸如此类的东西。

“但在短期内,我们可以利用它来提供可扩展的语言功能,包括人们长期以来一直要求的功能。”

后来,一位 Reddit 网友开玩笑说,戈茨的演讲让他们想起了《龙与地下城》里的魔法。“有那么一刻,我真觉得布莱恩好像要施展魔法导弹了。”

Java 语言架构师 Brian Goetz - Reddit 关于 2025 年 JVM 峰会见证人演讲的评论

Reddit 上的这位评论者后来上来补充道:“这是一次精彩有趣的演讲。我希望这些功能能够实现。” 但 Goetz 的最后一张幻灯片清楚地解释了我们的立场。“前面幻灯片中的例子不是设计,而是想法。”

Java 语言架构师 Brian Goetz - Reddit 评论了复杂性,并在 2025 年 JVM 峰会上发表了关于见证人的演讲

不过,在另一条 Reddit 评论中,Goetz 表示 Java 的设计团队现在有了一个他们“满意”的故事,“所以我们准备分享它。但请注意,这仍然是一个故事,还有很多其他在 Valhalla 里的事情需要先发生。”

演讲结束,Goetz 赢得了热烈的掌声,随后他开始邀请观众提问。第一位提问者承认,他们已经看到了这个想法的巨大价值,并称 Goetz 的演讲“虽然是一个相当小的句法变化,却包含着一个真正宏大的提议”。

戈茨的反应是啥?他说:“嘘,别告诉他们!”

作者:洛逸

评论