Java 语言架构师 Brian Goetz 谈 Java 可能如何演变
Source: InfoQ - Backend
本文最初发布于THENEWSTACK博客。

在上个月举行的JVM峰会上,Java语言架构师Brian Goetz"在演讲中展望"了Java的未来发展。
Goetz探讨的并非Java的现状",而是假设的一系列特性——这些特性不是为了编写更好的程序,而是作为一种机制,使语言更具可成长性和可扩展性。”
简而言之,Goetz介绍了他如何看待Java语言的演变。
Goetz说,“我花了很多时间研究其他语言的做法。我们觉得,对于应该如何推进这项工作,我们现在已经有了一个相当清晰的认识。”
在Reddit上,Goetz将他的演讲描述为“陈述可能的发展方向"”。目前还没有正式的Java增强提案,他表示,“这实际上是我们第一次详细讨论这个问题。总要从某个地方开始。”
这是一个绝佳的机会,不仅能见证编程语言的演变历程,更能窥见推动这些决策背后的深邃哲学。
“可成长”语言的哲学
在演讲开始时,Goetz强调,他不是要谈论“计划立即交付的特性”。相反,他将看一些长远来看“更具启发性的例子”。Goetz将演讲标题定为“Java语言的成长(Growing the Java Language)”是有原因的。Goetz记得,1998年,Sun Microsystems计算机科学家Guy Steele"发表过一篇著名的论文(和演讲"),标题是“一门语言的成长(Growing a Language)”。
Goetz说,Steele发出了“一个行动号召,要求语言设计者将可成长性作为编程语言设计的核心维度之一。”
虽然许多语言允许用户通过用户创建的库来扩展“词汇”,但Steele指出,如果新词汇看起来与语言自己的基本“原语”不同,那无疑会增加困难。Goetz说,“在很多方面,这篇论文是Valhalla项目的发令枪”——这是一个始于2014年的OpenJDK项目,由Goetz领导,旨在孵化新的Java语言特性。
因此,Goetz想要描述的不是Java的新特性,而是一种语言演变哲学——在添加新的Java特性"时优先考虑可扩展性——及其实现机制。Goetz的幻灯片上有这样一句话,“有人会说这太过分了,有人会说这还不够。”
“而我们就是这样知道我们……正好在中间。”
在Java中引入一个新概念:Witness
那么这个新理念是什么呢?Java的方法定义接口被称为“行为蓝图"”。Goetz表示,现在“我们希望实现接口的所有功能——将一组命名行为归入命名集合(named bundle),用于声明某种类型或某组类型(并允许编译器进行类型检查)。“
这里有一个关键的区别:Java语言设计团队希望它是关于类型的,而不是类型实例。
有一张幻灯片解释说,“我们想将这种行为转移到第三方witness对象上”。
为此,只需提议增加一个简单直接的关键字——一个witness字面量。这样一来:
public static final Comparator COMPARATOR =
就变成:
public static final witness Comparator COMPARATOR =
后来,Goetz向听众解释说,“在Java中添加类型类,只需在现有的语言结构(如接口、字段和方法)上添加相对较少的内容——一个发布witness的机制和一个查找witness的机制。”
为什么不直接定义包含所有所需方法的接口,然后让类实现那个接口呢?Goetz指出,事实证明这种抽象方式并不总是有效,它会让语言设计者面临大量棘手的边界情况和“陷阱”。。
Goetz的下一张幻灯片解释说,这是“真的用错了工具。”
“我们需要某种与接口相似但又不完全相同的东西。”Haskell有类型类(“对类型本身进行抽象,而不是类型的行为”),而C#和Kotlin都在“进行他们自己的一系列探索”。C#社区提出了类似的东西:shape和extension"。
“所有这些都是围绕同一个问题,那就是:如何抽象类型的行为,而不把它作为类型定义的一部分?”
发展机遇:潜在的新Java特性
Goetz说,这个想法已经迭代了许多次,“我们已经将其提炼成更符合Java的东西,比之前的一些想法更简洁。”
有一张幻灯片说,“这是关于语言成长的”。Goetz看到了“可成长性”的巨大潜力,并提出了几个新的潜在特性:
新的数值类,但与“原始类型的运行时行为一样”——比如16位浮点数。数学运算符。Goetz说,对于Float16变量来说,使用标准的加号“就非常好”,而不是单独的方法。其他语言已经尝试了这种所谓的“运算符重载”——根据涉及的变量类型,将符号与多个操作关联起来。Goetz说,这“在某种程度上是语言的雷区……许多语言都在使用运算符重载时都遭遇了各种灾难性的问题。”集合表达式,“用于构建类似序列的结构”,类似于C#中提供的功能"。“在规范层面上,这是一个‘你为什么不直接……’的问题。但这似乎是一条可行的路径,不像Java 7时代的提议那样不可行。”创建型表达式(Creational expression)。在创建数组时,元素的值默认总是“null”或零。如果有一个witness可以表明何时存在(和不存在)有效的“空白”值会怎样?Goetz说,在Valhalla项目中,在初始化数组时添加有效性检查“一直是我们比较犹豫的一个特性”,因为他们不想把它添加到Java虚拟机(VM)中。但“这种方法可以将该特性保留在语言中,同时又允许特定的类在参与该特性时以是否需要做额外的工作为依据。因此,这意味着我们可以将这种行为放到一个合适的地方,这感觉很好。”
多功能语言扩展并非没有先例。Goetz提到了两个早期的“使用库扩展语言特性的著名例子”——foreach循环和try。开发者只需实现Iterable类就可以使用foreach特性。(Goetz说,为了实现Iterable,JDK的开发者随后“对许多类进行了改造”——其他Java开发者也这样做了。)但最重要的是,它看起来就像是“内置的”。
Goetz很高兴Java"没有将该特性限制在少数几个显而易见的用例(如列表、映射和集合)中。“我真的很高兴有人站起来说,‘不,不,除了少数魔法类之外,其他类能够参与其中真的很重要。’”
Goetz说,他想延续这一传统。
Java未来发展路线图
在演讲结束时,Goetz说,它不仅展示了witness的概念,还勾勒出了“如何将其用于四个潜在的特性,而这些特性已经困扰我们很长时间了。”
展望未来,Goetz相信,witness将“使你能够设计出更好、更丰富的特性,让用户可以做更多事情的特性。最终,我们将来也许不再需要设计那么多的语言特性。……从长远来看,希望我们能够利用这一点来构建功能更丰富的通用库和条件行为等。”
“但短期内,我们可以用它来提供可扩展的语言特性,包括人们长期以来一直希望添加的特性。”
Reddit上有一位评论者后来甚至开玩笑说",Goetz的演讲让他们想起了“龙与地下城”中的法术。“绝对有那么一个时刻,我感觉Brian马上就要施放魔法飞弹了。”

他后来补充说,“这是一次很好且非常有趣的演讲。我希望这些特性能够实现。”但Goetz的最后一张幻灯片清楚地说明了我们目前所处的位置。“前几张幻灯片中的例子还不是设计,只是想法。”

尽管如此,在另一条Reddit评论"中,Goetz表示,Java设计团队现在有一个让他们“感到舒适”的故事,“所以我们准备分享它。但请注意,那仍然是一个故事,还需要Valhalla项目先完成许多事。”
Goetz的演讲赢得了热烈的掌声,随后他开始接受观众的提问。首位提问者坦言,他看到了该理念的巨大价值,并称Goetz的演讲是“一个相当宏大的提案,却只需要相当小的语法变更”。
Goetz的回应?“嘘,别告诉他们!”
声明:本文为InfoQ翻译,未经许可禁止转载。
原文链接:https://thenewstack.io/java-language-architect-brian-goetz-on-how-java-could-evolve"