
作家 | David Cassel开yun体育网
译者 | 深渊
策动 | Tina
本文领先发布于 THENEWSTACK 博客。
在上个月举行的 JVM 峰会上,Java 话语架构师 Brian Goetz 在演讲中 预测 了 Java 的改日发展。
Goetz 探讨的并非 Java 的近况,而是假定的一系列特色——这些特色不是为了编写更好的智力,而是看成一种机制,使话语更具可成长性和可彭胀性。”
简而言之,Goetz 先容了他如何看待 Java 话语的演变。
Goetz 说,“我花了好多时辰谋划其他话语的作念法。咱们以为,对于应该如何鼓励这项责任,咱们当今仍是有了一个十分澄清的意志。”
伸开剩余89%在 Reddit 上,Goetz 将他的演讲刻画为“述说可能的发展处所”。当前还莫得厚爱的 Java 增强提案,他暗意,“这骨子上是咱们第一次属目谋划这个问题。总要从某个地方首先。”
这是一个绝佳的契机,不仅能见证编程话语的演变经由,更能窥见推动这些有经营背后的深重形而上学。
1“可成长”话语的形而上学
在演讲首先时,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 的幻灯片上有这么一句话,“有东谈主会说这太过分了,有东谈主会说这还不够。”
“而咱们便是这么知谈咱们……偶合在中间。”
2在 Java 中引入一个新主张:Witness
那么这个新理念是什么呢?Java 的阵势界说接口被称为“行径蓝图”。Goetz 暗意,当今“咱们但愿杀青接口的统共功能——将一组定名行径归入定名汇注(named bundle),用于声明某种类型或某组类型(并允许编译器进行类型查验)。“
这里有一个要道的阔别:Java 话语设想团队但愿它是对于类型的,而不是类型实例。
有一张幻灯片解释说,“咱们思将这种行径振荡到第三方 witness 对象上”。
为此,只需提议加多一个浅薄径直的要道字——一个 witness字面量。这么一来:
就酿成:
其后,Goetz 向听众解释说,“在 Java 中添加类型类,只需在现存的话语结构(如接口、字段和阵势)上添加相对较少的内容——一个发布 witness 的机制和一个查找 witness 的机制。”
为什么不径直界说包含统共所需阵势的接口,然后让类杀青阿谁接口呢?Goetz 指出,事实解说这种概括表情并不老是有用,它会让话语设想者靠近多量辣手的领域情况和“陷坑”。。
Goetz 的下一张幻灯片解释说,这是“果真用错了器具。”
“咱们需要某种与接口相似但又不完全交流的东西。”Haskell 有类型类(“对类型自己进行概括,而不是类型的行径”),而 C# 和 Kotlin 皆在“进行他们我方的一系列探索”。C# 社区冷漠了雷同的东西:shape 和 extension。
“统共这些皆是围绕归拢个问题,那便是:如何概括类型的行径,而不把它看成类型界说的一部分?”
3发展机遇:潜在的新 Java 特色
Goetz 说,这个思法仍是迭代了许屡次,“咱们仍是将其索求成更适合 Java 的东西,比之前的一些思法更粗略。”
有一张幻灯片说,“这是对于话语成长的”。Goetz 看到了“可成长性”的巨大后劲,并冷漠了几个新的潜在特色:
新的数值类,但与“原始类型的运行时行径相似”——比如 16 位浮点数。
数学运算符。Goetz 说,对于 Float16 变量来说,使用轮番的加号“就相称好”,而不是单独的阵势。其他话语仍是尝试了这种所谓的“运算符重载”——凭据触及的变量类型,将记号与多个操作相干起来。Goetz 说,这“在某种进度上是话语的雷区……许多话语皆在使用运算符重载时皆遭逢了各式灾难性的问题。”
汇注抒发式,“用于构建雷同序列的结构”,雷同于 C# 中提供的功能。“在圭表层面上,这是一个‘你为什么不径直……’的问题。但这似乎是一条可行的旅途,不像 Java 7 时间的提议那样不行行。”
创建型抒发式(Creational expression)。在创建数组时,元素的值默许老是“null”或零。如若有一个 witness 不错标明何时存在(和不存在)有用的“空缺”值会怎样?Goetz 说,在 Valhalla 技俩中,在运行化数组时添加有用性查验“一直是咱们比拟彷徨的一个特色”,因为他们不思把它添加到 Java 虚构机(VM)中。但“这种阵势不错将该特色保留在话语中,同期又允许特定的类在参与该特色时以是否需要作念独特的责任为依据。因此,这意味着咱们不错将这种行径放到一个合适的地方,这嗅觉很好。”
新的数值类,但与“原始类型的运行时行径相似”——比如 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 说,他思接续这一传统。
4Java 改日发展道路图
在演讲收尾时,Goetz 说,它不仅展示了 witness 的主张,还勾画出了“如何将其用于四个潜在的特色,而这些特色仍是困扰咱们很万古辰了。”
预测改日,Goetz 深信,witness 将“使你约略设想出更好、更丰富的特色,让用户不错作念更多事情的特色。最终,咱们将来也许不再需要设想那么多的话语特色。……从永久来看,但愿咱们约略诈欺这小数来构立功能更丰富的通用库和要求行径等。”
“但短期内,咱们不错用它来提供可彭胀的话语特色,包括东谈主们始终以来一直但愿添加的特色。”
Reddit 上有一位驳倒者其后以至开打趣 说,Goetz 的演讲让他们思起了“龙与地下城”中的法术。“完全有那么一个工夫,我嗅觉 Brian 立时就要施放魔法飞弹了。”
他其后补充说,“这是一次很好且相称意旨的演讲。我但愿这些特色约略杀青。”但 Goetz 的终末一张幻灯片了了地讲明了咱们当前所处的位置。“前几张幻灯片中的例子还不是设想,仅仅思法。”
尽管如斯,在 另一条 Reddit 驳倒 中,Goetz 暗意,Java 设想团队当今有一个让他们“感到激动”的故事,“是以咱们准备共享它。但请阻扰,那仍然是一个故事,还需要 Valhalla 技俩先完成许多事。”
Goetz 的演讲取得了强横的掌声,随后他首先袭取不雅众的发问。首位发问者坦言,他看到了该理念的巨大价值,并称 Goetz 的演讲是“一个十分宽阔的提案,却只需要十分小的语法变更”。
Goetz 的修起?“嘘开yun体育网,别告诉他们!”
发布于:北京市