2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

给 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:051049
用户头像

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

关注

评论

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

Jetpack Compose漫谈,搞懂这些直接来阿里入职

android 程序员 移动开发

Jetpack一统江湖!一个月彻底修改你的App架构!,Android技术图谱

android 程序员 移动开发

Kvrocks 2.0.4 发布

Kvrocks

c++ redis Redis 协议 storage

Jetpack MVVM七宗罪 之三 :在 onViewCreated 中请求数据

android 程序员 移动开发

JetPack系列——Navigation(一),flutter安装androidsdk

android 程序员 移动开发

HashMap 源码解析二、put 相关函数,android原生开发教程

android 程序员 移动开发

Hook 技术初探,【2021Android最新学习路线

android 程序员 移动开发

🍃【Spring专题】「实战系列」重新回顾一下Spring框架的异步执行调用的原理和实战

码界西柚

spring 异步编程 异步调度 11月日更

万字解读鸿蒙轻内核物理内存模块

华为云开发者联盟

鸿蒙 内存 虚拟内存 物料内存 内存页

Jetpack之Paging,android面试自我介绍

android 程序员 移动开发

Gson 解析 Json 容错才是关键,举几个常用的实例!,android开发视频百度网盘

android 程序员 移动开发

HTTPS详解,谈谈我认为的高级Android开发到底应该是怎样的

android 程序员 移动开发

IOC架构设计之控制反转和依赖注入(一),2021大厂Android面试经验

android 程序员 移动开发

Jetpack之DataBinding,2021Android最新大厂面试真题

android 程序员 移动开发

Groovy脚本基础全攻略,重磅

android 程序员 移动开发

javascript中的原型与对象(一),12个View绘制流程高频面试题

android 程序员 移动开发

Jetpack一统江湖!一个月彻底修改你的App架构!(1),kotlin协程源码分析

android 程序员 移动开发

Java虚拟机相关面试题(1),整理出Android逆向系列学习进阶视频

android 程序员 移动开发

Jetpack_Data Binding入门指南,这些新技术你们都知道吗

android 程序员 移动开发

Gradle多维度使用,h5开发移动端

android 程序员 移动开发

IT-架构师绝对不能错过的-34-技术知识图谱帮你轻松拿下大厂offer

android 程序员 移动开发

Java虚拟机相关面试题,android系统开发面试

android 程序员 移动开发

Java泛型,安卓面试项目经验

android 程序员 移动开发

Java面试题八:抽象类和接口的区别,移动端开发技术创新

android 程序员 移动开发

Handler源码分析之二 异步消息的处理,2021金三银四面试季

android 程序员 移动开发

IOC架构设计之Dagger2架构设计(三),进阶加薪全靠它

android 程序员 移动开发

IT圈的“年龄歧视”,移动互联网app开发实例

android 程序员 移动开发

JVM如何实现线程同步,干货精讲

android 程序员 移动开发

Jetpack Compose初体验,flutter游戏开发

android 程序员 移动开发

Jetpack架构组件库-LiveData实战与应用-总有适合你的方案

android 程序员 移动开发

Jetpack系列(三) — LiveData,大厂Android面试总结+详细解答

android 程序员 移动开发

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