BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

给JVM加上长程跳转、尾调用和元组

| 作者 Geoffrey Wiseman 关注 0 他的粉丝 ,译者 高昂 关注 0 他的粉丝 发布于 2007年9月27日. 估计阅读时间: 4 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

John Rose在今年夏季撰写了一系列文章,Charles Nutter称这些是“与JVM未来发展方向以及一系列新版Java潜在变化相关的令人兴奋的文章。”虽然John确实谈到对Java语言的影响,但文中的重点是虚拟机。这些改进对于在JVM中为其他语言提供支持来说都是非常重要的,包括函数性语言和动态语言在内。

在文章的开头,John Rose描述了长程跳转(longjump)特性(或称为非本地退出,non-local exit),这项特性使在Java语言中实现闭包成为可能。如果给异常处理机制加上预分配(如克隆)的跟踪栈,就有可能实现非本地退出,而不必为了流程控制支付高昂的异常处理的代价。如果实现得好,非本地退出的代价可以低于本地退出/返回(return)的3倍,并能够被优化成机器级的goto指令。在Java 7的一个版本中,就用了这种方法来优化Object.clone()的执行成本

接下来,John阐述了JVM中的尾调用(tail call):即以一种明确的方式来来压缩尾递归的能力(“硬尾调用”),或仅作为一种编译器最优化(“软尾调用”)。这篇文章引起了对实现方法和用途的热烈讨论,不过尾调用对JVM上的函数性语言(或具备某些函数性特征的语言)肯定有所帮助,也会有利于从invokedynamic (JSR-292)得益的动态语言:

尾调用也会影响到invokedynamic。硬尾调用让你在实现动态调用上有更多的选择:你可以转向到一段负责派发的分支例程,该例程随后会以尾调用返回到正常的例程上。(实际上,这就是java.lang.reflect.Method.invoke目前的工作原理,至少在返回值没有被装箱的情况下是如此。)因为Scheme是一种动态语言,所以尾调用与JSR 292有一点关系。

最后,John谈到了元组(Tuple)。他翻出了早在2004年就提出的一个提议,里面描述了“纯粹的”元组类型(简单元组)和具备元组语义的值类(value class),这种值类不需要记得它的类型身份(即成为标记元组,tagged tuples)。元组也意味着支持具有多个返回值的方法。再一次,重点在于JVM而不是Java语言是很清楚的:

加上了元组特性的语言,很可能会在一组具有类型的值,以及指向这些值所在堆对象的引用之间提供规范的翻译。比方说,每个值类很可能都有一个构造器,其参数签名就是相应的标记元组。元组很可能被实现成堆中的固定长度的对象数组,或者是不可变的泛型工具类(generic immutable utility class),里面包含着装箱后的基本类型值成员(就像varargs中一样)。

这篇文章的讨论也一样很热烈,John在讨论中回应说:

实际上在Java语言中加入值类会遇到困难的设计问题,正如你清楚指出的那样。我写此文的意图是指出,在JVM中添加元组是非常简单的,并且不需要解决语言设计方面的问题。

你对这些提议有没有共鸣呢?你是更想看到JVM增加对其他语言的支持,还是Java语言的演进?还是说这两个目标并没有冲突?InfoQ会继续跟踪这些主题的最新发展。

看英文原文:Longjumps, Tailcalls, Tuples for the JVM

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

jvm应当增加对其他语言的支持 by zane dennis

java语言本身以简洁和优雅著称,硬要在上面套一层函数式语言语法,相当地丑陋(例如讨论中的闭包语法)。在jvm层次上,如.net平台那样支持多种语言应该是更好的选择,想象某天在JVM上面跑Lisp。

Re: jvm应当增加对其他语言的支持 by 霍 泰稳

JRuby、Jython不都是在JVM之上的吗?应该说.NET的CLR借鉴了JVM的运行机制。

Re: jvm应当增加对其他语言的支持 by Chen Yufei

JVM 上运行的 Lisp 实现早就已经有了。

Common Lisp 有 Armed Bear Common Lisp(还不太完善);Scheme 有 JScheme(最初是由 Peter Norvig 实现的)。

Re: jvm应当增加对其他语言的支持 by Guo Xiaogang

确实没必要硬把Java扭成Cpp一样的怪胎,多下些功夫看怎样能方便多语言混合编程更好。

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

4 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT