写点什么

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

  • 2007-09-26
  • 本文字数:1189 字

    阅读完需:约 4 分钟

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

2007-09-26 20:05819
用户头像

发布了 74 篇内容, 共 12.3 次阅读, 收获喜欢 3 次。

关注

评论

发布
暂无评论
发现更多内容

我终于弄懂了Python的装饰器(三)

BigYoung

Python 装饰器

Week5作业

王志祥

极客大学架构师训练营

第五周作业

好名字

架构师师傅在训练营第5周感想

tuuezzy

架构师

如何优雅地运用位运算实现产品需求?

梁桂钊

Java 架构

Java 后端博客系统文章系统——No1

猿灯塔

环信即时通讯云荣获《2020年度云通讯产品创新奖》

DT极客

Go在容器运行时要注意的细节

博文视点Broadview

容器 云原生 Go 语言

【总结】技术选型

小胖子

区块链或将成为整治形式官僚主义的“大杀器”

CECBC

智能合约 去中心 防篡改 服务高效性

第五章作业

小胖子

计算机操作系统基础(十六)---进程同步之共享内存

书旅

php laravel 操作系统 进程 线程’

Java中异常处理的9个最佳实践

码农神说

异常

架构师训练营-第5周总结

坂田吴奇隆

极客大学架构师训练营

我终于弄懂了Python的装饰器(四)

BigYoung

Python 装饰器

Python 中的元类到底是什么?这篇恐怕是最清楚的了

BigYoung

Python python元类

出成绩了!Avaddon勒索病毒劣迹昭著,6月勒索病毒占比TOP 10榜上有名

360安全卫士

勒索病毒

配置类需要标注@Configuration却不知原因?那这次就不能给你涨薪喽

YourBatman

spring Spring Boot Spring Framework @Configuration Spring配置类

官宣 | 千呼万唤,Apache Flink 1.11.0 正式发布啦!

Apache Flink

flink

架构师训练营第五周学习总结

R20114

Python中 *args 和 **kwargs的用法

BigYoung

Python *args **kwargs 缺省参数

Week5总结

王志祥

极客大学架构师训练营

一致性hash

石刻掌纹

我终于弄懂了Python的装饰器(二)

BigYoung

Python 装饰器

你到底在忙啥呢?

池建强

创业 写作

你不知道的 Blob

阿宝哥

Java 大前端 Web Blob

深入理解Java内存模型

itlemon

内存模型 Java内存模型

rc-form源码解读

Lee Chen

大前端

我终于弄懂了Python的装饰器(一)

BigYoung

Python 装饰器

CORS 和 CSRF 修炼宝典

Geek_z9ygea

大前端 Web CORS CSRF

架构师训练营-第5周作业

坂田吴奇隆

极客大学架构师训练营

给JVM加上长程跳转、尾调用和元组_Java_Geoffrey Wiseman_InfoQ精选文章