Blog chevron_right Java

Venkat Subramaniam 畅谈 Java 创新的幕后故事

discussed his appreciation for little-recognized behind-the-scenes Java innovations that have helped keep Java fresh while maintaining backward compatibility.

3 13 日,Azul 邀请 Java 开发人员、爱好者和 Java Champion 称号获得者齐聚一堂,共同庆祝 Java 诞生 30 周年。众多杰出人士发表了演讲,其中包括作家兼 Java 专家 Venkat SubramaniamVenkat 表达了他对鲜为人知的 Java 幕后创新的欣赏,这些创新帮助 Java 保持了创新的活力,同时又保持了向后兼容性。 

为了纪念 Java 诞生 30 周年,Venkat Subramaniam 讲述了那些在幕后发生的 Java 创新,这些创新没有像其他功能那样受到关注,但却提供了至关重要的功能。如今有超过 200 种编程语言可供选择,Java 开发人员必须推动 Java 不断向前发展。Venkat 表示,Java 方面的创新在过去十年里实际上是在加速进行的。他表示,Java 无法像其他一些语言那样简单地更改其代码规范,因为它拥有太多的活跃用户。  

Venkat 表示,“大约有 1,000 万的用户,也就是程序员在使用 Java。当 1,000 万名程序员使用你的语言,其中大约 100 万人知道你住在何处时,你就必须做出截然不同的决定。” 

Venkat 强调了 Java 的向后兼容性,这一点在保持该语言稳定的同时,也推动了该语言的发展,使其更适合程序员使用。随后,他列举了一些 Java 开发人员在幕后进行创新的例子。 

Invoke Dynamic 

Venkat 讨论了简单的 Runnable 接口,他将其演示为 

runnable.run() 

并将其传递给 use 方法。为了实现 Runnable,他将其用作匿名内部类,这一特性几乎可以追溯到 Java 的起源。 

Venkat 说道,“我们编写了一个匿名内部类。您可以通过以下方式看到这方面的证据…在幕后也是如此,正如您在这一特定示例中看到的那样,我正在查看正在生成的字节码,您可以看到字节码中有一个内部类的 new。在这里您会看到一个美元示例,它是您的匿名内部类。”

JVM 上的其他语言将 Lambda 表达式作为其类中的匿名表达式引入,因为这是当时 Java 在字节码级别提供的一种临时措施。当 Java 想要引入 Lambda 表达式时,其他语言无法直接这样做。 

如果 Java 要在采用函数式编程风格方面变得流行,而它只是实现了匿名内部类,那么 Java 就会创建更多的 Lambda 表达式、更多的匿名类、这些类的更多实例,同时也会产生并需要收集更多的垃圾。 

Venkat 表示,“这就是我非常着迷的地方,我要暂时跑个题,一语双关。” 

他解释说,开发人员当时正在致力于在 JVM 上改进其他语言。其他语言提供了比 Java 更高的灵活性。开发人员当时遇到了很大困难,因为他们试图通过反射来实现那些功能,但这种方式效率低下,且生成了臃肿的代码。因此,他们实现了一项名为 Invoke Dynamic 的功能。 

Invoke Dynamic 让他们能够以更灵活的方式动态调度函数,但需要在字节码级别和 JVM 级别提供构造函数。他们在 Java 7 时期就做到了这一点。而当团队实现 Lambda 表达式时(起步于 Java 7,但后来转向 Java 8),他们在努力实现 Lambda 表达式的过程中遇到了困难,因为需要避免带来过多的低效问题。有人建议,如果我们使用 Invoke Dynamic 会怎么样?Invoke Dynamic 并不是为此目的而实现的。 

Venkat 继续他的演示,用一个函数调度替换了一个匿名内部类,并将 Lambda 源转换为函数,然后通过该特定接口调用它们,但这是通过 Invoke Dynamic 方法实现的。这提高了字节码级别的效率,因为所有这些匿名内部类不会使字节码变得臃肿。这在运行时也提高了效率,因为您不会产生更多的垃圾,因此需要收集的垃圾也就少得多。 

Venkat 说道,“我对这类变化有点好奇,因为我常说,这些变化是你肉眼看不到的。这些变化发生在幕后,但它们的影响巨大。” 

事实上,Venkat 建议 Java 开发人员不要过多谈论这些变化,因为这些变化解决了问题,让开发人员能够专注于享受这些变化带来的好处,而不是抱怨。他说道,“如果某件事做得非常好,我们可能根本不会注意到,而这正是我喜欢他们在这方面所做的事情之一。” 

Venkat 还展示了另外两个幕后创新的示例。要查看这些示例以及他的完整演讲,请访问我们网站的 Duke Turns 30 版块。